關於
支援的核心版本
用法
可用的API
如何貢獻
執照
我們的團隊
Kprofiles 是一個簡單的 Linux 核心模組,可用於調節核心內活動,例如通常不暴露給使用者空間的提升。 Kprofiles 以以設定檔為導向的方式運行,因此,它有四種設定檔模式: Disabled
、 Battery
、 Balanced
和Performance
。每種模式都指派一個模式編號。開發人員可以在條件下使用 Kprofiles API 函數來限製或啟用某種配置模式下的核心任務(例如查看使用部分) 。使用者空間可以透過調整/sys/kernel/kprofiles/kp_mode
中的模式編號與 Kprofile 互動。下表顯示了與設定檔模式相對應的模式編號。
設定檔模式 | 模式編號 |
---|---|
禁用(預設) | 0 |
電池 | 1 |
均衡 | 2 |
表現 | 3 |
此外,Kprofiles 提供自動設定檔更改器 (auto Kprofiles),它使用FB notifier
、 MSM DRM notifier
或MI DRM notifier
在裝置螢幕關閉時強制執行電池設定檔模式,並在裝置喚醒時切換回之前的活動模式。使用者可以透過更改/sys/module/kprofiles/parameters/auto_kp
中的 bool 值在運行時禁用或啟用此功能,而無需重新編譯內核
Kprofiles 另外還具有用於切換設定檔以回應任何核心事件的 API 函數。有關更多信息,請參閱可用 API 表
Kprofiles 在 Linux 3.10+ 核心上進行了測試
如果您使用git
,強烈建議使用git subtree
或git submodule
。
將此儲存庫新增至drivers/misc/kprofiles
修改drivers/misc/Kconfig
選單“其他設備” 來源“drivers/misc/genwqe/Kconfig”+來源“drivers/misc/kprofiles/Kconfig”來源“drivers/misc/echo/Kconfig” 結束選單
修改drivers/misc/Makefile
obj-$(CONFIG_GENWQE) += genwqe/+obj-$(CONFIG_KPROFILES) += kprofiles/obj-$(CONFIG_ECHO) += echo/
使用extern 在所需文件中定義您需要的api 函數,Kprofiles 可以在各種地方使用,例如boosting 驅動程序,下面是在kernel/fork.c 中使用kprofiles 來使用kp_active_mode 在zygote forking 期間控制cpu 和ddr boosts的範例() API。
+ #ifdef CONFIG_KPROFILES+ extern int kp_active_mode(void);+ #endif/* * 好的,這是主要的 fork 例程。 * * 它複製該過程,如果成功則啟動 * 它並等待它完成使用虛擬機器(如果需要)。 */ 長 _do_fork(無符號長克隆標誌, 無符號長堆疊_開始, 無符號長堆疊大小, int __user *parent_tidptr, int __user *child_tidptr, 無符號長 tls) { 結構任務結構*p; int 追蹤 = 0; 長nr; /* 當使用者空間啟動應用程式時,將 CPU 提升至最大值 50 毫秒 */ if (task_is_zygote(current)) {- cpu_input_boost_kick_max(50);- devfreq_boost_kick_max(DEVFREQ_MSM_LLCCBW, 50);- devfreq_boost_kick_MSM_LLCCBW, 50);- devfreq_boost_kick__MSM_LLCCBW_MS_FIP4P_Fy_Falq_PB_F:DF_FIS(DEV)_MS_M_FIP4P4P_F_FI(DEV)_MS_M_FI(DEV), 14FF)DHJ3_F); DR 60ms如果效能模式處於活動狀態。 + * 如果預設模式處於活動狀態,則將CPU 和DDR 提升50 毫秒以保留預設行為。 CPU 與DDR + */+ 開關(kp_active_mode( )) {+ 情況0:+ cpu_input_boost_kick_max(60);+ devfreq_boost_kick_max(DEVFREQ_MSM_LLCC00, 50);+ devfreq_bo,_FREQ_MSM_LLCC0, 50);+ devfreq_bo,_FRf5; boost_kick_max(60); + devfreq_bo ost_kick_max(DEVFREQ_MSM_LLCCBW, 25); + devfreq_boost_kick_max(DEVFREQ_MSM_CPUBW, 25);+ 中斷;+ 狀況3:+ cpu_input_ostost_Rakm(603); );+ devfreq_boost_kick_max(DEVFREQ_MSM_CPUBW, 60);+ 中斷; +預設值:+ pr_info("電池設定檔處於活動狀態,跳過升壓...n");+ break;+ }+ #else+ cpu_input_boost_kick_max(60);+ devfreq_boost_kick_max(DEVFREQ_MSM_LLCC, 50); 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()) { case 1: // 當電池設定檔處於活動狀態時要做的事情 case 2: // 當餘額設定檔處於活動狀態時要做的事情 case 3: // 當效能設定檔處於活動狀態時要做的事情 default: // 當 kprofiles 被停用或預設設定檔處於活動狀態時要做的事情 } }#endif
資訊:此函數可用於在任何核心事件期間將設定檔變更為任何給定模式。
論點:
level
:
類型:無符號整數
定義:要切換到的模式編號。
例子:
無效範例函數(無效) { 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
:
類型:無符號整數
定義:要切換到的模式編號。
duration_ms
:
類型:無符號整數
定義:在切換回之前使用的模式之前指定模式應處於活動狀態的時間量(以毫秒為單位)。
例子:
無效範例函數(無效) { if (required_kernel_event()) { // 切換到效能設定檔(模式 3)50 毫秒 kp_set_mode_rollback(3, 50); printk(KERN_INFO "切換到效能設定檔 50msn"); } }
資訊:一旦透過使用者或核心 API 更改設定檔模式,此基本事件通知程式就可以執行一系列程式碼。這對於在模式改變之後以同步方式執行一系列任務是有利的。
例子:
extern unsigned int KP_MODE_CHANGE;extern int kp_notifier_register_client(struct notifier_block *nb);extern int kp_notifier_unregister_client(struct notifier_block *nbnb);not intnidwem, nex_Ledable, fidifier_unbidis intex_wat_notifier_undable), fnex_wvals intex_wemdic nex; { 無符號整數 profile_mode = (無符號整數) 資料; if (event == KP_MODE_CHANGE) { switch (profile_mode) { case 1: // 當電池設定檔處於活動狀態時要做的事情 case 2: // 當平衡設定檔處於活動狀態時要做的事情 case 3: // 當效能設定檔處於活動狀態時要做的事情 default: // 當 kprofiles 被停用或預設設定檔處於活動狀態時要做的事情 } 返回NOTIFY_OK; }靜態結構notifier_block kp_mode_notifier = { .notifier_call = kp_mode_notifier_callback, };靜態 int __init example_driver_init(void) { // 將驅動程式模組註冊為 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 Manager(獨立應用程式)作者/維護者
Some5678 : Kprofiles Manager (rom 套件) 共同維護者