에 대한
지원되는 커널 버전
용법
사용 가능한 API
기여하는 방법
특허
우리 팀
Kprofiles는 일반적으로 사용자 공간에 노출되지 않는 부스트와 같은 커널 내 활동을 규제하는 데 사용할 수 있는 간단한 Linux 커널 모듈입니다. Kprofiles는 프로필 지향 방식으로 작동하므로 Disabled
, Battery
, Balanced
및 Performance
네 가지 프로필 모드가 있습니다. 각 모드에는 모드 번호가 할당됩니다. 개발자는 특정 프로필 모드에서 커널 내 작업을 제한하거나 활성화하는 조건에서 Kprofiles API 기능을 사용할 수 있습니다 (예를 들어 사용법 섹션 참조) . 사용자 공간은 /sys/kernel/kprofiles/kp_mode
에서 모드 번호를 조정하여 Kprofiles와 상호 작용할 수 있습니다. 아래 표는 프로필 모드에 해당하는 모드 번호를 보여줍니다.
프로필 모드 | 모드 번호 |
---|---|
비활성화됨(기본값) | 0 |
배터리 | 1 |
균형 잡힌 | 2 |
성능 | 3 |
또한 Kprofiles는 FB notifier
, MSM DRM notifier
또는 MI DRM notifier
사용하여 장치 화면이 꺼질 때 배터리 프로필 모드를 적용하고 장치가 깨어날 때 이전 활성 모드로 다시 전환하는 자동 프로필 변경기(자동 Kprofiles)를 제공합니다. 사용자는 /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) += 에코/
extern을 사용하여 필요한 파일에 필요한 API 기능을 정의합니다. Kprofiles는 예를 들어 드라이버 부스팅과 같은 다양한 위치에서 사용될 수 있습니다. 아래는 kp_active_mode를 사용하여 zygote forking 동안 CPU 및 ddr 부스트를 제어하기 위해 kernel/fork.c에서 kprofiles를 사용하는 예입니다. () API.
+ #ifdef CONFIG_KPROFILES+ extern int kp_active_mode(void);+ #endif/* * 좋습니다. 이것이 주요 포크 루틴입니다. * * 프로세스를 복사하고 성공하면 킥스타트됩니다. * 필요한 경우 VM 사용이 완료될 때까지 기다립니다. */ long _do_fork(부호 없는 long clone_flags, 부호 없는 긴 stack_start, 부호 없는 긴 stack_size, int __user *parent_tidptr, int __user *child_tidptr, 부호 없는 긴 TLS) { 구조체 task_struct *p; int 추적 = 0; 긴 번호; /* 사용자 공간이 앱을 시작할 때 CPU를 50ms 동안 최대로 향상 */ if (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("배터리 프로필 활성, 부스트 건너뛰기...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: // 배터리 프로파일이 활성일 때 수행할 작업 break; 사례 2: // 밸런스 프로필이 활성화되었을 때 수행할 작업 break; 사례 3: // 성능 프로필이 활성화되었을 때 수행할 작업 break; default: // kprofiles가 비활성화되거나 기본 프로필이 활성화된 경우 수행할 작업 break; } }#endif
정보 : 이 기능은 커널 내 이벤트 중에 특정 모드로 프로필을 변경하는 데 사용할 수 있습니다.
인수 :
level
:
유형: 부호 없는 정수
정의: 전환할 모드 번호입니다.
예 :
void example_function(void) { 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
:
유형 : 부호 없는 정수
정의 : 이전에 사용된 모드로 다시 전환하기 전에 지정된 모드가 활성화되어야 하는 시간(밀리초)입니다.
예 :
void example_function(void) { if (required_kernel_event()) { // 50ms 동안 성능 프로필(모드 3)로 전환 kp_set_mode_rollback(3, 50); printk(KERN_INFO "50ms 동안 성능 프로필로 전환n"); } }
Info : 이 기본 이벤트 알리미를 사용하면 사용자 또는 커널 내 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 *nb);static int kp_mode_notifier_callback(struct notifier_block *nb, 서명되지 않은 긴 이벤트, void *data) { unsigned int profile_mode = (unsigned int)data; if (event == KP_MODE_CHANGE) { switch (profile_mode) { case 1: // 배터리 프로필이 활성화되었을 때 수행할 작업 break; 사례 2: // 밸런스 프로파일이 활성화되었을 때 수행할 작업 break; 사례 3: // 성능 프로필이 활성화되었을 때 수행할 작업 break; default: // kprofiles가 비활성화되거나 기본 프로필이 활성화된 경우 수행할 작업 break; } } NOTIFY_OK를 반환합니다. }정적 구조체 notifier_block kp_mode_notifier = { .notifier_call = kp_mode_notifier_callback, };static int __init example_driver_init(void) { // 드라이버 모듈을 Kprofiles 이벤트 알림의 클라이언트로 등록합니다. kp_notifier_register_client(&kp_mode_notifier); 0을 반환합니다. }정적 무효 __exit example_driver_exit(void) { // 드라이버 모듈을 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 관리자(rom 패키지) 작성자/관리자
Martin Valba: Kprofiles Manager(독립형 앱) 작성자/관리자
누군가5678 : Kprofiles Manager (rom 패키지) 공동 관리자