1. 程式人生 > >BIOS載入MBR到記憶體地址0x7C00的由來

BIOS載入MBR到記憶體地址0x7C00的由來

 對於很多人來講0x7C00這個地址是很神祕的,不知道這是幹什麼的。但是對於瞭解過x86平臺下BIOS啟動過程的人,對這個地址再熟悉不過了。BIOS就是將MBR讀入0x7C00地址,然後進行後續的引導的。作業系統或是bootloader開發者必須假設 他們的彙編程式碼被載入並從0x7C00處開始執行。



0x7C00的定義



對於這個地址,它不屬於Intel x86平臺規範的,而是屬於BIOS規範中定義的內容。0x7C00第一次出現在IBM PC 5150的BIOS處理int 19(19號中斷)的時候,IBM PC 5150是x86(32位)IBM PC/AT系列的祖先,這款PC於1981年釋出,使用了intel 8088(16位)的處理器和16KB的RAM記憶體,BIOS和微軟的基本指令均放在該記憶體中。



當開啟電源,BIOS開始自檢,然後出發19號中斷,在處理19號中斷時,BIOS檢測電腦是否具有軟盤、硬碟或是固定磁碟,如果有任何可以使用的磁碟,BIOS酒吧磁碟的第一個扇區(512B)載入到記憶體的0x7C00地址處。



0x7C00的前身



0x7C00地址第一次出現在IBM PC 5150的ROM bios中,在此之前使用的地址是0×200。使用該地址的原因主要有:當時8086中斷向量使用地址為0×0-0x3FF;86-DOS從0×400處被載入;而它不使用0×200-0x3FF這段中斷向量地址。因此這段0×200-0x3FF地址不能被其他程式使用,Tim Paterson(86-DOS開發者)選擇0×200作為MBR載入地址。



0x7C00的意義



他們想留下32kb內更多的空間給作業系統來載入自己;8086/8088使用0×0-0x3FF作為中斷向量,然後BIOS資料緊隨之後;引導扇區是512位元組,但是用於載入程式的棧或資料區域需要多於512位元組;因此0x7C00,32kb中的最後1kb被選中。



一旦作業系統被引導並開始,引導扇區將一直不會被使用指導重啟,因此作業系統和應用程式可以自由的使用32KB的最後1kb空間。在作業系統被載入後,記憶體佈局如下:



+——————— 0×0

| Interrupts vectors(中斷向量表)

+——————— 0×400

| BIOS data area(BIOS的資料區域)

+——————— 0×5??

| OS load area(作業系統載入區域)

+——————— 0x7C00

| Boot sector(引導區域)

+——————— 0x7E00

| Boot data/stack(引導資料/堆疊)

+——————— 0x7FFF

| (not used)

+——————— (…)



參考:



http://www.glamenv-septzen.net/en/view/6