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