引言
閱讀于淵的《ORANGE'S:一個操作系統(tǒng)的實現(xiàn)》,對一些知識點做一個筆記葛躏,方便以后復(fù)習相關(guān)知識温治。這一篇主要對boot代碼進行講解。boot.asm
計算機在POST加電自檢時尋找啟動盤雁芙,所謂啟動盤只是一個以0xAA55 結(jié)束的轧膘,并且包含一段少于512B的執(zhí)行碼的扇區(qū)。BOIS發(fā)現(xiàn)引導(dǎo)扇區(qū)兔甘,就會將這512B的內(nèi)容裝載到內(nèi)存地址0000:7c00處谎碍,然后跳轉(zhuǎn)到0000:7c00處將控制權(quán)徹底交給這段代碼。此后計算機不在由BOIS中固有的程序控制洞焙,而是由操作系統(tǒng)的一部分控制蟆淀。第一句org 07c00h
告訴編譯器這段代碼將會被加載到內(nèi)存偏移地址為0x7c00
處。所以啟動扇區(qū)占用0x7C00 - 0x7FFF這512字節(jié)
org 07c00h ; 告訴編譯器程序加載到7c00處
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 調(diào)用顯示字符串例程
jmp $ ; 無限循環(huán)
DispStr: mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
mov cx, 16 ; CX = 串長度
mov ax, 01301h ;
AH = 13, AL = 01h
mov bx, 000ch ; 頁號為0(BH = 0) 黑底紅字(BL = 0Ch,高亮)
mov dl, 0 int 10h ; 10h 號中斷
retBootMessage: db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空間澡匪,使生成的二進制代碼恰好為512字節(jié)
dw 0xaa55 ; 結(jié)束標志
那么為什么是加載到7c00處而不是其他地方呢熔任?
0x7C00的定義
對于這個地址,它不屬于Intel x86平臺規(guī)范的唁情,而是屬于BIOS規(guī)范中定義的內(nèi)容疑苔。0x7C00第一次出現(xiàn)在IBM PC 5150的BIOS處理int 19(19號中斷)的時候,IBM PC 5150是x86(32位)IBM PC/AT系列的祖先甸鸟,這款PC于1981年發(fā)布惦费,使用了intel 8088(16位)的處理器和16KB的RAM內(nèi)存赛惩,BIOS和微軟的基本指令均放在該內(nèi)存中。當打開電源趁餐,BIOS開始自檢喷兼,然后出發(fā)19號中斷,在處理19號中斷時后雷,BIOS檢測電腦是否具有軟盤季惯、硬盤或是固定磁盤,如果有任何可以使用的磁盤臀突,BIOS就將磁盤的第一個扇區(qū)(512B)加載到內(nèi)存的0x7C00地址處勉抓。
0x7C00的前身
0x7C00地址第一次出現(xiàn)在IBM PC 5150的ROM bios中,在此之前使用的地址是0x200候学。使用該地址的原因主要有:當時8086中斷向量使用地址為0x0-0x3FF藕筋;86-DOS從0x400處被加載;而它不使用0x200-0x3FF這段中斷向量地址梳码。因此這段0x200-0x3FF地址不能被其他程序使用隐圾,Tim Paterson(86-DOS開發(fā)者)選擇0x200作為MBR加載地址。
0x7C00的意義
他們想留下32kb內(nèi)更多的空間給操作系統(tǒng)來加載自己掰茶;8086/8088使用0x0-0x3FF作為中斷向量暇藏,然后BIOS數(shù)據(jù)緊隨之后;引導(dǎo)扇區(qū)是512字節(jié)濒蒋,但是用于引導(dǎo)程序的椦渭睿或數(shù)據(jù)區(qū)域需要多于512字節(jié);因此0x7C00沪伙,32kb中的最后1kb被選中瓮顽。一旦操作系統(tǒng)被引導(dǎo)并開始,引導(dǎo)扇區(qū)將一直不會被使用指導(dǎo)重啟围橡,因此操作系統(tǒng)和應(yīng)用程序可以自由的使用32KB的最后1kb空間暖混。在操作系統(tǒng)被加載后,內(nèi)存布局如下:
+——————— 0x0| Interrupts vectors(中斷向量表)
+——————— 0x400| BIOS data area(BIOS的數(shù)據(jù)區(qū)域)
+——————— 0x5??| OS load area(操作系統(tǒng)加載區(qū)域)
+——————— 0x7C00| Boot sector(引導(dǎo)區(qū)域)
+——————— 0x7E00| Boot data/stack(引導(dǎo)數(shù)據(jù)/堆棧)
+——————— 0x7FFF| (not used)+——————— (…)**
以下是網(wǎng)上找的系統(tǒng)啟動過程:
- 開機某饰;
- BIOS 加電或按reset鍵后都要進行系統(tǒng)復(fù)位儒恋,復(fù)位后指令地址為 0ffff:fff0,這個地方只有一條JMP指令, 跳轉(zhuǎn)到系統(tǒng)自檢 ( Power On Self Test -- POST )程序處善绎;
- 系統(tǒng)自檢完成后,將硬盤的第一個扇區(qū) (0頭0道1扇區(qū), 也就是Boot Sector)讀入內(nèi)存地址 0000:7c00 處黔漂;
- 檢查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于則轉(zhuǎn)去嘗試其他啟動介質(zhì), 如果沒有其他啟動介質(zhì) 則顯示 "No ROM BASIC" 然后死機;
- 跳轉(zhuǎn)到 0000:7c00 處執(zhí)行 MBR 中的程序禀酱;
- MBR(manage boot recorder)程序 首先將自己復(fù)制到 0000:0600 處, 然后繼續(xù)執(zhí)行炬守;
- 在主分區(qū)表中搜索標志為活動的分區(qū),如果沒有發(fā)現(xiàn)活動分區(qū)或有不止一個活動分區(qū), 則轉(zhuǎn)停止剂跟;
- 將活動分區(qū)的第一個扇區(qū)讀入內(nèi)存地址 0000:7c00 處减途;
- 檢查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于則 顯示 "Missing Operating System" 然后停止, 或嘗 試軟盤啟動或酣藻;
- 跳轉(zhuǎn)到 0000:7c00 處繼續(xù)執(zhí)行特定系統(tǒng)的啟動程序;
- 啟動系統(tǒng)... 以上步驟中 2,3,4,5 步是由 BIOS 的引導(dǎo)程序完成. 6,7,8,9,10步由MBR中的引導(dǎo)程序完成.
Boot Sector 結(jié)構(gòu)簡介
1鳍置、Boot Sector組成
Boot Sector 也就是硬盤的第一個扇區(qū), 它由 MBR (Master Boot Record)辽剧,DPT (Disk Partition Table) 和 Boot Record ID(Magic Number) 三部分組成。
MBR 又稱作主引導(dǎo)記錄税产,占用 Boot Sector 的前 446 個字節(jié) ( 0 to 0x1BD ),包含了硬盤的一系列參數(shù)和一段系統(tǒng)主引導(dǎo)程序怕轿。引導(dǎo)程序主要是用來在系統(tǒng)硬件自檢完后負責從活動分區(qū)中裝載并運行系統(tǒng)引導(dǎo)程序(引導(dǎo)操作系統(tǒng))。它的最后一條執(zhí)行語句是一條JMP指令,跳到操作系統(tǒng)的引導(dǎo)程序去辟拷。這里往往是引導(dǎo)型病毒的注入點撞羽,也是各種多系統(tǒng)引導(dǎo)程序的注入點。但是由于引導(dǎo)程序本身完成的功能比較簡單衫冻,所以我們完全可以判斷該引導(dǎo)程序的合法性(比如看JMP指令的合法性)诀紊,因而也易于修復(fù)。象命令fdisk/mbr可以修復(fù)MBR和KV300這類軟件可以查殺任意類型的引導(dǎo)型病毒隅俘,就是這個道理邻奠。
DPT 即主分區(qū)表,占用 64 個字節(jié) (0x1BE to 0x1FD),記錄了磁盤的基本分區(qū)信息为居。主分區(qū)表分為四個分區(qū)項, 每項 16 字節(jié), 分別記錄了每個主分區(qū)的信息(因此最多可以有四個主分區(qū))惕澎。 Boot Record ID 即引導(dǎo)區(qū)標記,占用兩個字節(jié) (0x1FE and 0x1FF), 對于合法引導(dǎo)區(qū), 它等于 0xAA55, 這是判別引導(dǎo)區(qū)是否合法的標志.
Boot Sector 的具體結(jié)構(gòu)如下圖所示:
0000 |------------------------------------------------|
| |
| |
| Master Boot Record |
| |
| |
| 主引導(dǎo)記錄(446字節(jié)) |
| |
| |
| |
01BD | |
01BE |------------------------------------------------|
| |
01CD | 分區(qū)信息 1(16字節(jié)) |
01CE |------------------------------------------------|
| |
01DD | 分區(qū)信息 2(16字節(jié)) |
01DE |------------------------------------------------|
| |
01ED | 分區(qū)信息 3(16字節(jié)) |
01EE |------------------------------------------------|
| |
01FD | 分區(qū)信息 4(16字節(jié)) |
|------------------------------------------------|
| 01FE | 01FF |
| 55 | AA | |------------------------------------------------|