¿Cómo es capaz un kernel de Linux de acceder a su initramfs / initrd asignado?


8

Estoy tratando de entender el proceso de arranque de una máquina en su conjunto desde el momento en que presionas el botón de encendido. Hay una pieza desde el gestor de arranque hasta la etapa initramfs que no entiendo muy bien entre algunos otros bits más pequeños.

Dada esta configuración de Grub para una entrada, tomada de una instalación predeterminada de Ubuntu reciente:

insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo    'Loading Linux x.y.z ...'
linux   /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset 
echo    'Loading initial ramdisk ...'
initrd  /initrd.img-x.y.z

¿Qué hace esto realmente en términos del estado del sistema y la memoria? Entiendo que la tarea de Grub es "cargar y ejecutar el núcleo" y tiene su propio conjunto de módulos para acceder a los archivos en los dispositivos (o red) para acceder a ellos. En el ejemplo aquí insmods, set rooty search- pero esto es solo desde la perspectiva de Grub, y no se comparte con el núcleo, ¿verdad?

También supongo que Grub está cargando (¿una copia?) Del núcleo en la memoria ( linuxcomando ) y lo está pateando para iniciar la ejecución. (aparentemente, dos pasos diferentes, entonces, ¿cómo?) Los parámetros dados se pueden leer en el núcleo e interpretar (¿es esta una gran cadena asignada a la memoria en algún lugar?) y proporcionan las opciones para organizar las cosas solicitadas.

También veo esta initrdopción. Esto apunta a mis initramfs comprimidos con gzip, necesarios para arrancar el dispositivo raíz real especificado por root=. Pero, ¿cómo se proporciona este initramfs al núcleo? No se le pasa ninguna dirección de memoria a donde pueda cargarla, ni puede acceder a ella, ya que ya está cargada antes de que se inicie el núcleo. Parte de la documentación del kernel dice que se puede acceder a este 'dispositivo' del sistema de archivos initramfs /dev/ram0, pero no veo cómo se convierte en un archivo de dispositivo accesible para empezar. Supongo que sucede algo bajo el agua que no veo.

Tampoco veo cómo esto se relaciona con otros cargadores de arranque, incluidas las plataformas integradas, por ejemplo, usando U-boot / Coreboot. ¿Está haciendo lo mismo que Grub (las mismas direcciones de memoria estándar?) Y en qué medida se comparan con Grub con respecto a la carga de kernel / initrd?

Para aclarar mis preguntas, creo que entiendo por qué existen las diferentes etapas de arranque y qué transiciones tienen lugar, sin embargo, no veo cómo se llevan a cabo y cuáles son las responsabilidades exactas de cada una de las etapas. Tengo la sensación de que me estoy perdiendo algún "estándar" al que todo se reduce.

Agradecería alguna explicación sobre esto.


Tenga en cuenta el bootcomando implícito al final de la secuencia. No estoy seguro de qué hace exactamente en Grub, pero si usa la línea de comandos de Grub para ingresar estos comandos manualmente, debe hacerlo booto simplemente se quedará para siempre grub>(o al menos, hasta que se aburra y apague la computadora) ) Los comandos anteriores "simplemente" configuran un entorno.
un CVn

@ MichaelKjörling Según tengo entendido ahora, boothará que la CPU salte a la dirección del núcleo cargado (inicio de ejecución). Para una entrada de menú, esto se define implícitamente. ver esto .
gertvdijk

Respuestas:


5

En general, tiene que haber algún tipo de protocolo porque, por lo general, no es suficiente cargar un archivo en la memoria y saltar a una ubicación específica, sino que debe pasar argumentos adicionales como los parámetros del kernel, es decir, acceder a los argumentos de memdisk desde DOS .

Como esto depende del hardware (el brazo es diferente de x86, por ejemplo), debe encontrar la información correcta; consulte este artículo sobre el brazo de arranque o el protocolo de arranque Linux / x86 para ver algunos ejemplos.


6

El gestor de arranque almacena el initrd en una ubicación en la memoria y le dice al núcleo la dirección de memoria de la imagen initrd. La mayoría de los sistemas linux modernos usan el esquema initramfs usando dracut , que en realidad es un archivo cpio (en lugar de una imagen de disco) que se descomprime en un sistema de archivos tmpfs creado por el núcleo poco después de la ejecución.


Llegué tan lejos; pero, ¿cómo le dice el gestor de arranque al núcleo la ubicación en la memoria? ¿Dónde recupera el núcleo esa dirección de memoria?
gertvdijk

3
@gertvdijk eche un vistazo a kernel.org/doc/Documentation/x86/boot.txt , describe cómo el gestor de arranque se comunica con el núcleo, es decir, el gestor de arranque también debe proporcionar los parámetros del núcleo, etc.
Ulrich Dangel

@UlrichDangel Nice! Exactamente lo que estaba buscando. Aparentemente, es un protocolo específico de hardware (x86 en este caso) que lo describe todo. Escríbelo como respuesta con una breve descripción y lo aceptaré.
gertvdijk
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.