¿Qué son los encabezados del kernel que se pueden usar en el espacio de usuario? ¿Su firma o interfaz difiere de los encabezados en diferentes directorios?

¿Qué son los encabezados del kernel que se pueden usar en el espacio de usuario? ¿Su firma o interfaz difiere de los encabezados en diferentes directorios?

Podría ser una pregunta incoherente sobre los encabezados del kernel, ya que no tengo una comprensión clara sobre ellos ni dónde y cómo se usan. Creo que podrían detenerlo. Mi pregunta tiene 3 partes:

  1. Creo que los encabezados del kernel proporcionan una interfaz para que otras partes del kernel, como los módulos, puedan usarlos. Ése es mi conocimiento libresco. No he visto ni encontrado ningún código que utilice encabezados del kernel (agradecería que alguien me pudiera indicarlo). ¿Se puede utilizar también en el espacio de usuario? Se agradecería cualquier ejemplo de código.

  2. Descubrí que el uso de make headers_installencabezados del kernel está expuesto en el espacio de usuario, pero al mismo tiempo no se recomienda utilizar encabezados del kernel en el espacio de usuario. Si no se recomienda, ¿de qué sirve exponerlo al espacio de usuario?

  3. segúnesteyeste, los archivos de encabezado del kernel (archivos .h) deben estar en 3 lugares: a. /usr/include/linux/kernel.hque está destinado al espacio del usuario b. /lib/modules/$(uname -r)/build/include/linux/sched.hque son módulos externos c. /usr/src/...que se utiliza para los módulos del kernel. ¿Significa que los archivos de encabezado en diferentes directorios tienen un propósito diferente o una interfaz o firma diferente? En otras palabras, ¿ #include <linux/xyz.h> el código en un espacio de usuario tiene un significado diferente que #include <linux/xyz.h>en el módulo del kernel? ¿También el módulo externo es el mismo que el módulo del kernel?

Gracias.

Respuesta1

¡Bienvenido a Unix y Linux StackExchange!

Sí, los encabezados del kernel proporcionan una interfaz para otras partes del kernel; en esto tienes toda la razón. También incluyen definiciones para la interfaz entre el kernel y el espacio de usuario, pero generalmente la interfaz "sin formato" del kernel no se usa directamente, sino a través de la biblioteca C (a menudo glibc).

La interfaz del espacio de usuario-kernel puede incluir múltiples versiones de una llamada al sistema particular, por razones de compatibilidad con versiones anteriores. Al realizar la llamada al sistema a través de la biblioteca C, todas las aplicaciones obtienen la misma versión de la llamada al sistema real y, por lo tanto, una garantía de comportamiento consistente. Además, cuando se actualice la parte relevante de la interfaz del kernel, solo necesitará actualizar la biblioteca C para aprovechar las nuevas funciones.

(Por ejemplo, cuando time_t se extiende a 64 bits en arquitecturas de 32 bits para evitar el problema Y2K38, la biblioteca C puede pasar a usar siempre la versión de 64 bits de la interfaz del kernel, pero tener una asignación configurable en el espacio de usuario para las aplicaciones. que todavía usan la versión de 32 bits. En ese momento, las funciones que usan time_t de 32 bits pueden quedar obsoletas y eliminarse del kernel, y la biblioteca C puede proporcionar mejores soluciones para las aplicaciones heredadas que todavía usan el tipo de 32 bits).

Entonces, a menos que también esté compilando sus propias versiones de la biblioteca C, generalmente debería preferir los encabezados de desarrollo de la biblioteca C en lugar de usar los encabezados del kernel directamente.

Los encabezados /usr/include/linux/generalmente vienen con el paquete de encabezado de desarrollo de la biblioteca C y describen la versión del kernel para la que se compiló la biblioteca C. Esto es lo que normalmente necesita un desarrollador de aplicaciones de espacio de usuario.

/lib/modules/$(uname -r)/buildA menudo es un enlace simbólico /usr/src/...donde se almacenan los encabezados o el código fuente completo de la versión real del kernel en ejecución. Se utiliza al compilar módulos del kernel externos (también conocidos como de terceros), es decir, módulos del kernel de fuentes que no están integradas en el código fuente principal del kernel. Estos encabezados incluyen las firmas de versión de API del kernel necesarias para que los módulos puedan usar API internas del kernel específicas de la versión.

información relacionada