kernel/head.S fa alcune inizializzazioni (tra cui copia anche i parametri della command line) e la prima CPU chiama start_kernel() che si trova in init/main.c (che è scritta in C).
init/main.c ( __init start_kernel(void) ) chiama le seguenti routine per fare alcune operazioni (riporto le principali chiamate seguendone l'ordine):
1. Si assicura che solo una CPU abbia il controllo.
2. Esegue alcune operazioni hardware.
3. Stampa a video il banner di Linux.
4. Inizializza i trap.
5. Inizializza gli IRQ.
6. Inizializza lo scheduler.
7. Inizializza i timers.
8. Inizializza i softirq.
9. Fa il parsing della linea di comando (che ricordo è stata copiata fino a qui).
10. Inizializza la console.
11. Inizializza il sottosistema di caricamento dei moduli.
12. Abilita gli interrupt.
13. Chiama mem_init() che calcola alcuni valori della memoria e stampa a video il messaggio "Memory: ...".
14. kmem_cache_init(), inizializza la cache del kernel.
15. Chiama il fork_init.
16. Prepara alcuni buffer per il VFS, ecc.
17. Se supportato inizializza il procfs.
18. Fa il fork di init e inizializza il massimo numero di threads in base alla memoria disponibile.
19. Controlla se ci sono delle patch specifiche per il processore, bus, ecc. su cui il kernel è in esecuzione.
20. crea un kernel thread init () che esegue un programma passato via init= boot parametre o prova ad eseguire uno dei seguenti programmi /sbin/init, /etc/init, /bin/init, /bin/sh.