简短的回答
内核采用专用CPU指令cpuid并在内部保存结果结构 - cpuinfo_x86用于x86
龙答案
内核源为y我们最好的朋友。 从入口点开始 - 文件/proc/cpuinfo。 作为任何proc文件,它必须在内核的某个地方创建,并用一些file_operations声明。这在fs/proc/cpuinfo.c完成。有趣的部分是seq_open,使用参考一些cpuinfo_op。此操作在arch/x86/kernel/cpu/proc.c中声明,我们在其中看到一些show_cpuinfo函数。该功能位于line 57的同一个文件中。
在这里你可以看到声明的第一行作为struct cpuinfo_x86
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。该结构在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。而这个小东西确实有用。