Interfaces del kernel de Linux

Una descripción general y comparación de la API y ABI del kernel de Linux.
API de Linux, ABI de Linux y API y ABI dentro del núcleo

El núcleo de Linux ofrece múltiples interfaces para código de modo kernel y de espacio de usuario que se utilizan para distintos propósitos y que tienen distintas propiedades por diseño. Existen dos tipos de interfaz de programación de aplicaciones (API) en el núcleo de Linux:

  1. la API de "espacio de usuario del núcleo"; y
  2. la API "interna del kernel".

API de Linux

La API de Linux está compuesta por la interfaz de llamada del sistema del kernel de Linux, la biblioteca C de GNU (por GNU ), libcgroup , [1] libdrm , libalsa y libevdev [2] (por freedesktop.org ).
Comparación entre API de Linux y API de POSIX

La API de Linux incluye la API de espacio de usuario-núcleo, que permite que el código en el espacio de usuario acceda a los recursos y servicios del sistema del núcleo de Linux. [3] Está compuesta por la interfaz de llamada del sistema del núcleo de Linux y las subrutinas en la biblioteca estándar de C. El foco del desarrollo de la API de Linux ha sido proporcionar las características utilizables de las especificaciones definidas en POSIX de una manera que sea razonablemente compatible, robusta y de alto rendimiento, y proporcionar características útiles adicionales no definidas en POSIX, al igual que las API de espacio de usuario-núcleo 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 propia, se ha mantenido estable a lo largo de las décadas mediante una política de no introducir cambios disruptivos; 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. [ cita requerida ]

Gran parte del software libre y de código abierto disponible está escrito para la API POSIX. Dado que se destina mucho más desarrollo al núcleo de Linux en comparación con otras combinaciones de núcleo y biblioteca estándar de C compatibles con POSIX, [ cita requerida ] el núcleo de Linux y su API se han ampliado con características adicionales. La programación para la API completa de Linux, en lugar de solo la API POSIX, puede proporcionar ventajas en los casos en que esas características adicionales sean útiles. Ejemplos actuales bien conocidos son udev , systemd y Weston . [5] Personas como Lennart Poettering abogan abiertamente por preferir la API de Linux sobre la API POSIX, donde esto ofrece ventajas. [6]

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

Interfaz de llamada del sistema del kernel de Linux

La interfaz de llamadas del sistema de un núcleo es el conjunto de todas las llamadas del sistema implementadas y disponibles en un núcleo. En el núcleo de Linux, varios subsistemas, como el Direct Rendering Manager (DRM), definen sus propias llamadas del sistema, todas las cuales forman parte de la interfaz de llamadas del sistema.

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

La biblioteca estándar de C

La biblioteca GNU C es un contenedor de la interfaz de llamada al sistema del kernel de Linux.

Una biblioteca estándar de C para Linux incluye contenedores para las llamadas del sistema del núcleo de Linux; la combinación de la interfaz de llamadas del sistema del núcleo 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

Adiciones a POSIX

Al igual que en otros sistemas tipo Unix , existen capacidades adicionales del kernel Linux que no son parte de POSIX:

La DRM ha sido fundamental para el desarrollo y la 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 ninguna aceleración de renderizado; solo los controladores 2D estarían disponibles en el servidor X.Org . La DRM se desarrolló para Linux y, desde entonces, también se ha adaptado a otros sistemas operativos. [14]

Otras bibliotecas

ABI de Linux

La API de Linux y la ABI de Linux

El término Linux ABI se refiere a una ABI de espacio de usuario y núcleo. La interfaz binaria de aplicación se refiere a los binarios compilados, en código de máquina . Por lo tanto, cualquier ABI de este tipo está vinculada al conjunto de instrucciones . Definir una ABI útil y mantenerla estable es menos responsabilidad de los desarrolladores del núcleo Linux o de los desarrolladores de la biblioteca C de GNU, y más tarea de las distribuciones 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 brindar soporte para 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 ser posible compilar el software con diferentes compiladores según las definiciones especificadas en la ABI y lograr una compatibilidad binaria total. Los compiladores que son software libre y de código abierto son, por ejemplo, GNU Compiler Collection , LLVM / Clang .

API dentro del núcleo

Existen muchas API internas del núcleo que permiten que los subsistemas del núcleo interactúen entre sí. Se mantienen bastante estables, pero no hay garantía de estabilidad. Una API interna del núcleo se puede cambiar cuando una nueva investigación o nuevos conocimientos indiquen esa necesidad; todas las modificaciones y pruebas necesarias deben ser realizadas por el autor.

El núcleo Linux es un núcleo monolítico, por lo que los controladores de dispositivos son componentes del núcleo. Para aliviar la carga de las empresas que mantienen sus controladores de dispositivos (propietarios) fuera del árbol principal del núcleo, se han solicitado repetidamente API estables para los controladores de dispositivos. Los desarrolladores del núcleo Linux han negado repetidamente garantizar API estables en el núcleo para los controladores de dispositivos. Garantizar esto habría hecho tambalear el desarrollo del núcleo Linux en el pasado y lo seguirá haciendo en el futuro y, debido a la naturaleza del software libre y de código abierto, no es necesario. Por lo tanto, por elección propia, el núcleo Linux no tiene una API estable en el núcleo. [15]

