jueves, 30 de diciembre de 2010

¿Qué es el Kernel de Linux y qué hace?

Este es de HTG, el original lo pueden encontrar aquí. Aún cuando traducimos el término kernel como núcleo, pueden encontrar los dos términos en cualquier bibliografía usados indistintamente. Este es mas o menos una introducción a un par de conceptos generales, más adelante tengo un material un poco mas detallado que les traeré a principios de año, mientras ahí les va, ya casi acaba el año.....

¿Qué es el núcleo de Linux y qué hace?
Con más de 13 millones de líneas de código, el núcleo de Linux es uno de los mayores proyectos de código abierto en el mundo, pero que es un núcleo y para qué se utiliza?
Así que ¿Que es un núcleo?
Un núcleo es el nivel más bajo de software fácilmente reemplazable que interactúa con el hardware de su ordenador. Se encarga de interconectar todas las aplicaciones que se ejecutan en el "modo usuario" con el hardware físico, y permite que ciertos procesos, conocidos como servidores, obtengan información unos de otros utilizando la comunicación entre procesos (Inter Process Communication IPC).

Los diferentes tipos de núcleos.
Hay, por supuesto, diferentes maneras de construir un núcleo, varias consideraciones relativas a su arquitectura, cuando se diseña uno desde cero. En general, la mayoría de los núcleos se dividen en tres tipos: micronúcleo, núcleo monolítico, e híbridos. Linux es un núcleo monolítico, mientras que OS X (XNU) y Windows 7 usan núcleos híbridos. Demos un rápido recorrido por las tres categorías para que podamos entrar en detalles más adelante.

Micronúcleo.
El enfoque de un micronúcleo es administrar solo lo necesario: CPU, memoria, e IPC. Casi todo lo demás en una computadora puede ser visto como accesorio y se puede manejar en modo usuario (user mode). Los micronúcleos tienen la ventaja de la portabilidad, ya que no tienes que preocuparte si cambia la tarjeta de vídeo o incluso tu sistema operativo, siempre y cuando (el SO) siga tratando de acceder al hardware de la misma manera. Los micronúcleos tienen además un tamaño muy pequeño, tanto en memoria como en espacio de instalación, y tienden a ser más seguros porque sólo los procesos específicos se ejecutan en modo usuario que carece de los permisos del nivel del modo de supervisor.

Pros
    * Portabilidad
    * Ocupa poco espacio de instalación
    * Significa una huella de memoria pequeña
    * Seguridad

Contras
    * El hardware es más abstracto a través de los controladores
    * El Hardware puede reaccionar más lentamente porque los controladores operan en modo usuario
    * Los procesos tienen que esperar en colas para obtener información
    * Los procesos no pueden acceder a otros procesos sin tener que esperar

Núcleos monolíticos.
Los núcleos monolíticos son lo contrario de los micronúcleos, ya que abarcan no sólo el CPU, la memoria, e IPC, sino que también incluyen cosas como los controladores de dispositivos, gestión de sistema de archivos y las llamadas al sistema. Los núcleos monolíticos tienden a ser mejores en el acceso al hardware y en la multitarea, debido a que si un programa tiene que obtener información de la memoria o de otro proceso en ejecución tiene una manera más directa de obtenerla y no tiene que esperar en una cola para hacer las cosas. Sin embargo, esto puede causar problemas porque hay mas cosas que se ejecutan en modo supervisor, lo que significa más cosas que pueden hacer caer el sistema si una de ellas no se comporta correctamente.

Pros
    * Un acceso más directo al hardware para los programas
    * La comunicación interprocesos es mas sencilla
    * Si el dispositivo está soportado, debería funcionar sin instalaciones adicionales
   * Los Procesos reaccionan más rápido porque no hay una cola para usar tiempo del procesador.

Contras
    * Tienen una huella de instalación mayor
    * También ocupan mas espacio en memoria
    * Son menos seguros, porque todo se ejecuta en modo supervisor

Núcleos híbridos.
Los núcleos híbridos tienen la capacidad de escoger y elegir lo que desea ejecutar en modo de usuario y lo que desea ejecutar en modo supervisor. Frecuentemente cosas como los controladores de dispositivos y sistema de E/S de los archivos se ejecutarán en modo usuario mientras que la parte de IPC y las llamadas al sistema se mantendrán en modo de supervisor. Esto ofrece lo mejor de ambos mundos, pero a menudo requieren más trabajo de parte del fabricante de hardware porque deja la responsabilidad de los controladores en sus manos. También pueden tener algunos problemas de latencia que son inherentes a los micronúcleos.

Pros
    * El desarrollador puede escoger y elegir lo que se ejecuta en modo de usuario y lo que se ejecuta en modo supervisor
    * Tiene una huella de instalación mas pequeña que los monolíticos
    * Es más flexible que otros modelos

