Какой код ядра Linux создает /sys/devices/system/cpu/cpuX?
Я разрабатываю драйвер cpufreq (как загружаемый модуль ядра) для архитектуры microblaze. У меня есть некоторая логика ПЛИС, которая может масштабировать системные часы, и она работает довольно хорошо. Я следил за информацией в Documentation/cpu-freq/cpu-drivers.txt
и посмотрел на модель в драйвере blackfin cpufreq.
Я также внес необходимые изменения в arch/microblaze/Kconfig
чтобы встроить в ядро опции cpufreq (не модули).
Когда я впервые загрузил драйвер, cpufreq_register_driver()
возвращал -ENODEV, что означало, что он не может найти процессор. Я установил флаг драйвера на CPUFREQ_STICKY и смог вставить модуль.
Однако в этот момент я понял, что /sys/devices/system/cpu/cpu0
нет (хотя /sys/devices/system/cpu/cpufreq
есть). Итак, почему это? Какая часть кода ядра отвечает за создание этого каталога?
1 ответ
Я обнаружил, где /sys/devices/system/cpu/cpuX
Запись sysfs была создана путем просмотра cpufreq_cpu_callback()
в drivers/cpufreq/cpufreq.c
, Это вызов get_cpu_sysdev()
Я предполагал, что это был элемент, который я искал.
Этот вызов определен в drivers/base/cpu.c
, где я также заметил код, который собирает специфическую для процессора запись sysdev; register_cpu()
, Для большинства архитектур это в arch/${ARCH}/kernel/setup.c
, и я использовал черный код в качестве примера.
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 секунду на 1/3 тактовой частоты вместо 3 секунд!