對於很多人來講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於2023年發布,使用了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)
+——————— (…)
參考:
BIOS載入MBR到記憶體位址0x7C00的由來
2012 11 27 14 03 48 對於很多人來講0x7c00這個位址是很神秘的,不知道這是幹什麼的。但是對於了解過x86平台下bios啟動過程的人,對這個位址再熟悉不過了。bios就是將mbr讀入0x7c00位址,然後進行後續的引導的。作業系統或是bootloader開發者必須假設 他們的彙編...
c語言中通過指標將數值賦值到制定記憶體位址
1.一種直觀的方法 假設現在需要往記憶體0x12ff7c位址上存入乙個整型數0x100。我們怎麼才能做到呢?我們知道可以通過乙個指標向其指向的記憶體位址寫入資料,那麼這裡的記憶體位址0x12ff7c其本質不就是乙個指標嘛。所以我們可以用下面的方法 1 2 int p int 0x12ff7c p 0...
c語言中通過指標將數值賦值到制定記憶體位址
1.一種直觀的方法 假設現在需要往記憶體0x12ff7c位址上存入乙個整型數0x100。我們怎麼才能做到呢?我們知道可以通過乙個指標向其指向的記憶體位址寫入資料,那麼這裡的記憶體位址0x12ff7c其本質不就是乙個指標嘛。所以我們可以用下面的方法 int p int 0x12ff7c p 0x100...