Linux内核如何获取有关处理器和内核的信息?

时间:2014-01-29 04:56:39

标签: linux linux-kernel

假设我们有一台没有任何操作系统的空白计算机,我们正在安装Linux。内核中的哪些代码可以识别处理器和内核并获取有关它们的信息? 这个信息最终出现在像/ proc / cpuinfo这样的地方,但是内核如何在第一时间获得它?!

2 个答案:

答案 0 :(得分:4)

简短回答

内核使用特殊的CPU指令cpuid并将结果保存在内部结构中 - cpuinfo_x86用于x86

长答案

内核源代码是你最好的朋友。 从入口点开始 - 文件/proc/cpuinfo。 作为任何proc文件,它必须在内核中的某个地方创建并使用一些file_operations声明。这是在fs/proc/cpuinfo.c完成的。有趣的部分seq_open使用对某些cpuinfo_op的引用。这个操作在arch/x86/kernel/cpu/proc.c中声明,我们在其中看到一些show_cpuinfo函数。此功能位于line 57上的同一文件中。

在这里你可以看到

 64         seq_printf(m, "processor\t: %u\n"
 65                    "vendor_id\t: %s\n"
 66                    "cpu family\t: %d\n"
 67                    "model\t\t: %u\n"
 68                    "model name\t: %s\n",
 69                    cpu,
 70                    c->x86_vendor_id[0] ? c->x86_vendor_id : "unknown",
 71                    c->x86,
 72                    c->x86_model,
 73                    c->x86_model_id[0] ? c->x86_model_id : "unknown");

在第一行声明为c的结构struct cpuinfo_x86。此结构在arch/x86/include/asm/processor.h中声明。如果您搜索该结构的引用,您将找到函数cpu_detect,该函数调用函数cpuid,该函数最终解析为native_cpuid,如下所示:

189 static inline void native_cpuid(unsigned int *eax, unsigned int *ebx,
190                                 unsigned int *ecx, unsigned int *edx)
191 {
192         /* ecx is often an input as well as an output. */
193         asm volatile("cpuid"
194             : "=a" (*eax),
195               "=b" (*ebx),
196               "=c" (*ecx),
197               "=d" (*edx)
198             : "" (*eax), "2" (*ecx)
199             : "memory");
200 }

在这里你看到汇编程序指令cpuid。而这件小事确实有效。

答案 1 :(得分:0)

来自BIOS +硬件DB的此信息。您可以通过dmidecode直接获取信息(例如,如果您需要更多信息 - 请尝试检查dmidecode源代码)

sudo dmidecode -t processor