從開機加電到執(zhí)行main函數(shù)之前的過程的目的是從啟動盤加載操作系統(tǒng)程序倦逐,完成執(zhí)行main函數(shù)所需要的準(zhǔn)備工作拗秘。
第一步:啟動BIOS,準(zhǔn)備實模式下的中斷向量表和中斷服務(wù)程序坦弟;
第二步:從啟動盤加載操作系統(tǒng)到內(nèi)存蹋辅,加載操作系統(tǒng)的工作就是利用第一步中準(zhǔn)備的中斷服務(wù)程序?qū)崿F(xiàn)的照筑;
第三步:為執(zhí)行32位的main函數(shù)做過渡工作胸私。
實模式:是Intel 80286和之后的80x86兼容CPU的操作模式厌处。
為了解決開始啟動問題,Intel 將所有的80x86系列的CPU硬件設(shè)計為加電即進入16位實模式狀態(tài)運行岁疼。
將CPU硬件邏輯的設(shè)計加電瞬間強行將CS的值置為0xF000阔涉、IP的值置為0xFFF0,這樣CS:IP就指向0xFFFF0這個地址位置。
0xFFFF0指向BIOS的地址范圍捷绒。
加載操作系統(tǒng)到內(nèi)存:
對于Linux0.11操作系統(tǒng)而言瑰排,計算機分三批逐次加載操作系統(tǒng)內(nèi)核代碼。
1暖侨、由BIOS中斷int 0x19把第一扇區(qū)bootsect的內(nèi)容加載到內(nèi)存椭住。
2、3字逗、在bootsect的指揮下京郑,分別把其后的4個扇區(qū)和隨后的240個扇區(qū)的內(nèi)容加載至內(nèi)存。
加載第一部分:引導(dǎo)程序葫掉。
加載第二部分:setup些举。
操作系統(tǒng)的設(shè)計者是要全面的、整體的考慮內(nèi)存的規(guī)劃的俭厚。
棧從高地址向低地址生長户魏。
加載第三部分:system模塊。
最后再次確定根設(shè)備。
系統(tǒng)通過已經(jīng)加載到內(nèi)存中的代碼之后叼丑,從實模式到保護模式资铡。
3、開始向32位模式轉(zhuǎn)變幢码,為main函數(shù)的調(diào)用做準(zhǔn)備笤休。
操作系統(tǒng)執(zhí)行操作有:打開32位的尋址空間、打開保護模式症副、建立保護模式下的中斷響應(yīng)機制等與保護模式配套的相關(guān)工作店雅、建立內(nèi)存的分頁機制、最后為做好調(diào)用main函數(shù)的準(zhǔn)備贞铣。
a.關(guān)中斷并將system移動到內(nèi)存地址起始位置0x00000闹啦。
16位中斷機制用的是中斷向量表,中斷向量表的起始位置在0x00000處辕坝,這個位置固定窍奋;
32位中斷機制用的是中斷描述符(IDT),位置不固定酱畅,可以由操作系統(tǒng)的設(shè)計者根據(jù)設(shè)計靈活安排琳袄,由IDTR來鎖定其位置。
在執(zhí)行main函數(shù)之前纺酸,先要執(zhí)行bootsect窖逗,setup,head餐蔬。之后才執(zhí)行由main函數(shù)開始的c語言編寫的操作系統(tǒng)內(nèi)核程序碎紊。
head程序建立目錄表,為分頁機制做準(zhǔn)備樊诺。
操作系統(tǒng)認(rèn)定0x0000這個位置就是頁目錄表的起始位置仗考。