【问题标题】:What linux kernel code creates /sys/devices/system/cpu/cpuX?什么 linux 内核代码创建 /sys/devices/system/cpu/cpuX?
【发布时间】:2012-11-02 09:53:49
【问题描述】:

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

【问题讨论】:

    标签: linux kernel sysfs microblaze


    【解决方案1】:

    我通过查看drivers/cpufreq/cpufreq.c 中的cpufreq_cpu_callback() 发现了/sys/devices/system/cpu/cpuX 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 秒!

    【讨论】:

      猜你喜欢
      • 2023-01-30
      • 1970-01-01
      • 2013-10-25
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2018-04-11
      相关资源
      最近更新 更多