0
A
回答
4
爲什麼不能將共享庫鏈接到內核代碼中?
它是可能的。但是,它們是而不是您在userland中使用的共享庫。
由於經典的System V,內核可以作爲一組可加載模塊運行,並且通常是以這種方式運行的。幾乎所有的現代系統都使用它; Linux和FreeBSD都是很好的例子。而且,他們使用相同的工具來創建userland這樣的模塊。例如:
內核模塊的共享對象:
$ file /lib/modules/4.4.0-97-generic/kernel/drivers/net/vxlan.ko
'/lib/modules/4.4.0-97-generic/kernel/drivers/net/vxlan.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), BuildID[sha1]=561b0b69742c93a595c85be50f6916352c793e5c, not stripped
一個用戶空間庫
共享對象:
$ file /lib64/libm-2.23.so
/lib64/libm-2.23.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=cb41640d6965fac9bac4010bebac955e95e4d8c1, for GNU/Linux 2.6.32, stripped
相同爲FreeBSD:
$ file /boot/kernel/agp.ko
/boot/kernel/agp.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (FreeBSD), not stripped
$ file /lib/libm.so.5
/lib/libm.so.5: ELF 64-bit LSB shared object, x86-64, version 1 (FreeBSD), dynamically linked, stripped
在這些情況下
,都是ELF的「共享對象」(您稱爲「共享庫」的東西;「共享對象」這個術語不太明顯,但是de ELF規範)。您可以在file
診斷中看到細微差異,如ELF品牌和目標規格;他們不是這種聯繫的主要原因。在新加載的內核中開始的第一件事情之一是運行時鏈接程序,它瞭解選定的目標文件格式並執行初始鏈接。
但是,與不同的是,內核模塊是針對不同的編程接口構建的,在某些情況下針對不同的二進制接口構建。一些圖書館功能可以停止;有些可以以相當不同的方式實施。如果編譯並鏈接內核模塊時沒有用於內核的特殊選項,則很有可能無法正常運行(並導致內核崩潰)。這就是爲什麼人們應該使用特定的頭文件集和編譯選項。而且,通常無法將用戶空間庫加載到內核中,因爲它取決於內核中不存在的符號。
相關問題
- 1. 將共享庫鏈接到共享庫
- 2. 不能boost庫鏈接到共享庫
- 3. Eclipse鏈接共享代碼
- 4. 將靜態庫鏈接到共享庫?
- 5. 如何將共享庫與其他共享庫鏈接到Linux?
- 6. 鏈接到linux共享庫
- 7. 鏈接到共享庫Linux
- 8. 爲什麼SLComposeViewController不能在Ipad中共享文本和鏈接?
- 9. 將Matlab共享庫鏈接到Qt(Windows)
- 10. C++/Eclipse共享庫:爲什麼g ++不能找到這個庫?
- 11. cygwin:鏈接器找不到共享庫
- 12. 鏈接共享庫
- 13. 建立共享庫鏈接到其他不標準共享libarary
- 14. 爲什麼共享庫通過絕對路徑鏈接?
- 15. 爲什麼鏈接器更改共享庫名稱?
- 16. 將共享庫與其他共享庫鏈接是否好?
- 17. 這個鏈接到共享庫有什麼問題?
- 18. 當鏈接到動態共享庫時,ld會做什麼?
- 19. 爲什麼內核代碼不能使用紅色區域
- 20. 鏈接一個共享庫靜態到我的共享庫
- 21. 爲什麼這些共享庫不同?
- 22. 將共享庫共享到共享內存
- 23. Facebook共享鏈接內容
- 24. 與共享庫鏈接
- 25. Android.mk:共享庫未鏈接
- 26. gcc的鏈接共享庫
- 27. 共享數據庫鏈接
- 28. 將共享庫重新鏈接到不同版本的libc
- 29. jQuery鏈接 - 爲什麼不能鏈接?
- 30. Eclipse CDT鏈接到共享庫
Linux可以像許多其他內核一樣加載內核模塊。 https://en.wikipedia.org/wiki/Loadable_kernel_module –
在內核中不能使用FP代碼並不嚴格。在你的代碼中使用''kernel_fpu_begin()'''kernel_fpu_end()'來避免損壞用戶空間FPU狀態](https://stackoverflow.com/questions/46677676/why-are-simd-instructions-not-used-在內核)。 https://stackoverflow.com/questions/15883947/why-am-i-able-to-perform-floating-point-operations-inside-a-linux-kernel-module。但如果可能的話,使用整數。如果需要,內核可以完全禁用FPU:https://stackoverflow.com/questions/13886338/use-of-floating-point-in-the-linux-kernel –
由於共享庫與環境下的環境不兼容哪個內核運行(用戶域中的內核模式vs ld)。您始終必須生成適用於您的目標平臺的代碼。目標平臺「linux內核模式」與「linux用戶應用程序」目標不同。爲什麼這樣:因爲用戶環境是由內核創建的,所以爲了使內核爲自己準備相同的環境,你正在遞歸...(並且在「內核1」下運行「內核2」會導致性能低下,爲裸金屬目標編寫單內核更簡單) – Ped7g