我正在为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.csysfs条目的创建位置。这有一个对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/

10-10 21:24