Articulo de referencia

Interfaces del kernel de Linux

API de Linux, ABI de Linux y API y ABI dentro del kernel El núcleo de Linux proporciona múltiples interfaces para el código del espacio de usuario y del modo núcleo . Estas inte...

API de Linux, ABI de Linux y API y ABI dentro del kernel

El núcleo de Linux proporciona múltiples interfaces para el código del espacio de usuario y del modo núcleo . Estas interfaces se pueden clasificar como interfaz de programación de aplicaciones (API) o interfaz binaria de aplicaciones (ABI), y también como núcleo - espacio de usuario o núcleo interno.

API de Linux

La API de Linux se compone de la interfaz de llamadas al sistema del kernel de Linux, la biblioteca C de GNU (por GNU ), libcgroup , [ 1 ] libdrm , libalsa y libevdev [ 2 ] (por freedesktop.org ).
API de Linux frente a API POSIX

La API de Linux incluye la API de espacio de usuario del kernel , que permite que el código en el espacio de usuario acceda a los recursos y servicios del kernel de Linux. [ 3 ] Está compuesta por la interfaz de llamadas al sistema del kernel de Linux y las subrutinas de la biblioteca estándar de C. El objetivo del desarrollo de la API de Linux ha sido proporcionar las características utilizables de las especificaciones definidas en POSIX de una manera razonablemente compatible, robusta y eficiente, y proporcionar características útiles adicionales no definidas en POSIX, al igual que las API de espacio de usuario del kernel de otros sistemas que implementan la API POSIX también proporcionan características adicionales no definidas en POSIX.

La API de Linux, por elección, se ha mantenido estable a lo largo de las décadas mediante una política de no introducir cambios incompatibles; esta estabilidad garantiza la portabilidad del código fuente . [ 4 ] Al mismo tiempo, los desarrolladores del kernel de Linux han sido históricamente conservadores y meticulosos a la hora de introducir nuevas llamadas al sistema.

Gran parte del software libre y de código abierto disponible está escrito para la API POSIX. Dado que el desarrollo se centra mucho más en el kernel de Linux en comparación con otras combinaciones de kernel y biblioteca estándar C compatibles con POSIX, el kernel de Linux y su API se han ampliado con características adicionales. Programar para la API completa de Linux, en lugar de solo para la API POSIX, puede ofrecer ventajas en los casos en que dichas características adicionales resulten útiles. Ejemplos actuales bien conocidos son udev , systemd y Weston . [ 5 ] Personas como Lennart Poettering defienden abiertamente la preferencia por la API de Linux sobre la API POSIX, cuando esta ofrece ventajas. [ 6 ]

En FOSDEM 2016, Michael Kerrisk explicó algunos de los problemas percibidos con la API de espacio de usuario del kernel de Linux, describiendo que contiene múltiples errores de diseño al ser no extensible, difícil de mantener, excesivamente compleja, de propósito limitado, violar estándares e inconsistente. La mayoría de esos errores no se pueden corregir porque hacerlo rompería la ABI que el kernel presenta al espacio de usuario. [ 7 ]

Interfaz de llamadas al sistema del kernel de Linux

La interfaz de llamadas al sistema de un núcleo es el conjunto de todas las llamadas al sistema implementadas y disponibles en dicho núcleo. En el núcleo de Linux, varios subsistemas, como el Administrador de Renderizado Directo (DRM), definen sus propias llamadas al sistema, las cuales forman parte de la interfaz de llamadas al sistema.

Se están debatiendo públicamente varios problemas relacionados con la organización de las llamadas al sistema del kernel de Linux. Andy Lutomirski, Michael Kerrisk y otros han señalado estos problemas . [ 8 ] [ 9 ] [ 10 ] [ 11 ]

La biblioteca estándar de C

La biblioteca GNU C es una capa de abstracción sobre la interfaz de llamadas al sistema del kernel de Linux.

Una biblioteca estándar de C para Linux incluye envoltorios para las llamadas al sistema del kernel de Linux; la combinación de la interfaz de llamadas al sistema del kernel de Linux y una biblioteca estándar de C es lo que construye la API de Linux. Algunas implementaciones populares de la biblioteca estándar de C son:

Aunque el panorama está cambiando, entre estas opciones, glibc sigue siendo la implementación más popular, hasta el punto de que muchos la consideran la opción predeterminada y el término equivalente a libc.

Adiciones a POSIX

Al igual que en otros sistemas tipo Unix , el núcleo de Linux cuenta con capacidades adicionales que no forman parte de POSIX:

DRM ha sido fundamental para el desarrollo e implementación de controladores de dispositivos gráficos libres y de código abierto bien definidos y de alto rendimiento, sin los cuales no estaría disponible la aceleración de renderizado; solo estarían disponibles los controladores 2D en el servidor X.Org . DRM se desarrolló para Linux y, posteriormente, se adaptó a otros sistemas operativos. [ 14 ]

Bibliotecas adicionales

ABI de Linux

La API y la ABI de Linux

La ABI de Linux es una interfaz binaria de aplicaciones (ABI) entre el kernel y el espacio de usuario. Al ser una interfaz de código máquina , la ABI de Linux está ligada al conjunto de instrucciones . Definir una ABI útil y mantenerla estable es responsabilidad de las distribuciones de Linux y los proveedores de software independientes (ISV) que desean vender y brindar soporte para su software propietario como binarios solo para una única ABI de Linux, en lugar de admitir múltiples ABI de Linux.

Se debe definir una ABI para cada conjunto de instrucciones, como x86 , x86-64 , MIPS , ARMv7-A (32 bits), ARMv8-A (64 bits), etc., con el orden de bytes , si ambos son compatibles.

