¿Por qué las aplicaciones de espacio de usuario necesitan encabezados de kernel?

10

Estoy construyendo busy-box e iptables para un dispositivo incrustado y una de las dependencias para ellos son los encabezados del kernel.

He buscado en todo el sistema de archivos archivos * .ko y no he encontrado ninguno. Así que concluí que las aplicaciones no están creando controladores cargables (módulos del núcleo).

¿Cuáles son otros casos para que una aplicación de espacio de usuario requiera encabezados de kernel?

El Ingeniero Significante
fuente
Un ejemplo fácil de encontrar es cuando algo en el espacio del usuario emite una llamada al sistema.
Sami Laine
@SamiLaine Supongo que la biblioteca c proporcionaría la interfaz para las llamadas al sistema. Si lo que está diciendo es el caso, ¿no tendría, por ejemplo, que importar los encabezados del núcleo solo para abrir un socket?
TheMeaningfulEngineer
Socket (2), es una llamada al sistema, no una función de biblioteca, así que sí.
Sami Laine
@SamiLaine ¿Puedes dar un ejemplo donde tienes que include <linux/*.h> que abrir un zócalo? (Estaba apuntando a sys / socket.h)
TheMeaningfulEngineer

Respuestas:

8

Debido a que esos programas están diseñados para usar cosas definidas en los encabezados del núcleo:

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 herramienta específica, necesitaría leer la fuente de la herramienta y el encabezado del núcleo correspondiente para averiguar exactamente qué.

Puede ver que se comentan algunas cosas para que sea más fácil.

Por ejemplo, mkfs_vfatincluye linux/fd.hobtener 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);

Probablemente podría eliminar el relevante #include y observar los errores del compilador para que sea más fácil, recibirá advertencias de que algunas cosas no están definidas. Esas cosas probablemente provienen de los encabezados del núcleo.

suprjami
fuente
2
1. Busybox está diseñado para sistemas integrados y otros sistemas livianos, donde desea cargar la menor cantidad posible de bibliotecas en la memoria. No he leído la fuente, pero probablemente BB básicamente está esquivando las bibliotecas y enlazando directamente con el núcleo. 2. No. Empareja su binario de espacio de usuario con una versión de la API del núcleo , que es compatible con versiones anteriores: un binario compilado hoy podría no funcionar en un núcleo más antiguo (dependiendo de los símbolos incluidos ... lea el código fuente) pero trabajar con futuros núcleos.
ignis
1
@suprjami El ABI obedece el SysV ABI estándar, que se puede suponer razonablemente que no cambia; entre otras cosas, SysV ABI es la razón por la cual puede vincular contra el núcleo con su compilador (y versión) de elección, no necesariamente el mismo que emitió el núcleo binario.
ignis
1
... también permite hacer chroot / LXC en una distribución que se envía con un kernel diferente. etc.
ignis
1
(Para mayor claridad: tenga en cuenta que el kernel tiene un ABI externo , del que estamos discutiendo aquí, y un ABI interno entre los módulos del kernel, que sufre cambios frecuentes y posiblemente incompatibles, pero no es visto por el espacio de usuario y es irrelevante al compilar espacio de usuario código.)
ignis
1
(También tenga en cuenta que ABI = / = API. La API (externa) del núcleo incluye los símbolos a los que se hace referencia en el código fuente, y los desarrolladores del núcleo se han comprometido a mantener la compatibilidad; a menos que los símbolos se utilicen muy raramente en el software del mundo real, sería un movimiento irrazonable para que hagan cambios incompatibles, aunque ningún estándar de terceros exige la totalidad de la API de Linux y, por lo tanto, nada técnicamente lo impide.)
ignis