什么linux内核代码创建/ sys / devices / system / cpu / cpuX?

时间:2012-10-30 02:56:56

标签: linux kernel sysfs microblaze

我正在为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存在)。那么,为什么呢?内核代码的哪一部分负责创建该目录?

1 个答案:

答案 0 :(得分:1)

通过查看/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的时钟频率而不是3秒来获得1秒!