abstract:《計算機原理》課本說,啟動時,主引導記錄會存入內存地址0x7C00。這個奇怪的地址,是怎么來的,課本就不解釋了。我一直有疑問,為什么不存入內存的頭部、尾部、或者其他位置,而偏偏存入這個比 32KB 小1024字節(jié)的地方?昨天,我讀到一篇文章,終于解開了這個謎。首先,如果你不知道,主引導記錄(Master boot record,縮寫為MBR)是什么,可以先讀《計算機是如何啟動的?》。簡單說,計算機
《計算機原理》課本說,啟動時,主引導記錄會存入內存地址0x7C00。
這個奇怪的地址,是怎么來的,課本就不解釋了。我一直有疑問,為什么不存入內存的頭部、尾部、或者其他位置,而偏偏存入這個比 32KB 小1024字節(jié)的地方?
昨天,我讀到一篇文章,終于解開了這個謎。
首先,如果你不知道,主引導記錄(Master boot record,縮寫為MBR)是什么,可以先讀《計算機是如何啟動的?》。
簡單說,計算機啟動是這樣一個過程。
通電
讀取ROM里面的BIOS,用來檢查硬件
硬件檢查通過
BIOS根據指定的順序,檢查引導設備的第一個扇區(qū)(即主引導記錄),加載在內存地址 0x7C00
主引導記錄把操作權交給操作系統(tǒng)
所以,主引導記錄就是引導”操作系統(tǒng)”進入內存的一段小程序,大小不超過1個扇區(qū)(512字節(jié))。
0x7C00這個地址來自Intel的第一代個人電腦芯片8088,以后的CPU為了保持兼容,一直使用這個地址。
1981年8月,IBM公司最早的個人電腦IBM PC 5150上市,就用了這個芯片。
當時,搭配的操作系統(tǒng)是86-DOS。這個操作系統(tǒng)需要的內存最少是32KB。我們知道,內存地址從0x0000開始編號,32KB的內存就是0x0000~0x7FFF。
8088芯片本身需要占用0x0000~0x03FF,用來保存各種中斷處理程序的儲存位置。(主引導記錄本身就是中斷信號INT 19h的處理程序。)所以,內存只剩下0x0400~0x7FFF可以使用。
為了把盡量多的連續(xù)內存留給操作系統(tǒng),主引導記錄就被放到了內存地址的尾部。由于一個扇區(qū)是512字節(jié),主引導記錄本身也會產生數據,需要另外留出512字節(jié)保存。所以,它的預留位置就變成了:
0x7FFF – 512 – 512 = 0x7C00
0x7C00就是這樣來的。
計算機啟動后,32KB內存的使用情況如下。
+——————— 0x0
| Interrupts vectors
+——————— 0x400
| BIOS data area
+——————— 0x5??
| OS load area
+——————— 0x7C00
| Boot sector
+——————— 0x7E00
| Boot data/stack
+——————— 0x7FFF
| (not used)
+——————— (…)