假設我們有一臺空白的電腦,沒有任何操作系統,我們正在安裝一個Linux。內核中的哪些地方是用於標識處理器和內核並從中獲取信息的代碼? 這個信息最終會出現在像/ proc/cpuinfo這樣的地方,但是內核是如何得到它的?Linux內核如何獲取有關處理器和內核的信息?
1
A
回答
3
簡短的回答
內核採用專用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
。而這個小東西確實有用。
0
這些信息來自BIOS +硬件數據庫。你可以得到的信息通過的dmidecode直接,例如(如果你需要更多的信息 - 嘗試檢查的dmidecode源代碼)
sudo dmidecode -t processor
相關問題
- 1. 內核崩潰後獲取linux內核調試信息
- 2. Linux內核編程,如何獲取信息?
- 3. 如何在Linux內核模塊中獲取CPU信息?
- 4. Linux內核3.9 KVM for ARM處理器
- 5. Linux內核處理低內存條件
- 6. linux內核中的單處理器上的信號量
- 7. 關於Linux內核
- 8. Linux內核和我的內核模塊
- 9. Linux內核:skbuff結構 - 路由信息..
- 10. Linux內核編程:「無法處理內核NULL指針引用」
- 11. 哪裏獲得Linux內核,它可以讓我在內核中訪問信息
- 12. Linux內核模塊的處理器關聯設置?
- 13. linux內核函數來獲取安裝內核和活動核心
- 14. 有關多核處理器的MESI協議的詳細信息
- 15. glib和linux內核
- 16. 如何查看有關新加載的外部Linux內核模塊的信息?
- 17. 如何在Linux內核的dynamic_debug信息中獲取「%d」變量的值?
- 18. 程序如何通信 - 微內核單片內核exo內核
- 19. 內核空間中的信號處理
- 20. PCIe中斷處理linux內核
- 21. Linux內核:獲取函數地址爲內核驅動程序
- 22. 在運行時從linux內核模塊獲取內核版本
- 23. 獲取內核
- 24. 有關物理內存的Linux內核知識
- 25. Linux內核模塊中的內核線程之間的通信
- 26. 關於linux內核模塊
- 27. Linux-PAM和內核之間的關係
- 28. Linux內核中用於信號處理的棧幀
- 29. 在內核中發送或處理linux信號的地方?
- 30. Linux內核進程管理
一個絕妙的答案。正是我需要的!非常感謝! –