ABIs dentro del núcleo

Dado que no hay API estables dentro del núcleo, no puede haber ABI estables dentro del núcleo. [16]

API de abstracción

OpenGL es de hecho una API de abstracción para utilizar diversas GPU de múltiples proveedores sin la necesidad de programar para cada una específicamente.
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 hacer que el "controlador gráfico", es decir, la implementación de la API gráfica, hiciera menos.

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

Véase también

  • La interfaz de programación de Linux por Michael Kerrisk
  • Semáforo (programación)
  • Llamada al sistema  : es una función que facilita que los programas soliciten servicios al núcleo.
    • eventofd()
    • netlink  – familia de sockets utilizada para la interconexión de procesos entre el núcleo y los procesos del espacio de usuario, diseñada como sucesora de ioctl ; Netlink fue añadido por Alan Cox durante el desarrollo del núcleo de Linux 1.3 como una interfaz de controlador de caracteres para proporcionar múltiples enlaces de comunicaciones bidireccionales entre el núcleo y el espacio de usuario. Luego, Alexey Kuznetsov lo extendió durante el desarrollo del núcleo de Linux 2.1 para proporcionar una interfaz de mensajería flexible y extensible a la nueva infraestructura de enrutamiento avanzada. Desde entonces, los sockets Netlink se han convertido en una de las principales interfaces que los subsistemas del núcleo proporcionan a las aplicaciones del espacio de usuario en Linux. Los controladores WNIC modernos lo utilizan para comunicarse con el espacio de usuario.
  • API de Windows  : artículo sobre las distintas API disponibles en los sistemas operativos Microsoft Windows
  • Wine  : una capa de compatibilidad entre Linux y los programas escritos para Microsoft Windows
  • libhybris – capa de compatibilidad entre Linux y programas escritos para Android

Referencias

  1. ^ desde "ControlGroupInterface". freedesktop.org .
  2. ^ "libevdev". freedesktop.org .
  3. ^ Alessandro Rubini (2006-11-02). "Llamadas al sistema del núcleo". linux.it . Consultado el 11-11-2014 .
  4. ^ Linus Torvalds (23 de diciembre de 2012). "Re: [Regresión con parche] La confirmación de medios hace que el espacio de usuario se comporte mal (antes: Re: Linux 3.8-rc1)". Lista de correo del kernel de Linux . Consultado el 26 de agosto de 2014. Si un cambio hace que los programas de usuario dejen de funcionar, es un error del kernel. NUNCA culpamos a los programas de usuario.
  5. ^ "Elegir entre portabilidad e innovación". LWN.net . 2011-03-02.
  6. ^ "Entrevista: Lennart Poettering - Lennart Poettering dará una charla sobre "Systemd: más allá de init" en FOSDEM 2011". fosdem.org. 2011. Consultado el 16 de junio de 2014. De hecho, según mi forma de ver las cosas, la API de Linux ha estado asumiendo el papel de la API de POSIX y Linux es el punto focal de todo el desarrollo de software libre. Debido a eso, solo puedo recomendar a los desarrolladores que intenten hackear solo con Linux en mente y experimenten la libertad y las oportunidades que esto les ofrece. Entonces, consiga una copia de The Linux Programming Interface , ignore todo lo que dice sobre la compatibilidad con POSIX y hackee su increíble software Linux. ¡Es bastante reconfortante!
  7. ^ Michael Kerrisk (31 de enero de 2016). «Cómo diseñar una API del núcleo de Linux» . Consultado el 4 de febrero de 2016 .
  8. ^ "Organización de llamadas al sistema".
  9. ^ "¿Cómo crear una lista universal de llamadas al sistema?". LKML . 2014-02-27.
  10. ^ "Banderas como patrón de diseño de API de llamada al sistema". LWN.net . 2014-02-12.
  11. ^ "Sobre las llamadas al sistema y el vDSO". LWN.net . 8 de junio de 2011.
  12. ^ "[PATCH, RFC] random: introducir llamada al sistema getrandom(2)". LKML . 17 de julio de 2014.
  13. ^ "memfd.c". GitHub . Archivado desde el original el 22 de abril de 2014.
  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 núcleo Linux". Laboratorio ABI de Andrey Ponomarenko. 15 de marzo de 2016.
  • La API del kernel de Linux 5.0, API de administració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 Interfaz de programación de Linux, cambios en la API de Linux y glibc desde que se publicó La interfaz de programación de Linux 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 de septiembre de 2009 en Wayback Machine
Obtenido de "https://es.wikipedia.org/w/index.php?title=Interfaces_del_kernel_de_Linux&oldid=1250593013#API_de_Linux"