为什么用户空间应用程序需要内核标头?


10

我正在为嵌入式设备构建busy-box和iptables,它们的依赖项之一是内核标头。

我已经在整个文件系统中搜索* .ko文件,但没有找到。所以我得出结论,这些应用程序没有创建任何可加载的驱动程序(内核模块)。

用户空间应用程序还需要内核头文件还有哪些其他情况?


一个简单的例子就是当用户空间中的某个东西发出系统调用时。
萨米·莱恩

@SamiLaine我想c库将提供系统调用的接口。如果您要说的是这种情况,例如,您是否必须只是为了打开套接字而导入内核标头?
TheMeaningfulEngineer 2014年

Socket(2)是系统调用,不是库函数,所以可以。
2014年

@SamiLaine您能否举一个例子,您必须include <linux/*.h>打开一个插座?(我的目标是sys / socket.h)
TheMeaningfulEngineer

Answers:


8

因为这些程序是为了使用内核头文件中定义的内容而构建的,所以:

busybox-1.22.1]$ egrep -RHn '^#include <linux'
modutils/modutils-24.c:194:#include <linux/elf-em.h>
include/fix_u32.h:17:#include <linux/types.h>
libbb/loop.c:11:#include <linux/version.h>
console-tools/openvt.c:23:#include <linux/vt.h>
console-tools/kbd_mode.c:23:#include <linux/kd.h>
console-tools/showkey.c:19:#include <linux/kd.h>
util-linux/blockdev.c:36:#include <linux/fs.h>
util-linux/mkfs_ext2.c:50:#include <linux/fs.h>
util-linux/mkfs_vfat.c:28:#include <linux/hdreg.h> /* HDIO_GETGEO */
util-linux/mkfs_vfat.c:29:#include <linux/fd.h>    /* FDGETPRM */
....

对于每个特定的工具,您需要阅读该工具的源代码和相关的内核头文件,以弄清楚到底是什么。

您可以看到一些注释使它变得容易。

例如,mkfs_vfatinclude linux/fd.h获得FDGETPRM

$ egrep -RHn FDGETPRM util-linux/mkfs_vfat.c
util-linux/mkfs_vfat.c:29:#include <linux/fd.h>    /* FDGETPRM */
util-linux/mkfs_vfat.c:351:         int not_floppy = ioctl(dev, FDGETPRM, &param);

您可能会删除相关的代码#include并监视编译器错误以使其变得更容易,并且会收到警告,提示未定义某些内容。这些东西可能来自内核头文件。


2
1. Busybox专为嵌入式和其他轻量级系统而设计,在这些系统中您希望在内存中加载尽可能少的库。我没有阅读源代码,但是可能BB基本上避开了库,直接链接到内核。2.否。它将用户空间二进制文件与内核版本兼容,该版本是向后兼容的:今天编译的二进制文件可能无法在较旧的内核上运行(取决于所包含的符号...阅读源代码),但可以使用将来的内核。
ignis 2014年

1
@suprjami ABI遵循标准SysV ABI,可以合理地认为它不会发生变化。除其他外,SysV ABI就是为什么您可以使用所选的编译器(和版本)与内核链接,而不必与发出内核二进制文件的内核相同。
ignis 2014年

1
...这也使得将chroot / LXC放入另一个内核附带的发行版中成为可能。等
ignis 2014年

1
(为清楚起见:请注意,内核具有外部ABI和内核模块之间的内部ABI,我们将在此处讨论该外部ABI,该内部ABI会进行频繁且可能不兼容的更改,但用户空间看不到它,并且在编译用户空间时无关紧要代码。)
ignis 2014年

1
(还要注意,ABI = / = API。内核的(外部)API包括源代码中引用的符号,并且内核开发人员已承诺维护兼容性;除非这些符号在现实世界的软件中很少使用,否则它将是他们做出不兼容的更改的不合理举动,尽管没有第三方标准强制要求整个Linux API,因此从技术上讲没有任何阻碍。)
ignis 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.