我正在为嵌入式设备构建 busy-box 和 iptables,它们的依赖项之一是内核标头。
我搜索了整个文件系统以查找 *.ko 文件,但一无所获。因此我得出结论,应用程序没有创建任何可加载驱动程序(内核模块)。
用户空间应用程序需要内核头文件的其他情况是什么?
答案1
因为这些程序是为了使用内核头文件中定义的内容而构建的:
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_vfat
包括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, ¶m);
您可能可以删除相关内容#include
并观察编译器错误以使其更容易,您会收到一些警告,指出某些内容未定义。这些东西可能来自内核头。