我正在为microblaze体系结构开发一个cpufreq驱动程序(作为一个可加载的内核模块)。我有一些能够缩放系统时钟的fpga逻辑,它工作得很好。我按照Documentation/cpu-freq/cpu-drivers.txt
中的信息查看了blackfin cpufreq驱动程序中的模型。
我还对arch/microblaze/Kconfig
进行了必要的更改,以便在内核中内置cpufreq选项(而不是模块)。
当我第一次加载驱动程序时,cpufreq_register_driver()
返回-enodev,这意味着它找不到cpu。我将驱动程序标志设置为cpufreq_sticky,并能够插入模块。
然而,此时我意识到/sys/devices/system/cpu/cpu0
不存在(尽管/sys/devices/system/cpu/cpufreq
存在)。那么,这是为什么?内核代码的哪个部分负责创建该目录?
最佳答案
我通过查看/sys/devices/system/cpu/cpuX
中的cpufreq_cpu_callback()
发现了drivers/cpufreq/cpufreq.c
sysfs条目的创建位置。这有一个对get_cpu_sysdev()
的调用,我认为这是我正在寻找的元素。
这个调用是在drivers/base/cpu.c
中定义的,在这里我还注意到将特定于cpu的sysdev条目放在一起的代码;register_cpu()
。对于大多数架构,这是在arch/${ARCH}/kernel/setup.c
中,我使用blackfin代码作为示例。
DEFINE_PER_CPU(struct cpu, cpu_data);
static int __init topology_init(void)
{
unsigned int cpu;
for_each_possible_cpu(cpu) {
register_cpu(&per_cpu(cpu_data, cpu), cpu);
}
return 0;
}
在将此代码添加到
arch/microblaze/kernel/setup.c
之后,我现在拥有了所需的目录,并且能够使用不同的调控器与cpufreq驱动程序进行对话。现在我只需要让sleep 1
以1/3的时钟频率占用1秒,而不是3秒!关于linux - 哪些Linux内核代码创建/sys/devices/system/cpu/cpuX?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13132013/