리눅스데브코스 [9주차 - 4(3)]<ARM 프로세서 코어와 리눅스 커널(3) 실습>

심우열·2023년 6월 1일
0

CPUfreq governor

1. 코드

#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);

2. 코드 설명

CPUFreq 정책 (governor)인 "mygovernor"를 구현하는 예제

  • Linux 커널에서 사용자 정의 CPUFreq governor를 구현하는 방법을 보여주는 예제
  • 해당 governor는 최대 주파수를 설정할 때 사용자가 원하는 값을 적용

1. cpufreq_mygovernor_limits 함수

  1. struct cpufreq_policy 를 매개변수로 받아 정책의 제한 값을 설정
  2. policy->max 값에서 100000을 뺀 값을 최대 주파수로 설정
  3. pr_debug 함수를 사용해 설정된 최대 주파수를 디버그 메시지로 출력

2. cpufreq_mygovernor 구조체

사용자 정의 governor를 정의하는 구조체

  • name: governor의 이름을 지정
  • owner: 모듈의 소유자를 지정
  • flags: governor의 플래그를 지정
  • CPUFREQ_GOV_STRICT_TARGET: 해당 플래그는 정책의 제한 값을 엄격하게 적용하도록 설정
  • limits: governor가 사용할 cpufreq_mygovernor_limits 함수를 지정합니다.

3. 기타

  • #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로 등록하거나 해제
profile
Dev Ops, "Git, Linux, Docker, Kubernetes, ansible, " .

0개의 댓글