Зачем приложениям пользовательского пространства нужны заголовки ядра?

Зачем приложениям пользовательского пространства нужны заголовки ядра?

Я собираю 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, &param);

Вы, вероятно, могли бы удалить соответствующие #includeи следить за ошибками компилятора, чтобы упростить задачу, вы получите предупреждения о том, что некоторые вещи не определены. Эти вещи, вероятно, исходят из заголовков ядра.

Связанный контент