2017-10-21 203 views
0

有什麼影響?內核是用靜態庫編譯還是內在實現?爲什麼不能將共享庫鏈接到內核代碼?

此外,根據this,內核代碼不能使用任何浮點操作。這是爲什麼?

+2

Linux可以像許多其他內核一樣加載內核模塊。 https://en.wikipedia.org/wiki/Loadable_kernel_module –

+0

在內核中不能使用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 –

+0

由於共享庫與環境下的環境不兼容哪個內核運行(用戶域中的內核模式vs ld)。您始終必須生成適用於您的目標平臺的代碼。目標平臺「linux內核模式」與「linux用戶應用程序」目標不同。爲什麼這樣:因爲用戶環境是由內核創建的,所以爲了使內核爲自己準備相同的環境,你正在遞歸...(並且在「內核1」下運行「內核2」會導致性能低下,爲裸金屬目標編寫單內核更簡單) – Ped7g

回答

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品牌和目標規格;他們不是這種聯繫的主要原因。在新加載的內核中開始的第一件事情之一是運行時鏈接程序,它瞭解選定的目標文件格式並執行初始鏈接。

但是,不同的是,內核模塊是針對不同的編程接口構建的,在某些情況下針對不同的二進制接口構建。一些圖書館功能可以停止;有些可以以相當不同的方式實施。如果編譯並鏈接內核模塊時沒有用於內核的特殊選項,則很有可能無法正常運行(並導致內核崩潰)。這就是爲什麼人們應該使用特定的頭文件集和編譯選項。而且,通常無法將用戶空間庫加載到內核中,因爲它取決於內核中不存在的符號。