El núcleo no hace gran cosa en realidad. Creo que una buena forma de resumirlo es que hace que el hardware haga lo que los programas quieren, fácil y eficientemente.
El procesador sólo puede ejecutar una instrucción cada bez, pero los sistemas Linux parecen estar haciendo montones de cosas simultáneamente. El núcleo lo consigue cambiando de tarea en tarea muy rápidamente. Saca el mejor partido del procesador haciendo un seguimiento de qué procesos están listos para trabajar y cuáles están esperando algo como un registro de un archivo del disco duro o una entrada desde el teclado. Esta tarea del núcleo se llama scheduling (programación).
Si un programa no hace nada, no necesita estar en la RAM. Incluso un programa que hacel algo puede tener partes que no hacen nada. El espacio de direcciones de cada programa está dividido en páginas. El Núcleo observa qué páginas de qué procesos son las que más se usan. Las que no se usan tanto se pueden retirar a la partición de swap. Cuando se vuelven a necesitar, se puede guardar otra página poco utilizada para hacerle sitio. Esto es el manejo de la memoria virtual.
Si alguna vez has compilado tu propio Kernel, habrás notado que hay muchas opciones para dispositivos específicos. El núcleo contiene un montón de código específico para hablar con varios tipos de hardware y presentarlo todo de una forma uniforme a los programas de aplicación.
El Núcleo tambien controla el sistema de archivos, la comunicación entre procesos y un montón de cosas relacionadas con redes.
Una vez que se carga el núcleo, lo primero que hace es buscar un programa init
para
ejecutarlo.
La mayor parte de la configuración del núcleo se hace cuando lo construyes, usando make
menuconfig
o make xconfig
en /usr/src/linux/
(o donde sea que estén
tus fuentes del núcleo de Linux). Puedes reajustar el modo de vídeo por defecto, sistema de archivos
de raíz, dispositivo de swap y tamaño de utilización del disco RAM con rdev
. Estos
parámetros, y más, también se le pueden pasar al núcleo desde lilo. Pudes darle a lilo parámetros
para pasar al núcleo en lilo.conf o en el indicador de lilo. Por ejemplo, si quisieras usar hda3 como
sistema de archivos raíz en lugar de hda2, podrías teclear
LILO: linux root=/dev/hda3
Si estás construyendo un sistema a partir de los fuentes, puedes simplificarte la vida creando un núcleo "monolítico". O sea, sin módulos. Así no tendrás que copiar módulos del núcleo en el sistema destino.
NOTA: El "logger" del núcleo utiliza el archivo System.map
para determinar
los nombres de los módulos que generan los mensajes. El programa top
también usa esta
información. Cuando copies el núcleo en el sistema destino, copia también System.map
.
Piensa en esto: /dev/hda3
es un tipo de archivo especial que describe una partición
del disco. Pero vive en un sistema de archivos como cualquier otro archivo. El núcleo quiere saber
qué partición montar como sistema de archivos raíz - todavía no tiene un sistema de archivos. ¿Cómo
puede leer /dev/hda3
para averiguar qué partición montar?
Si aún no lo has hecho: construye tu propio núcleo. Lee toda la información de ayuda para cada opción.
Prueba cuan pequeño puedes hacer un núcleo que funcione. ¡Puedes aprender mucho quitando lo que no debes!
Lee "The Linux Kernel" (URL abajo) y mientras lo haces, encuentra las partes del código fuente a las que se refiere. El libro (cuando escribo esto) se refiere a la versión 2.0.33, que está bastante desfasada. Será más fácil de seguir si te bajas esta versión vieja y lees ese fuente. Es sorprendente encontrar trozos de código C llamados "process" y "page".
¡Hackea! Prueba si puedes hacer que tire mensajes extra o algo así.
/usr/src/linux/README
y el contenido de /usr/src/linux/Documentation/
(En tu sistema esto podría estar en otro sitio)make menuconfig
o make
xconfig