Debe poder compilar el software con diferentes compiladores según las definiciones especificadas en la ABI y lograr una compatibilidad binaria completa. Algunos ejemplos de compiladores de software libre y de código abierto son GNU Compiler Collection y LLVM / Clang .

API integradas en el núcleo

Existen numerosas API internas del kernel que permiten la comunicación entre sus subsistemas. Si bien se mantienen relativamente estables, no se garantiza su estabilidad total. Una API interna del kernel puede modificarse cuando nuevas investigaciones o descubrimientos lo indiquen; el autor deberá realizar todas las modificaciones y pruebas necesarias.

El núcleo de Linux es un núcleo monolítico, por lo que los controladores de dispositivos son componentes del núcleo. Para facilitar el mantenimiento de los controladores de dispositivos (propietarios) por parte de las empresas fuera del árbol principal del núcleo, se han solicitado repetidamente API estables para dichos controladores. Los desarrolladores del núcleo de Linux han negado repetidamente garantizar API estables dentro del núcleo para los controladores de dispositivos. Garantizar esto habría frenado el desarrollo del núcleo de Linux en el pasado y lo seguiría haciendo en el futuro; además, debido a la naturaleza del software libre y de código abierto, no es necesario. Por lo tanto, por decisión propia, el núcleo de Linux no cuenta con una API estable dentro del núcleo. [ 15 ]

ABIs dentro del núcleo

Dado que no existen API estables en el núcleo, no puede haber ABI estables en el núcleo. [ 16 ]

API de abstracción

OpenGL es, en efecto, una API de abstracción que permite utilizar diversas GPU de múltiples proveedores sin necesidad de programar específicamente para cada una.
Pero la implementación de la especificación OpenGL se ejecuta en la CPU en el contexto del sistema operativo en ejecución. Uno de los objetivos de diseño de Vulkan era reducir la carga de trabajo del "controlador gráfico", es decir, la implementación de la API gráfica.

Para muchos casos de uso, la API de Linux se considera de nivel demasiado bajo, por lo que deben utilizarse API de mayor abstracción. Las API de nivel superior deben implementarse sobre las API de nivel inferior. Ejemplos:

Véase también

Referencias

  1. 1 2 "ControlGroupInterface" . freedesktop.org .
  2. "libevdev" . freedesktop.org .
  3. Alessandro Rubini (2006-11-02). "Llamadas al sistema del kernel" . linux.it . Consultado el 11 de noviembre de 2014 .
  4. Linus Torvalds (23/12/2012). "Re: [ Regresión con parche ] La confirmación de medios provoca un mal funcionamiento del espacio de usuario (antes: Re: Linux 3.8-rc1)" . Lista de correo del kernel de Linux . Consultado el 26/08/2014 . Si un cambio provoca que los programas de usuario fallen, es un error en el kernel. Nunca, NUNCA, culpamos a los programas de usuario.
  5. "Elegir entre portabilidad e innovación" . LWN.net . 2 de marzo de 2011.
  6. "Entrevista: Lennart Poettering - Lennart Poettering dará una charla sobre "Systemd: más allá de init" en FOSDEM 2011" . fosdem.org. 2011. Recuperado el 16 de junio de 2014. De hecho, a mi parecer, la API de Linux ha estado asumiendo el rol de la API POSIX y Linux es el punto central de todo el desarrollo de software libre. Por ello , solo puedo recomendar a los desarrolladores que intenten programar pensando únicamente en Linux y experimenten la libertad y las oportunidades que esto les ofrece. Así que, consigan una copia de The Linux Programming Interface , ignoren todo lo que dice sobre la compatibilidad con POSIX y pongan a programar su increíble software para Linux. ¡Es bastante liberador!
  7. Michael Kerrisk (31 de enero de 2016). "Cómo diseñar una API del kernel de Linux" . Consultado el 4 de febrero de 2016 .
  8. "Organización de llamadas al sistema" .
  9. "¿Crear una lista universal de llamadas al sistema?" . LKML . 27-02-2014.
  10. "Banderas como patrón de diseño de API de llamada al sistema" . LWN.net . 12 de febrero de 2014.
  11. "Sobre las llamadas al sistema y el vDSO" . LWN.net . 8 de junio de 2011.
  12. " [ PATCH, RFC ] random: introduce la llamada al sistema getrandom(2)" . LKML . 2014-07-17.
  13. "memfd.c" . GitHub .{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  14. "NetBSD 7.0 finalmente tendrá controladores DRM/KMS" . Phoronix . 19 de marzo de 2014.
  15. "La interfaz del controlador del kernel de Linux" .
  16. "Análisis de los cambios de ABI en el kernel de Linux" . Laboratorio ABI de Andrey Ponomarenko. 15 de marzo de 2016.
  • API del kernel de Linux 5.0 , API de gestión de memoria 5.0 (nuevo formato Sphinx )
  • La API del kernel de Linux 2.6.20 y 4.12 (en formato htmldocs obsoleto)
  • Revisión de los cambios de API/ABI para Linux
  • El libro "Linux Programming Interface" , "Linux and glibc API changes" (Linux y cambios en la API desde que se publicó "Linux Programming Interface" en 2010)
  • Mapa interactivo del kernel de Linux con las principales funciones y estructuras de la API, versión PDF.
  • Controladores de dispositivos Linux por Jonathan Corbet, Greg Kroah-Hartman y Alessandro Rubini, 3.ª edición
  • Explicación de la lista enlazada del kernel de Linux ( Archivado el 25/09/2009 en Wayback Machine)