Я реализую модуль Linux для использования в качестве регулятора частоты. Я новичок в разработке модулей Linux, поэтому я пытаюсь понять уже реализованные регуляторы. Следующий код основан на регуляторе производительности.
#include <linux/cpufreq.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static void cpufreq_gov_performance_limits(struct cpufreq_policy *policy)
{
printk(KERN_INFO "DEBUG: Frequency set to 1500 MHz.\n");
__cpufreq_driver_target(policy, 1500000, CPUFREQ_RELATION_H);
}
static struct cpufreq_governor cpufreq_gov_performance = {
.name = "mtest",
.owner = THIS_MODULE,
.limits = cpufreq_gov_performance_limits,
};
static int __init cpufreq_gov_performance_init(void)
{
printk(KERN_INFO "DEBUG: Governor inserted.\n");
return cpufreq_register_governor(&cpufreq_gov_performance);
}
static void __exit cpufreq_gov_performance_exit(void)
{
printk(KERN_INFO "DEBUG: Governor released.\n");
cpufreq_unregister_governor(&cpufreq_gov_performance);
}
MODULE_LICENSE("GPL");
module_init(cpufreq_gov_performance_init);
module_exit(cpufreq_gov_performance_exit);
Когда я загружаю модуль без printk()
, регулятор работает без ошибок. Но при использовании printk()
я получаю KernelOops при удалении модуля (используя rmmod
).
Это сообщение зарегистрировано в каталоге /var/crash
. В этом тесте я установил 2 процессора из ondemand
в свой пользовательский регулятор и вернулся в ondemand
, затем удалил модуль:
ProblemType: KernelOops
Annotation: Your system might become unstable now and might need to be restarted.
Date: Sun May 6 22:54:48 2018
Failure: oops
OopsText:
DEBUG: Governor inserted.
DEBUG: Frequency set to 1500 MHz.
DEBUG: Frequency set to 1500 MHz.
DEBUG: Governor released.
Package: linux-image-4.15.0-20-generic 4.15.0-20.21
SourcePackage: linux
Tags: kernel-oops
Uname: Linux 4.15.0-20-generic x86_64
Что может происходить?