vmlinux es un archivo ejecutable enlazado estáticamente y que contiene el núcleo Linux en uno de los formatos ejecutables soportados por Linux, tales como ELF, COFF y a.out. El archivo vmlinux puede utilizarse en una depuración del núcleo, para generar la tabla de símbolos u otras operaciones, pero para usarlo como núcleo del sistema operativo debe ser capaz de ejecutarse e iniciar el computador. Para esto se debe agregar un encabezado de arranque múltiple, un sector de arranque y rutinas de inicialización.

Núcleo Linux: proceso de arranque y descompresión.

Localización

editar

Tradicionalmente, el núcleo se localiza en el directorio raíz del sistema de archivos; sin embargo, algunos sistemas i386 sólo pueden direccionar los primeros 1024 cilindros del disco duro en tiempo de arranque, dado que el cargador de arranque utiliza los controladores del BIOS para acceder al disco duro. Para solventar esta limitación, los distribuidores de Linux animaban a los usuarios a crear una partición al inicio de sus discos duros, específicamente para almacenar el cargador de arranque y los archivos relacionados con el núcleo. GRUB, LILO y SYSLINUX son cargadores comunes.

Por convención, esta partición se monta en el sistema de archivos como /boot. Esto se estandarizó luego en el "Estándar para Sistemas Jerárquicos de Archivos" (FHS por sus siglas en inglés), que ahora requiere que la imagen del núcleo Linux se encuentre en / o en /boot, aunque no existe ninguna restricción técnica que obligue a que esto sea así.

Compresión

editar

Algunas arquitecturas tienen restricciones en el espacio que se puede asignar a la imagen ejecutable del vmlinux por lo que se ha hecho costumbre comprimir este archivo, y para esto es común utilizar el zlib, que requiere una rutina de descompresión pequeña que puede ser incluida en la imagen resultante. En tiempo de ejecución, la rutina descomprime el núcleo (algunos sistemas muestran unos puntos en la pantalla mientras esto ocurre), y luego continúa con el arranque e inicialización del sistema.

En realidad la compresión y descompresión del vmlinux no es un factor necesario para el arranque del sistema. Sin embargo, las restricciones impuestas por algunas arquitecturas, especialmente en plataformas i386, eran bastante limitantes haciendo necesaria la compresión. En la arquitectura SPARC, el vmlinux se comprime utilizando gzip, porque el cargador de arranque SILO descomprime en forma natural las imágenes gzip.

El nombre del archivo de la imagen generada del vmlinux no es en realidad importante, pero por convención se llama vmlinuz o zImage.

bzImage

editar
 
Anatomía de un bzImage.

Conforme el núcleo Linux fue madurando, los núcleos generados por los usuarios crecieron de tamaño, más allá de los límites impuestos por ciertas arquitecturas. Para resolver este problema se creó el archivo bzImage con el que el núcleo se divide y almacena en regiones no contiguas de memoria.

Existe cierta confusión con el nombre de este archivo, pues muchas personas consideran que el prefijo bz- significa que la compresión bzip2 se utilizó para comprimir el archivo (el paquete bzip2 algunas veces se distribuye con herramientas que tienen el prefijo bz- tales como bzless, bzcat), pero en este caso, el bz proviene de big zImage.

El archivo bzImage contiene la concatenación del: bootsect.o + setup.o + misc.o + piggy.o. El archivo piggy.o contiene el vmlinux comprimido con gzip (en este punto el vmlinux suele llamarse vmlinuz o zImage) en su sección de datos (ELF por sus siglas en inglés). Todos los archivos fuente se encuentran en arch/i386/boot/.

No existe una herramienta específica para descomprimir el archivo bzImage, pero existe un procedimiento llamado extract-ikconfig, con este se descomprime la imagen y se extraen algunas directivas para el administrador de paquetes RPM. Este procedimiento se podría modificar para extraer la imagen directamente. Típicamente se instala bajo /usr/lib/debug/lib/modules/`uname -r`/vmlinux.

Vea también esta entrada en la lista de correo del "Linux Kernel" y este artículo ambos están en inglés.


Etimología

editar

Tradicionalmente, las plataformas UNIX llaman a la imagen del núcleo /unix. Con el desarrollo de la memoria virtual se comenzó a utilizar el prefijo vm- para diferenciar los núcleos que soportan esta característica. El nombre vmlinux es una derivación de vmunix, mientras que en vmlinuz la letra z al final denota que el archivo está comprimido.

Formato ejecutable

editar

Este es el encabezado del ELF de una imagen ejecutable de un núcleo i386 2.6.7.

$ readelf -h vmlinux
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Intel 80386
  Version:                           0x1
  Entry point address:               0xc019d000
  Start of program headers:          52 (bytes into file)
  Start of section headers:          3135092 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         3
  Size of section headers:           40 (bytes)
  Number of section headers:         33
  Section header string table index: 30

Véase también

editar

Enlaces externos

editar