《ORANGE'S:一個操作系統(tǒng)的實現(xiàn)》之 boot(MBR)

  • 引言
    閱讀于淵的《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)啟動過程:

  1. 開機某饰;
  2. BIOS 加電或按reset鍵后都要進行系統(tǒng)復(fù)位儒恋,復(fù)位后指令地址為 0ffff:fff0,這個地方只有一條JMP指令, 跳轉(zhuǎn)到系統(tǒng)自檢 ( Power On Self Test -- POST )程序處善绎;
  3. 系統(tǒng)自檢完成后,將硬盤的第一個扇區(qū) (0頭0道1扇區(qū), 也就是Boot Sector)讀入內(nèi)存地址 0000:7c00 處黔漂;
  4. 檢查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于則轉(zhuǎn)去嘗試其他啟動介質(zhì), 如果沒有其他啟動介質(zhì) 則顯示 "No ROM BASIC" 然后死機;
  5. 跳轉(zhuǎn)到 0000:7c00 處執(zhí)行 MBR 中的程序禀酱;
  6. MBR(manage boot recorder)程序 首先將自己復(fù)制到 0000:0600 處, 然后繼續(xù)執(zhí)行炬守;
  7. 在主分區(qū)表中搜索標志為活動的分區(qū),如果沒有發(fā)現(xiàn)活動分區(qū)或有不止一個活動分區(qū), 則轉(zhuǎn)停止剂跟;
  8. 將活動分區(qū)的第一個扇區(qū)讀入內(nèi)存地址 0000:7c00 處减途;
  9. 檢查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于則 顯示 "Missing Operating System" 然后停止, 或嘗 試軟盤啟動或酣藻;
  10. 跳轉(zhuǎn)到 0000:7c00 處繼續(xù)執(zhí)行特定系統(tǒng)的啟動程序;
  11. 啟動系統(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 |  |------------------------------------------------|
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颜骤,一起剝皮案震驚了整個濱河市唧喉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忍抽,老刑警劉巖八孝,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸠项,居然都是意外死亡干跛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門祟绊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楼入,“玉大人,你說我怎么就攤上這事牧抽〖涡埽” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵扬舒,是天一觀的道長阐肤。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么孕惜? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任愧薛,我火速辦了婚禮,結(jié)果婚禮上衫画,老公的妹妹穿的比我還像新娘毫炉。我一直安慰自己,他們只是感情好削罩,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布碘箍。 她就那樣靜靜地躺著,像睡著了一般鲸郊。 火紅的嫁衣襯著肌膚如雪丰榴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天秆撮,我揣著相機與錄音四濒,去河邊找鬼。 笑死职辨,一個胖子當著我的面吹牛盗蟆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舒裤,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼喳资,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了腾供?” 一聲冷哼從身側(cè)響起仆邓,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伴鳖,沒想到半個月后台舱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苦囱,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡男应,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年陌凳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片须肆。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡匿乃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豌汇,到底是詐尸還是另有隱情幢炸,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布瘤礁,位于F島的核電站阳懂,受9級特大地震影響梅尤,放射性物質(zhì)發(fā)生泄漏柜思。R本人自食惡果不足惜岩调,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赡盘。 院中可真熱鬧号枕,春花似錦、人聲如沸陨享。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抛姑。三九已至赞厕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間定硝,已是汗流浹背皿桑。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔬啡,地道東北人诲侮。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像箱蟆,于是被迫代替她去往敵國和親沟绪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容