เกี่ยวกับ
เวอร์ชันเคอร์เนลที่รองรับ
การใช้งาน
API ที่มีอยู่
วิธีการมีส่วนร่วม
ใบอนุญาต
ทีมงานของเรา
Kprofiles เป็นโมดูลเคอร์เนล Linux แบบธรรมดาที่สามารถใช้เพื่อควบคุมกิจกรรมในเคอร์เนล เช่น บูสต์ที่ปกติจะไม่เปิดเผยต่อพื้นที่ผู้ใช้ Kprofiles ทำงานในลักษณะที่มุ่งเน้นโปรไฟล์ ดังนั้นจึงมีโหมดโปรไฟล์สี่โหมด: Disabled
, Battery
, Balanced
และ Performance
แต่ละโหมดจะได้รับการจัดสรรหมายเลขโหมด นักพัฒนาสามารถใช้ฟังก์ชัน Kprofiles API ในเงื่อนไขเพื่อจำกัดหรือเปิดใช้งานงานในเคอร์เนลในโหมดโปรไฟล์บางโหมด (ดูที่ส่วนการใช้งานเป็นตัวอย่าง) Userspace สามารถโต้ตอบกับ Kprofiles ได้โดยการปรับหมายเลขโหมดใน /sys/kernel/kprofiles/kp_mode
ตารางด้านล่างแสดงหมายเลขโหมดที่สอดคล้องกับโหมดโปรไฟล์
โหมดโปรไฟล์ | หมายเลขโหมด |
---|---|
ปิดการใช้งาน (ค่าเริ่มต้น) | 0 |
แบตเตอรี่ | 1 |
สมดุล | 2 |
ผลงาน | 3 |
นอกจากนี้ Kprofiles ยังมีตัวเปลี่ยนโปรไฟล์อัตโนมัติ (Kprofiles อัตโนมัติ) ซึ่งใช้ FB notifier
MSM DRM notifier
หรือ MI DRM notifier
เพื่อบังคับใช้โหมดโปรไฟล์แบตเตอรี่เมื่อหน้าจอของอุปกรณ์ดับลง และสลับกลับไปยังโหมดที่ใช้งานก่อนหน้านี้เมื่ออุปกรณ์กลับมาทำงานอีกครั้ง ผู้ใช้สามารถปิดการใช้งานหรือเปิดใช้งานคุณสมบัตินี้ในขณะรันไทม์โดยไม่ต้องคอมไพล์เคอร์เนลใหม่โดยการเปลี่ยนค่าบูลใน /sys/module/kprofiles/parameters/auto_kp
Kprofiles ยังมีฟังก์ชัน API สำหรับการสลับโปรไฟล์เพื่อตอบสนองต่อเหตุการณ์ในเคอร์เนล สำหรับข้อมูลเพิ่มเติม โปรดดูตาราง API ที่พร้อมใช้งาน
Kprofiles ได้รับการทดสอบบนเคอร์เนล Linux 3.10+
หากคุณใช้ git
แนะนำให้ใช้ git subtree
หรือ git submodule
เพิ่มที่เก็บนี้ไปยัง drivers/misc/kprofiles
แก้ไข drivers/misc/Kconfig
เมนู "อุปกรณ์เบ็ดเตล็ด" แหล่งที่มา "ไดรเวอร์ / อื่น ๆ / genwqe / Kconfig" + แหล่งที่มา "ไดรเวอร์ / อื่น ๆ / kprofiles / Kconfig" แหล่งที่มา "ไดรเวอร์ / อื่น ๆ / echo / Kconfig" เมนูท้าย
แก้ไข drivers/misc/Makefile
obj-$(CONFIG_GENWQE) += genwqe/+obj-$(CONFIG_KPROFILES) += kprofiles/obj-$(CONFIG_ECHO) += เสียงก้อง/
กำหนดฟังก์ชัน api ที่คุณต้องการในไฟล์ที่ต้องการโดยใช้ extern Kprofiles สามารถใช้ได้ในหลายที่ เช่น การบูสต์ไดรเวอร์ ด้านล่างนี้เป็นตัวอย่างของการใช้ kprofiles ใน kernel/fork.c เพื่อควบคุม cpu และ ddr boosts ในระหว่าง zygote forking โดยใช้ kp_active_mode () เอพีไอ
+ #ifdef CONFIG_KPROFILES+ ภายนอก int kp_active_mode (โมฆะ);+ #endif/* * ตกลง นี่คือกิจวัตรการส้อมหลัก - * จะคัดลอกกระบวนการ และหากเริ่มต้นได้สำเร็จ * และรอให้ใช้ VM เสร็จสิ้นหากจำเป็น - long _do_fork (clone_flags แบบยาวที่ไม่ได้ลงนาม stack_start แบบยาวที่ไม่ได้ลงนาม stack_size แบบยาวที่ไม่ได้ลงนาม int __user *parent_tidptr, int __user *child_tidptr, tls แบบยาวที่ไม่ได้ลงนาม) - struct Task_struct *p; การติดตามภายใน = 0; หมายเลขยาว; /* เพิ่ม CPU ให้สูงสุดเป็นเวลา 50 ms เมื่อ userspace เปิดแอป */ ถ้า (task_is_zygote (ปัจจุบัน)) {- cpu_input_boost_kick_max (50); - devfreq_boost_kick_max (DEVFREQ_MSM_LLCCBW, 50); - devfreq_boost_kick_max (DEVFREQ_MSM_CPUBW, 50);+ #ifdef CONFIG_KPROFILES+ /*+ * เพิ่ม CPU และ DDR สำหรับ 60ms หากโหมดประสิทธิภาพทำงานอยู่+ * เพิ่ม CPU และ DDR เป็นเวลา 50ms หากโหมดเริ่มต้นทำงานอยู่เพื่อรักษาพฤติกรรมเริ่มต้น+ * เพิ่ม CPU & DDR เป็นเวลา 25ms หากเปิดใช้งานโปรไฟล์ที่สมดุล+ * อย่าเพิ่ม CPU & DDR หากเปิดใช้งานโปรไฟล์ประหยัดแบตเตอรี่+ */+ สวิตช์ (kp_active_mode()) {+ กรณี 0:+ cpu_input_boost_kick_max (60);+ devfreq_boost_kick_max(DEVFREQ_MSM_LLCCBW, 50);+ devfreq_boost_kick_max(DEVFREQ_MSM_CPUBW, 50);+ แตก;+ กรณีที่ 2:+ cpu_input_boost_kick_max(60);+ devfreq_boost_kick_max(DEVFREQ_MSM_LLCCBW, 25);+ devfreq_boost_kick_max(DEVFREQ_MSM_CPUBW, 25);+ แตก;+ กรณีที่ 3:+ cpu_input_boost_kick_max(60);+ devfreq_boost_kick_max(DEVFREQ_MSM_LLCCBW, 60);+ devfreq_boost_kick_max(DEVFREQ_MSM_CPUBW, 60);+ แตก;+ ค่าเริ่มต้น:+ pr_info ("โปรไฟล์แบตเตอรี่ใช้งานอยู่, ข้าม Boost...n");+ แตก;+ }+ #else+ cpu_input_boost_kick_max (60);+ devfreq_boost_kick_max(DEVFREQ_MSM_LLCCBW, 50 );+ devfreq_boost_kick_max(DEVFREQ_MSM_CPUBW, 50);+ #endif
และคุณก็พร้อมแล้ว!
ข้อมูล : ฟังก์ชันนี้ส่งคืนตัวเลขตั้งแต่ 0 ถึง 3 ขึ้นอยู่กับโปรไฟล์ที่เลือก สามารถใช้ในสภาวะต่างๆ เพื่อควบคุมบูสต์และสิ่งอื่นๆ
ข้อโต้แย้ง : ไม่มี
ตัวอย่าง :
#include <linux/kernel.h>#include <linux/cpufreq.h>#ifdef CONFIG_KPROFILESextern int kp_active_mode(void);void example_function(void) { // ขึ้นอยู่กับโหมดโปรไฟล์ที่ใช้งานอยู่ ปรับคุณสมบัติเคอร์เนลหรือสวิตช์การตั้งค่า (kp_active_mode()) { กรณีที่ 1: // สิ่งที่ต้องทำเมื่อโปรไฟล์แบตเตอรี่ใช้งานอยู่; กรณีที่ 2: // สิ่งที่ต้องทำเมื่อโปรไฟล์ยอดคงเหลือทำงานอยู่; กรณีที่ 3: // สิ่งที่ต้องทำเมื่อโปรไฟล์ประสิทธิภาพทำงานอยู่ ค่าเริ่มต้น: // สิ่งที่ต้องทำเมื่อ kprofiles ถูกปิดใช้งานหรือโปรไฟล์เริ่มต้นใช้งานอยู่ - }#endif
ข้อมูล : ฟังก์ชั่นนี้สามารถใช้เพื่อเปลี่ยนโปรไฟล์เป็นโหมดที่กำหนดระหว่างเหตุการณ์ในเคอร์เนล
อาร์กิวเมนต์ :
level
:
ประเภท: int ที่ไม่ได้ลงนาม
ความหมาย: หมายเลขโหมดที่จะสลับไป
ตัวอย่าง :
โมฆะ example_function (เป็นโมฆะ) { if (required_kernel_event()) { // สลับไปใช้โปรไฟล์แบตเตอรี่ (โหมด 0) kp_set_mode (1); printk(KERN_INFO "เปลี่ยนเป็นโปรไฟล์แบตเตอรี่ (โหมด 1)n"); } else { // สลับไปที่โปรไฟล์ที่สมดุล (โหมด 1) kp_set_mode(2); printk(KERN_INFO "เปลี่ยนเป็นโปรไฟล์ที่สมดุล (โหมด 2)n"); - -
ข้อมูล : ฟังก์ชันนี้สามารถใช้เพื่อเปลี่ยนโปรไฟล์เป็นโหมดที่กำหนดในช่วงเวลาที่กำหนดระหว่างเหตุการณ์ในเคอร์เนล จากนั้นกลับสู่โหมดที่ใช้งานก่อนหน้านี้
อาร์กิวเมนต์ :
level
:
ประเภท : int ที่ไม่ได้ลงนาม
ความหมาย : หมายเลขโหมดที่จะสลับไป
duration_ms
:
ประเภท : int ที่ไม่ได้ลงนาม
คำจำกัดความ : ระยะเวลา (เป็นมิลลิวินาที) ที่โหมดที่ระบุควรเปิดใช้งานก่อนที่จะเปลี่ยนกลับเป็นโหมดที่ใช้ก่อนหน้านี้
ตัวอย่าง :
โมฆะ example_function (เป็นโมฆะ) { if (required_kernel_event()) { // สลับไปที่โปรไฟล์ประสิทธิภาพ (โหมด 3) เป็นเวลา 50ms kp_set_mode_rollback (3, 50); printk(KERN_INFO "เปลี่ยนเป็นโปรไฟล์ประสิทธิภาพเป็นเวลา 50msn"); - -
ข้อมูล : ตัวแจ้งเตือนเหตุการณ์พื้นฐานนี้เปิดใช้งานการดำเนินการตามลำดับของโค้ดทันทีที่โหมดโปรไฟล์ถูกเปลี่ยนผ่านผู้ใช้หรือ API ในเคอร์เนล สิ่งนี้อาจเป็นประโยชน์สำหรับการดำเนินงานชุดต่างๆ ในลักษณะซิงโครไนซ์หลังจากการเปลี่ยนโหมด
ตัวอย่าง :
extern int ที่ไม่ได้ลงนาม KP_MODE_CHANGE; extern int kp_notifier_register_client (struct notifier_block *nb); extern int kp_notifier_unregister_client (struct notifier_block *nb); int แบบคงที่ kp_mode_notifier_callback (struct notifier_block * nb, เหตุการณ์แบบยาวที่ไม่ได้ลงนาม, เป็นโมฆะ * data) { int profile_mode ที่ไม่ได้ลงนาม = (int ที่ไม่ได้ลงนาม) ข้อมูล; if (เหตุการณ์ == KP_MODE_CHANGE) { สวิตช์ (profile_mode) { กรณีที่ 1: // สิ่งที่ต้องทำเมื่อโปรไฟล์แบตเตอรี่ใช้งานอยู่; กรณีที่ 2: // สิ่งที่ต้องทำเมื่อโปรไฟล์ที่สมดุลทำงานอยู่ กรณีที่ 3: // สิ่งที่ต้องทำเมื่อโปรไฟล์ประสิทธิภาพทำงานอยู่ ค่าเริ่มต้น: // สิ่งที่ต้องทำเมื่อ kprofiles ถูกปิดใช้งานหรือโปรไฟล์เริ่มต้นใช้งานอยู่ - } ส่งคืน NOTIFY_OK; } โครงสร้างคงที่ notifier_block kp_mode_notifier = { .notifier_call = kp_mode_notifier_callback, }; int แบบคงที่ __init example_driver_init (เป็นโมฆะ) { // ลงทะเบียนโมดูลไดรเวอร์เป็นไคลเอนต์ของตัวแจ้งเตือนเหตุการณ์ Kprofiles kp_notifier_register_client(&kp_mode_notifier); กลับ 0; } โมฆะคงที่ __exit example_driver_exit (เป็นโมฆะ) { // ยกเลิกการลงทะเบียนโมดูลไดรเวอร์เป็นไคลเอนต์ของตัวแจ้งเตือนเหตุการณ์ Kprofiles kp_notifier_unregister_client(&kp_mode_notifier); }module_init(example_driver_init);module_exit(example_driver_exit);
คุณสามารถมีส่วนร่วมกับ Kprofiles ได้โดยส่งคำขอดึงข้อมูลการเปลี่ยนแปลงมาให้เรา โปรดระบุข้อความที่ชัดเจนพร้อมกับคอมมิตเพื่ออธิบายว่าทำไมคุณจึงทำการเปลี่ยนแปลง
โครงการนี้ได้รับอนุญาตภายใต้ GPL-2.0
Dakkshesh : ผู้แต่ง/ผู้ดูแลโมดูลเคอร์เนล
Cyberknight777 : เคอร์เนลโมดูลผู้ดูแลร่วม | ผู้จัดการฝ่ายดูแล Kprofiles
Vyom Desai : Kprofiles Manager (แพ็คเกจ rom) ผู้แต่ง/ผู้ดูแล
Martin Valba: ผู้จัดการ Kprofiles (แอปแบบสแตนด์อโลน) ผู้แต่ง/ผู้ดูแล
Someone5678 : Kprofiles Manager (แพ็คเกจ rom) ผู้ดูแลร่วม