2017-10-21 169 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品牌和目标规格;他们不是这种联系的主要原因。在新加载的内核中开始的第一件事情之一是运行时链接程序,它了解选定的目标文件格式并执行初始链接。

但是,不同的是,内核模块是针对不同的编程接口构建的,在某些情况下针对不同的二进制接口构建。一些图书馆功能可以停止;有些可以以相当不同的方式实施。如果编译并链接内核模块时没有用于内核的特殊选项,则很有可能无法正常运行(并导致内核崩溃)。这就是为什么人们应该使用特定的头文件集和编译选项。而且,通常无法将用户空间库加载到内核中,因为它取决于内核中不存在的符号。