Por que os aplicativos de espaço do usuário precisam de cabeçalhos de kernel?

Por que os aplicativos de espaço do usuário precisam de cabeçalhos de kernel?

Estou construindo busy-box e iptables para um dispositivo incorporado e uma das dependências deles são os cabeçalhos do kernel.

Pesquisei em todo o sistema de arquivos por arquivos *.ko e não encontrei nenhum. Então concluí que os aplicativos não estão criando nenhum driver carregável (módulos do kernel).

Quais são os outros casos para um aplicativo de espaço do usuário exigir cabeçalhos de kernel?

Responder1

Porque esses programas são construídos para usar coisas definidas nos cabeçalhos do kernel:

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 */
....

Para cada ferramenta específica, você precisa ler a fonte da ferramenta e o cabeçalho do kernel relevante para descobrir exatamente o quê.

Você pode ver algumas coisas comentadas para facilitar.

Por exemplo, mkfs_vfatinclui linux/fd.hpara obter 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);

Você provavelmente poderia remover o relevante #includee observar erros do compilador para facilitar, você receberá avisos de que algumas coisas não estão definidas. Essas coisas provavelmente vêm dos cabeçalhos do kernel.

informação relacionada