計算機接電之後第一個啟動的是BIOS,因為BIOS是存儲在主闆上的一個小程序,空間有限代碼量少因此功能受限。要經過一步步的控制權轉移,最後轉移給功能更加強大的操作系統。
BIOS對系統做一些簡單的初始化工作,然後把控制權交給MBR。約定MBR(Main Boot Record)存在于整個硬盤最開始的扇區。每個扇區都是512字節,MBR引導扇區的内容是:
446字節的引導程序及參數
64字節的分區表(每個分區表項16字節,因此隻能有4個主分區)
2字節的結束标志0x55和0xaa
0x55和0xaa是MBR結束标志,0x7c00是MBR被加載在内存中的位置。
BIOS結束自己的工作以後,需要把控制權交給MBR,過程是:BIOS找到MBR并且把MBR加載在内存中,跳轉到該位置。
start_kernel
執行各種初始化函數:初始化IRQ、時鐘、CPU、内存、VFS、中斷向量表、内核子系統等等。最後調用
rest_init
,這幾乎是start_kernel的全部工作,
rest_init
創建一個内核線程,執行
kernel_init
,
rest_init
調用
schedule
啟動任務調度,調用
cpu_idle
。
cpu_idle
永遠運行,隻有當進程就緒列表中有就緒進程時候,cpu_idle才會被從CPU上拉下來,當沒有進程時候,這個空閑進程又被拉起來執行,這就是進程0。進程0漫長的工作終于結束了,從BIOS、MBR、Bootloader最後到kernel。雖然進程0從啟動的舞台上退出了,這并沒有意味着kernel啟動完成了。
進程0剛剛創建了一個内核線程執行
kernel_init
,還記得嗎?我們現在看看這個線程的運行。
kernel_init
負責初始化啟動剩下的CPU,從啟動分析到現在,我們隻有一個CPU在運行注意到了嗎?這個CPU我們成為引導CPU,剩下的應用CPU初始化依然需要從實模式開始。最後
kernel_init
調用
init_post
,這個函數嘗試執行一下用戶進程:
/sbin/init
、
/etc/init
、
/bin/init
和
/bin/sh
,如果全部失敗,産生kernel panic。如果上述程序存在,創建進程1運行(這個進程是所有用戶進程的父進程)。過程如下圖所示:
init讀取的第一個文件是
/etc/inittab
,從這裡init決定了我們的Linux操作系統的運行級别。Linux系統有7個運行級别(runlevel):
level 0:系統停機狀态
level 1:單用戶工作狀态
level 2:多用戶狀态
level 3:完全多用戶狀态
level 4:保留
level 5:X11
level 6:reboot
Init從/etc/fstab
文件中查找分區表信息,用真正的根文件系統替換initrd。Init然後啟動默認運行級别的/etc/init.d目錄中指定的所有服務或者腳本。這是所有服務由init逐個初始化的步驟。在這個過程中,一次一個服務由init啟動,所有守護程序在後台運行,init繼續管理它們。
至此,内核啟動基本結束了。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!