Contras
    * Pueden sufrir los mismos retardos de procesos que los micronúcleos
    * Los controladores de dispositivos deben ser administrados por el usuario (típicamente)

¿Dónde están los archivos del núcleo de Linux?
El archivo del núcleo, en Ubuntu, se almacena en la carpeta /boot y se llama vmlinuz-versión. El nombre vmlinuz viene del mundo Unix donde en los años 60 se solía llamar a sus núcleos simplemente "Unix", cuando se desarrolló por primera vez en los años 90 Linux comenzó a llamar a su núcleo "Linux".
Cuando la memoria virtual fue desarrollada para facilitar la capacidad de realizar múltiples tareas, se puso delante del nombre "VM" para mostrar que el núcleo soportaba memoria virtual. Durante un tiempo el núcleo de Linux se llamó "vmlinux", pero el núcleo se hizo demasiado grande para caber en la memoria de arranque disponible de modo que comprimieron el núcleo y se cambió a la x al final por una Z para indicar que fue resultado de comprimirlo con con zlib. No siempre se utiliza el mismo tipo de compresión, a menudo se sustituye por LZMA o BZIP2, así que algunos son llamados simplemente zImage.

 
La numeración de la versión usa el formato ABCD donde AB probablemente será 2.6, C será la versión, y D indica parches o correcciones.
En el directorio /boot hay además varios archivos muy importantes como initrd.img-versión, System.map-version, y config-version. El archivo initrd es utilizado como un disco RAM pequeño que extrae y ejecuta el archivo del núcleo verdadero. El archivo System.map se utiliza para la gestión de la memoria antes de que el núcleo sea totalmente cargado, config-version le dice al núcleo qué opciones y módulos deberá cargar en la imagen del núcleo cuando el que esté siendo compilado.
 
Arquitectura del núcleo de Linux.
Debido a que el núcleo de Linux es monolítico, tiene una huella más grande y una mayor complejidad que otros tipos de núcleos. Esta fue una característica de diseño que generó algún debate en los primeros días de Linux y aún tiene algunas de las fallas en el diseño inherentes a los núcleos monolíticos.
Una cosa que los desarrolladores del núcleo de Linux han hecho para evitar estas fallas es hacer módulos del núcleo que pueden ser cargados y descargados en tiempo de ejecución, lo que significa que ud puede agregar o quitar características de su núcleo en el momento. Esto puede ir más allá de la adición de funcionalidades de hardware al núcleo, mediante la inclusión de módulos que ejecutan procesos de servidor, como la virtualización de bajo nivel, pero también puede permitir el reemplazo total del núcleo sin necesidad de reiniciar el equipo en algunos casos.
Imagine actualizar a un Service Pack de Windows sin necesidad de reiniciar el sistema ...

Los módulos del núcleo.
 

¿Qué tal si Windows incluyera todos los drivers ya instalados y solo hubiera que activar los que necesita? Esto es esencialmente lo que hacen los módulos del núcleo en Linux. Los módulos del núcleo, también conocidos como módulos cargables del núcleo (LKM Loadable kernel Module), son esenciales para mantener el funcionamiento del núcleo con todo el hardware sin consumir toda la memoria disponible.
Un módulo generalmente, agrega funcionalidades al núcleo base para cosas como dispositivos, sistemas de archivos y llamadas al sistema. Los LKM tienen la extensión ".ko" y normalmente se almacenan en el directorio /lib/modules. Debido a su naturaleza modular, ud puede personalizar su núcleo configurando la carga o no de módulos, durante el arranque con el comando menuconfig o editando el archivo /boot/config, o puede cargar y descargar los módulos sobre la marcha con el comando modprobe.
En algunas distribuciones hay disponibles módulos de código cerrado y de terceros, como Ubuntu, y no pueden ser instalados de forma predeterminada porque el código fuente de los módulos no está disponible. La empresa desarrolladora del software (por ejemplo, nVidia, ATI, entre otros) no proporciona el código fuente, sino que construye sus propios módulos y compila los archivos .ko para su distribución. Si bien estos módulos son gratis (como en cerveza gratis, no libres como en libertad de expresión) y por lo tanto no están incluidos en algunas distribuciones, debido a que quienes los mantienen sienten que "contaminan" el núcleo, incluyendo software no-libre.
Un núcleo no es mágico, pero es completamente esencial para que cualquier equipo funcione correctamente. El núcleo de Linux es diferente al de OS X y Windows, ya que incluye los controladores a nivel del núcleo y hace que muchas cosas funcionen out-of-the-box. Esperamos que conozca un poco más acerca de cómo el software y el hardware trabajan en conjunto y que archivos necesita para arrancar su ordenador.

Recursos adicionales:
1.- Mapa interactivo del kernel de Linux. Es un mapa navegable del núcleo, enlazado a las fuentes reales para quienes quieran leer el código. Ahí está TODO, y mas