El kernel no tiene una main
función. main
Es un concepto del lenguaje C. El núcleo está escrito en C y ensamblado. El código de entrada del núcleo se escribe por ensamblado.
La secuencia de arranque se organiza de la siguiente manera:
- El BIOS generalmente carga un cargador de arranque desde un dispositivo de bloque de arranque. Un cargador de arranque popular en este momento es grub.
- Grub carga una imagen del kernel en ram, posible con un dispositivo raíz inicial (
initrd
). Luego se ejecuta el código en alguna dirección.
- La imagen del núcleo tiene algunos módulos del núcleo, por ejemplo: módulos del sistema de archivos, controladores de dispositivos. La imagen del núcleo utiliza el módulo del sistema de archivos para montar el sistema de archivos raíz. Ahora el núcleo puede cargar y ejecutar todos los módulos del núcleo desde el disco.
- El kernel ejecuta tareas de inicialización. Por ejemplo: atraviese el bus PCI y encuentre todos los dispositivos PCI, inicialice todos los controladores de dispositivo.
- Finalmente, el núcleo crea el proceso 0 y el proceso 1 (el
init
proceso), cambia el contexto de la CPU del anillo 0 al anillo 3 e inicia el proceso de inicio (el ID del proceso es 1). ¡Ahora el arranque del kernel ha terminado!
- El
init
programa ejecuta todos los scripts de inicio. Todos los servicios se inician. Se llama Shell. Los usuarios pueden iniciar sesión.
La main
función es una función C. En realidad, el método principal no es el punto de entrada de los programas en C. El tiempo de ejecución C llama muchas funciones antes main
. GCC tiene una característica extendida: constructores. Las funciones declaradas "constructor" se llaman antes main
.
Por ejemplo:
/* This should not be used directly. Use block_init etc. instead. */
#define module_init(function, type) \
static void _attribute__((constructor)) do_qemu_init ## function(void) { \
register_module_init(function, type); \
}
Esta macro es del proyecto qemu.