第一步:啟動BIOS
CPU加電後首先工作在16位實模式下,
1.啟動BIOS是通過硬體的特殊設計完成的。加電瞬間強行置CS:0xFFFF,IP:0x0000,如此CS:IP就指向0xFFFF0。BIOS的入口地址即為0xFFFF0
2.定位BIOS後便開始執行BIOS代碼(比如自檢)。最重要的任務就是在記憶體中建立中斷向量表和中斷服務程式。
如:0x00000—0x003FF的1KB構建中斷向量表
0x00400—0x004FF用256位元組構建BIOS資料區
0x0E2CE載入了8KB左右的中斷服務程式
第二步:載入作業系統核心
1.第一步載入引導程式到記憶體。BIOS程式發出int 0x19中斷,CPU在中斷向量表中找到中斷服務程式入口地址後執行。此段代碼BIOS設計好,與作業系統無關。此中斷程式把軟碟機的0號磁頭對應盤面的0磁軌1扇區的內容拷貝至記憶體0x07C00,此扇區的內容即是linux 0.11的引導程式bootsect,他會把磁碟片中的作業系統陸續載入進記憶體
兩頭約定,定位識別
兩頭約定就是指約定作業系統必須把最開始執行的代碼放在0盤面0磁軌1扇區,約定BIOS在接到啟動命令後要把開機磁區的代碼載入到0X07C00。這樣只要作業系統的設計者和BIOS的設計者遵照這個約定,BIOS就能順利的引導作業系統的啟動。
2.第二步,載入setup代碼。
linux設計者很好的規划了實模式下1MB記憶體的使用:
SETUPLEN = 4 ! nr of setup-sectors
BOOTSEG = 0x07c0 ! original address of boot-sector
INITSEG = 0x9000 ! we move boot here - out of the way
SETUPSEG = 0x9020 ! setup starts here
SYSSEG = 0x1000 ! system loaded at 0x10000 (65536).
ENDSEG = SYSSEG + SYSSIZE ! where to stop loading
首先要複製bootsect,就是把自己從BOOTSEG位置複製到INITSEG。從現在起作業系統已經不需要依賴BIOS,可以完全按照自己的意圖分配記憶體使用量。
將Setup程式載入到記憶體需要依靠BIOS提供的int 0x13中斷向量所指的中斷服務程式(磁碟服務程式)。使用0x13中斷必須先給他“傳參”,指定的扇區和載入記憶體的位置傳給他。
linux會從第2個扇區到第4個扇區載入至記憶體0x90200處
3.第三部,載入system模組。使用的依然是int 0x13中斷。