Как получить информацию о процессоре в модуле ядра Linux?
Я посмотрел в исходный код своего ядра и нашел следующие определения в kerneldir / arch / x86 / include / asm / processor.h:
extern void cpu_detect(struct cpuinfo_x86 *c);
Я попытался использовать это в моем модуле ядра из дерева, используя этот код:
#include <asm/processor.h>
struct cpuinfo_x86 cpu;
cpu_detect(&cpu);
if(cpu.x86_model == 28) // Intel Atom
{
// do stuff
}
Когда я строю свой исходный код, я получаю следующие предупреждения:
Building modules, stage 2.
MODPOST 1 modules
WARNING: "cpu_detect" [<my-kernel-module-path>.ko] undefined!
Есть ли лучший способ получить информацию о процессоре из пространства ядра в моем модуле? Если способ, которым я делаю это правильно, есть ли какие-либо специальные опции связывания, которые мне нужно передать, чтобы я мог получить объектный код?
1 ответ
static int cpu_info_print(void){
unsigned int cpu = 0;
struct cpuinfo_x86 *c;
for_each_online_cpu(cpu)
{
const char *vendor = NULL;
c = &cpu_data(cpu);
if (c->x86_vendor < X86_VENDOR_NUM) {
vendor = "Unknown";
} else {
if (c->cpuid_level >= 0)
vendor = c->x86_vendor_id;
}
if (vendor && !strstr(c->x86_model_id, vendor))
pr_cont("%s ", vendor);
if (c->x86_model_id[0])
pr_cont("%s", c->x86_model_id);
else
pr_cont("%d86", c->x86);
pr_cont(" (family: 0x%x, model: 0x%x", c->x86, c->x86_model);
if (c->x86_stepping || c->cpuid_level >= 0)
pr_cont(", stepping: 0x%x)\n", c->x86_stepping);
else
pr_cont(")\n");
}
return 0;
}
Я не нашел никакой информации о cpu_detect, но поиск print_cpu_info (также присутствующий в этом заголовке) нашел вопрос stackru, который имеет решение:
Используйте указатель на функцию kallsyms_lookup_name("print_cpu_info")
, поскольку функция не экспортируется для модулей (используется только ядро ядра)
Как мой пользовательский модуль в linux 3.2.28 может сделать вызов print_cpu_info?