#include <linux/cpufreq.h>
#include <linux/init.h>
#include <linux/module.h>
static void cpufreq_mygovernor_limits(struct cpufreq_policy *policy)
{
pr_debug("setting to %u kHz\n", policy->max-100000);
__cpufreq_driver_target(policy, policy->max-100000, CPUFREQ_RELATION_H);
}
static struct cpufreq_governor cpufreq_mygovernor = {
.name = "mygovernor",
.owner = THIS_MODULE,
.flags = CPUFREQ_GOV_STRICT_TARGET,
.limits = cpufreq_mygovernor_limits,
};
#ifdef CONFIG_CPU_FREQ_MYGOVERNOR
struct cpufreq_governor *cpufreq_default_governor(void)
{
return &cpufreq_mygovernor;
}
#endif
MODULE_AUTHOR("someone");
MODULE_DESCRIPTION("CPUfreq policy governor 'mygovernor'");
MODULE_LICENSE("GPL");
cpufreq_governor_init(cpufreq_mygovernor);
cpufreq_governor_exit(cpufreq_mygovernor);
CPUFreq 정책 (governor)인 "mygovernor"를 구현하는 예제
- Linux 커널에서 사용자 정의 CPUFreq governor를 구현하는 방법을 보여주는 예제
- 해당 governor는 최대 주파수를 설정할 때 사용자가 원하는 값을 적용
- struct cpufreq_policy 를 매개변수로 받아 정책의 제한 값을 설정
- policy->max 값에서 100000을 뺀 값을 최대 주파수로 설정
- pr_debug 함수를 사용해 설정된 최대 주파수를 디버그 메시지로 출력
사용자 정의 governor를 정의하는 구조체
- name: governor의 이름을 지정
- owner: 모듈의 소유자를 지정
- flags: governor의 플래그를 지정
- CPUFREQ_GOV_STRICT_TARGET: 해당 플래그는 정책의 제한 값을 엄격하게 적용하도록 설정
- limits: governor가 사용할 cpufreq_mygovernor_limits 함수를 지정합니다.
- #ifdef CONFIG_CPU_FREQ_MYGOVERNOR 와 #endif 사이의 코드는 컴파일 시CONFIG_CPU_FREQ_MYGOVERNOR 옵션이 설정되어 있는 경우에만 실행
- cpufreq_default_governor 함수는 기본 governor를 반환하는 함수
-> cpufreq_mygovernor 를 반환- MODULE_AUTHOR, MODULE_DESCRIPTION, MODULE_LICENSE 매크로를 사용하여 모듈의 작성자, 설명, 라이선스 정보를 지정
- cpufreq_governor_init 함수와 cpufreq_governor_exit 함수를 사용하여 cpufreq_mygovernor를 커널의 governor로 등록하거나 해제