¿Cómo se escribió el kernel?

¿Cómo se escribió el kernel?

Ejecutar un programa en modo kernel prohíbe el uso de la biblioteca C estándar porque lo único a lo que está vinculado su programa es el propio kernel. Entonces puedo usar funciones definidas en el kernel. Pero el kernel en sí es un programa escrito en C y compilado para alguna arquitectura particular. Y no debería usar la biblioteca estándar C, pero tampoco debería usar ningún controlador, ya que los controladores son módulos cargables. Entonces mi pregunta es ¿qué funciones C reales se utilizan al escribir un kernel? ¿Cómo se puede interactuar con el hardware no a través del kernel? No me digas que mire las fuentes, es un nivel demasiado alto para mí, TY.

Respuesta1

El kernel Unix tradicionalmente ha incluidoalgunocódigo en lenguaje ensamblador. No he mirado su código fuente recientemente, pero sospecho que sigue siendo cierto.

Ver¿Cómo se comunica realmente un controlador con un dispositivo de hardware? para obtener una descripción general de ese tema. Las respuestas a esa pregunta analizan dos tipos de arquitectura informática. En un sistema que utiliza E/S asignadas por puerto (PMIO), el kerneldebeestar escrito parcialmente en lenguaje ensamblador, aunque es posible que pueda arreglárselas con un par de rutinas muy breves. En un sistema que utiliza E/S asignadas en memoria (MMIO), incluso los controladores de dispositivos se pueden escribir completamente en C. Todo lo que necesitan hacer es declarar un puntero, establecerlo igual a la dirección virtual del dispositivo y luego usarlo. manipular el dispositivo como si estuviera accediendo a la memoria.

Respuesta2

No todos los controladores son módulos cargables, ser cargables es simplemente una opción, pero algunos controladores cruciales no se cargan dinámicamente, son parte del kernel.

Respuesta3

El kernel reproduce estáticamente una gran cantidad de funciones proporcionadas por libc, dentro de sí mismo.

Al igual que en la programación C en modo de usuario, una función se puede definir en una unidad de compilación y otra unidad puede simplemente hacer referencia a ella (generalmente a través de un archivo de encabezado), el compilador la convertirá en una referencia indefinida y el vinculador la vinculará con el unidad de compilación que realmente proporciona el símbolo.

La carga de módulos del kernel funciona según el mismo principio quecarga dinámicay se describe aquí: http://www.tldp.org/LDP/tlk/modules/modules.html

información relacionada