Análisis del proceso de arranque de Linux

  
                  

El proceso de inicio se refiere a todo el proceso desde que se enciende la computadora hasta que LINUX muestra la pantalla de inicio de sesión del usuario. El análisis del proceso de arranque de Linux también es una buena manera de entender el principio de funcionamiento básico de LINUX.

Comience el primer paso: cargue la BIOS

Cuando encienda la computadora, la computadora cargará primero la información de la BIOS. La información de la BIOS es tan importante que la computadora debe encontrarla desde el principio. . Esto se debe a que el BIOS contiene información sobre la CPU, la información de la secuencia de inicio del dispositivo, la información del disco duro, la información de la memoria, la información del reloj, las características de PnP, etc. Después de eso, la computadora tiene un espectro de saber qué dispositivo de hardware se debe leer. Después de que la BIOS pasa el control del sistema al primer sector del disco duro, Linux comienza a controlar el sistema.

Comience el segundo paso: leer MBR

El primer sector de la pista 0 en el disco duro se llama MBR, que es el registro de inicio maestro, que es el registro de inicio maestro. Tiene 512 bytes, pero puede almacenar información previa al arranque e información de la tabla de particiones. Se puede dividir en dos partes: la primera parte es el área de inicio (PRE-BOOT), que ocupa 446 bytes, y la segunda parte es la tabla de particiones (PARTITION PABLE), que tiene 66 bytes, y registra la información de partición del disco duro. Una de las funciones del área de prearranque es encontrar la partición marcada como ACTIVA y leer el área de inicio de la partición activa en la memoria.

Una vez que el sistema encuentre el MBR del disco duro especificado por el BIOS, lo copiará a la memoria física donde se encuentra la dirección 0times. De hecho, el contenido copiado en la memoria física es el cargador de arranque, y específico para su computadora, que es lilo o grub.

Comience el tercer paso: Cargador de arranque

El Cargador de arranque es un pequeño programa que se ejecuta antes de que se ejecute el kernel del sistema operativo. A través de este pequeño programa, podemos inicializar el dispositivo de hardware y crear un mapa del espacio de memoria, para llevar el entorno de hardware y software del sistema a un estado adecuado, a fin de hacer todos los preparativos para la llamada final del núcleo del sistema operativo. Por lo general, BootL oade: depende en gran medida del hardware. Las diferentes arquitecturas tienen diferentes cargadores de arranque.

El contenido del sector de arranque de Linux es un programa escrito en lenguaje ensamblador. El código fuente está en arch /i386 /boot (las CPU de diferentes sistemas tienen sus propios directorios de arranque), y hay 4 archivos de programa: < Br>

◎ bootsect.S, el programa principal del sector de inicio, el código después del ensamblaje no excede los 512 bytes, es decir, el tamaño de un sector

◎ setup.S, asistente de inicio

◎ edd.S, parte del programa auxiliar para admitir el servicio de dispositivo de disco mejorado BIOS

video.S, otra parte del programa auxiliar para visualización de pantalla durante el arranque

El sistema lee la información de configuración de grub en la memoria (generalmente menu.lst o grub.lst) e inicia diferentes sistemas operativos de acuerdo con esta información de configuración.

Comience el cuarto paso: cargue el kernel

De acuerdo con la ruta de la imagen del kernel establecida por grub, el sistema lee la imagen de la memoria y la descomprime. En este punto, la pantalla generalmente mostrará el mensaje "Descomprimiendo Linux". Cuando se completa el núcleo descomprimido, la pantalla muestra < OK, iniciando el núcleo ".

El sistema coloca el kernel descomprimido en la memoria y llama a la función start_kernel () para iniciar una serie de funciones de inicialización e inicializar varios dispositivos para completar el entorno del kernel de Linux. En este punto, el kernel de Linux se ha construido, y los programas basados ​​en Linux deberían funcionar bien.

start_kenrel () se define en init /main.c, que es similar a la función main () en un ejecutable normal. Lo que el sistema hizo antes es solo algo que permite que el kernel se ejecute como mínimo. El proceso de inicialización, el proceso real de inicialización del kernel, solo comienza desde aquí. La función start_kerenl () llamará a una serie de funciones de inicialización para completar todos los aspectos del kernel, a fin de establecer finalmente un entorno de kernel Linux básico.

Las siguientes operaciones se realizan principalmente en start_kernel ():

(1) La información de la versión actual del kernel se imprime en la pantalla.

(2) Ejecute setup_arch () para establecer la estructura del sistema.

(3) Ejecute sched_init () para inicializar el mecanismo de programación del sistema. Primero, se inicializa el runqueque en cada CPU disponible, luego se inicializa el proceso 0 (su estructura de tareas y la pila M del sistema se asignaron en startup_32 ()) como proceso inactivo del sistema, es decir, el proceso que ocupa la CPU cuando el sistema está inactivo.

(4) Ejecute parse_early_param () y parsees_args () para analizar los parámetros de inicio del sistema.

(5) Ejecute trap_in itQ, primero configure la tabla de vectores de interrupción del sistema. La puerta trampa de 0-19 se usa para el manejo de excepciones de CPU, luego se inicializa el vector de llamada del sistema; finalmente, se llama a cpu_init () para mejorar la inicialización de la CPU, que se usa para respaldar el mecanismo de programación de procesos, incluida la configuración del registro de indicadores, el registro de tareas y la depuración del programa de inicialización. Registros relacionados y así sucesivamente.

(6) Ejecute rcu_init () para inicializar el mecanismo de exclusión mutua de lectura y copia en el sistema.

(7) Ejecute la función init_IRQ () para inicializar la interrupción para el periférico y completar el proceso de inicialización final para el IDT.

(8) Ejecute las funciones init_timers (), softirq_init () y time_init (), respectivamente, el mecanismo del temporizador inicial del sistema, el mecanismo de interrupción suave y la fecha y hora del sistema.

(9) Ejecute la función mem_init () para inicializar el descriptor de la estructura de datos de la página de la memoria física para completar la creación del mecanismo de administración de la memoria física.

(10) Ejecute kmem_cache_init () para completar la inicialización del mecanismo general de administración del búfer de losa.

(11) Ejecute fork_init () para calcular la cantidad de procesos (subprocesos) que la capacidad de memoria física del sistema actual puede permitir.

(12) Ejecute proc_caches_init (), bufer_init (), unnamed_dev_init (), vfs_caches_init (), signal_init () y otras funciones para establecer una cola de búfer de slab dedicada para varios mecanismos de administración.

(13) Ejecute el número proc_root_init () Wl para inicializar el sistema de archivos virtual /proc.

Al final de start_kenrel (), el kernel crea el primer subproceso del kernel del sistema (es decir, el número de proceso 1) a través de kenrel_thread (). Este thread ejecuta la función init () en el kernel, que es responsable de la siguiente Una fase de la tarea de inicio. Finalmente, se llama a la función cpues_idle (): ingresar al puerto del cuerpo del bucle principal del sistema siempre ejecutará la instrucción en la función default_idle (), es decir, la instrucción de detención de la CPU, hasta que se deban programar los otros procesos en la cola de espera, estos se cambiarán para ejecutar otras funciones. En este punto, el único proceso en el sistema que tiene un estado listo es el proceso init (subproceso del kernel) creado por kerne_hread (), por lo que el kernel no ingresa a la función default_idle (), sino que se dirige a la función init () para continuar con el proceso de arranque.

Copyright © Conocimiento de Windows All Rights Reserved