El kernel

Qué es

En el centro de todo está el hardware. Metafóricamente podemos imaginar al hardware como una sala de control vacía, llena de palanquitas y lucecitas. No cualquiera puede operar tamaña complejidad y más de una persona en la sala es llamar a los problemas. Tomemos como caso concreto el disco rígido. No es más que una serie de casilleros donde guardar bytes. Si tenemos un solo archivo para guardar, que es usado por una sola aplicación y un único usuario entonces todo bien. Pero si tenemos varios archivos vamos a necesitar tener algún tipo de índice, un catálogo de nombres. Podríamos definir que desde el byte 0 al N está nuestro índice, y todas las aplicaciones deberían conocer en qué formato se guarda y accederlo correctamente. Mucho mejor es tener una biblioteca que todas las aplicaciones usen. Esta biblioteca proveerá ciertas convenientes abstracciones al resto de los programas. Por ejemplo, la abstracción "archivo" y la abstracción "directorio". El disco rígido, para las aplicaciones que usen esta biblioteca ya no es una tira inmanejable de bytes, sino un ordenado catálogo de archivos. Al mismo tiempo nos va a interesar que todas las aplicaciones normales de la computadora accedan al disco solamente mediante esta biblioteca, así garantizamos que todas respeten el formato de los índices del disco.

Y así como el disco podríamos nombrar a muchos otros mecanismos de hardware que para ser usados ordenadamente es necesario mediatizar su acceso. Esta biblioteca fue llamada "kernel". Entonces: El kernel es un componente del sistema que se situa por encima del hardware y provee toda una serie de abstracciones al resto de los programas. Veamos algunas de esas abstracciones.

Como es vital que siempre se respete el acceso ordenado a los dispositivos, en sistemas operativos modernos se implementó un mecanismo para que el kernel sea el único que pueda acceder al hardware. Cuando una aplicación llama a una función del kernel el procesador se pone en un modo especial (llamado modo supervisor). El procesador permite acceder al hardware sólo a código que ejecute con este modo activado. Es así como un usuario de un sistema unix no puede acceder al disco pasando por alto la abstracción "archivo".

Scheduler

Además de ser una biblioteca que provee abstracciones, el kernel es el árbitro que asigna tiempo de ejecución a distintas tareas. Estas tareas tienen asociadas recursos de la PC (p. ej. una lista de archivos abiertos) un área de memoria. A todo eso junto se lo llama proceso.

Una computadora con un solo procesador puede hacer sólo una cosa a la vez. A pesar de eso los sistemas operativos modernos, entre ellos Linux, usan técnicas para que varios programas puedan ejecutarse a la vez. El truco es cederle el procesador a una tarea y al mismo tiempo lanzar un cronómetro. Cuando la alarma del cronómetro suena, el kernel retoma el control y le cede "la palabra" a otra tarea. El kernel administra una lista de tareas que quieren el procesador y utiliza distintas técnicas para asegurar que todas lo obtengan con una frecuencia aceptable. Al componente que realiza esta operación de ceder el procesador, retomarlo y volver a cederlo se lo llama "scheduler" (traducido a veces como "planificador").

Llamadas de sistema

Como se explicó más arriba, el código que conforma el kernel corre con un modo especial del procesador (supervisor) que le permite acceder al hardware. Entonces, una llamada a una función del kernel no puede ser igual a una simple llamada dentro de un proceso. A estas llamadas especiales se las conoce en inglés como "system calls", es decir "llamadas del sistema".

La forma especial de ejecutar una llamada de sistema implica generar una excepción. Las excepciones son usualmente condiciones de error, antes los cuales el kernel toma el control. Pero en este caso no hay ningún error, el kernel toma el control, advierte que la intención es efectuar una llamada y realiza la tarea pedida, por ejemplo... abrir un archivo. A este mecanismo se lo conoce como "kenel trap".

Si los programadores comunes no tenemos que preocuparnos por los kernel traps, y podemos llamar a funciones del kernel como si fueran funciones de C, es porque el sistema viene con una biblioteca que provee una función de C por cada llamada al sistema. Cada una de esas funciones es muy chiquita: lo único que hace es producir el kernel trap correspondiente.

Continuará!

Podés seguir leyendo sobre temas relacionados, como file descriptors, o programación de sockets.


Índice


Por Nicolás Lichtmaier. Cualquier comentario o pedido de mayor claridad o extensión será bien recibido.