一、史前階段:BIOS編程
1、上電自檢(Power-On Self-Test):用來檢測有什麼設備,以及這些設備是否能正常工做
二、初始化硬件設備。
三、搜索一個操做系統來啓動。根據BIOS的設置或者用戶配置的順序,從軟盤、硬盤、光盤中讀取第一個扇區(引導扇區),用來啓動系統
四、將找到的第一個有效設備的第一個扇區拷貝到RAM,地址爲0x00007c00處,而且開始執行這段代碼。
二、遠古時代:引導裝入程序函數
軟盤啓動:
將軟盤第一個扇區中的指令裝載到RAM,而後執行這些指令(boot loader)將包含內核映像的全部其餘扇區都拷貝到RAM
硬盤啓動:
a、Linux的引導裝入程序叫作LILO(Linux Loader)
b、GRUB(Grand unified bootloader)是另外一種Linux引導裝入程序,比LILO更加先進。能夠識別基於磁盤的文件系統,從文件中讀取部分引導程序。
c、LILO分爲兩部分。由於太大沒法裝入一個單獨的扇區
d、BIOS將第一部分裝入0x00007c00處.執行這部分的指令,它將本身移動到0x00096a00,創建實模式棧(0x00098000~0x000969ff),並將第二部分裝入到RAM,0x00096c00
e、第二部分依次從磁盤讀取可用的操做系統的映射表,供用戶選擇啓動的系統。而後將相應分區的引導扇區拷貝到RAM執行,或者直接拷貝內核鏡像到RAM。
三、中世紀:setup()函數佈局
a、setup()位於內核映像文件的偏移量0x200處
b、初始化硬件設備,爲內核程序的執行創建環境
c、創建物理內存佈局表
d、設置鍵盤重複延時和速率
e、初始化視頻卡
f、從新初始化磁盤控制器並檢測硬盤參數
g、檢查IBM微通道總線(MCA)
i、檢查PS/2指針設備(總線鼠標)
j、檢查對高級電源管理(APM)BIOS的支持
k、若是BIOS支持加強磁盤驅動服務(Enhanced Disk drive service,EDD),它就調用相應的BIOS過程在RAM中創建系統可用的硬盤表
l、若是內核映像被低裝載到RAM中,就把它移動到XX;若是是高裝載,就不用移動。
m、置位8042鍵盤控制器的A20引腳
n、創建臨時中斷描述符(IDT),臨時全局描述符表(GDT)
o、若是須要,重置浮點單元(FPU)
p、從新編寫可編程中斷控制器(PIC),屏蔽全部中斷,保留IRQ2
q、跳轉到startup_32()
四、文藝復興時期:startup_32()函數ui
第一個startup_32():
a、初始化段寄存器和臨時堆棧
b、清零eflags寄存器帶全部位。
c、用0填充_edate和_end符號標識的內核未初始化數據區
d、調用decompress_kernel()函數來解壓內核映像。
e、跳轉到物理地址0x00100000處。
第二個startup_32():
a、爲第一個Linux進程(進程0)創建執行環境。
五、現代:start_kernel()函數spa
a、初始化調度程序:sched_init()b、初始化內存管理區: build_all_zonelists()c、初始化夥伴系統分配程序: page_alloc_init()d、初始化IDT: trap_init()e、初始化軟中斷: softing_init()f、初始化系統日期和時間: time_init()g、初始化slab分配器: kmem_cache_init()h、初始化CPU時鐘到速度: calibrate_delay()i、爲內核進程1建立內核線程: kernel_thread()