加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 0x7C00 首次出現(xiàn)在 IBM PC 5150 ROM BIOS INT 19h 處理程序中
    • 0x7c00 的起源
    • 為什么 CPU Monitor 要把 bootloader 加載到 0x200 ?
    • 誰決定了 0x7c00?
    • 0x7c00 = 32 kib - 1024b 是什么意思?
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

0x7c00 的歷史根源

2023/08/17
3401
閱讀需 9 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

這是一個(gè)很值得拿來探討一下的問題。

為什么 x86 中 BIOS 會把 MBR 放在 0x7c00 這個(gè)地址上呢?針對這個(gè)問題,你可能有兩個(gè)疑惑點(diǎn):

我讀過所有的 x86 程序開發(fā)手冊,但是都沒有找到 0x7c00 這個(gè)魔數(shù)。

首先 0x7c00 這個(gè)魔數(shù)和 x86 CPU 無關(guān),所以你在 intel 特定的 CPU 手冊里面找不到也能說得通。然后你會好奇,那是誰決定了這個(gè)數(shù)字?

0x7c00 是十進(jìn)制的 32kib - 1024b,這個(gè)數(shù)字是什么意思?

其實(shí)任何人都可以決定這個(gè)數(shù)字,但是,問題的關(guān)鍵是為什么會選擇一個(gè)這樣中間的地址?

所以現(xiàn)在圍繞 0x7c00 就有兩個(gè)需要討論的問題

誰決定了 0x7c00 這個(gè)數(shù)字

0x7c00 = 32 kib - 1024b 是什么意思?

問題需要追溯到 IBM PC 5150 了,它是 x86 的祖先!

0x7C00 首次出現(xiàn)在 IBM PC 5150 ROM BIOS INT 19h 處理程序中

如果你了解過 x86 的歷史,那么你就會知道 IBM PC 5150是 x86(32位)IBM PC/AT 的祖先。這款電腦于 1981 年 8 月發(fā)布,采用了 8088(16)位和 16 kib RAM 的最低內(nèi)存型號。BIOS 和 Microsoft BASIC 存儲在 ROM 中。

開機(jī)上電時(shí),BIOS 會進(jìn)行 POST 開機(jī)自檢,然后調(diào)用 INT 19h 中斷。在 INT 19 h 中斷例程中,BIOS 會檢查從哪里啟動操作系統(tǒng),是從硬盤,軟盤還是固定磁盤。如果計(jì)算機(jī)有任何可用的磁盤,BIOS 就會將磁盤的第一個(gè)扇區(qū) 512 字節(jié)加載到 0x7c00 處。

所以你現(xiàn)在知道了為什么在 x86 文檔中找不到這個(gè)神奇的數(shù)字了,因?yàn)檫@個(gè)數(shù)字屬于 BIOS 規(guī)范。

0x7c00 的起源

SCP(一家公司)的 “86-DOS”(1980年)是 IBM PC DOS 1.0 的參考操作系統(tǒng)。86-DOS(最早叫 QDOS)是適用于 8086/8088 CPU 的 CP/M 兼容操作系統(tǒng)。在 1979 年,Digital Research Inc(數(shù)字搜索公司)還沒有開發(fā)出 8086/8088 CPU 的 CP/M 操作系統(tǒng)。

其實(shí) Digital Research Inc 這家公司本來有機(jī)會能在計(jì)算機(jī)高速發(fā)展的年代占據(jù)先機(jī),但是礙于其目光短淺最后敗給了微軟

大家知道,當(dāng)時(shí) Paul Allen 和 Bill Gates 開發(fā)出來了 BASIC 解釋器并成立了微軟公司,1980年10月,IBM公司決定推出基于Intel 8086芯片的PC。它找到 Digital Research 公司,要求獲得授權(quán)使用 CP/M 系統(tǒng)。但是協(xié)議沒有談成。于是,IBM 又去找微軟公司,要求微軟為它提供操作系統(tǒng)。

當(dāng)時(shí),微軟沒有操作系統(tǒng)產(chǎn)品,但是 Bill Gates 知道 SCP 公司正在開發(fā) QDOS。微軟支付2.5萬美元給SCP,獲得了 QDOS 的使用許可。

后來 Bill Gates 看見了巨大的商機(jī),索性直接把 QDOS 買下來了,于是 QDOS 成為了微軟的財(cái)產(chǎn),后來 QDOS 改名為 MS-DOS 。

這段完全是 cxuan 強(qiáng)行拓展的,與正文無關(guān)。

SCP 賣了兩塊 S-100 的板子,第一個(gè)是 8086 CPU 的板子,第二個(gè)是 "CPU Monitor"的板子。CPU Monitor 程序提供了 bootloader 引導(dǎo)加載器和 debugger 調(diào)試器。CPU Monitor 的 bootloader 會把 MBR 加載到 "0x200" ,而非 "0x7c00",1981年,IBM PC DOS 是 8086/8088 的下一個(gè)類似 CP/M 的操作系統(tǒng)。

所以,0x7c00 第一次出現(xiàn)在 IBM PC 5150 ROM BIOS 中,而 SCP 的 CPU Monitor 會將引導(dǎo)程序加載至 0x200 而非 0x7c00 處。

那么問題又來了。。。。。。

為什么 CPU Monitor 要把 bootloader 加載到 0x200 ?

關(guān)于 0x200 有三個(gè)原因:

8086 中斷向量使用 0x0 - 0x3FF 。

86 - DOS 會被加載到 0x400 處。

86 - DOS 并不會使用 0x200 - 0x3FF 之間的中斷向量。

這些原因意味著 0x200-0x3FF 需要保留,不能妨礙操作系統(tǒng),無論 86-DOS 或用戶應(yīng)用程序要加載到哪里。

所以 Tim Paterson(86 - DOS 的開發(fā)者)選擇了 0x200 這個(gè)地址作為 MBR 的加載地址。

誰決定了 0x7c00?

所以決定 0x7c00 這個(gè)地址的是 IBM PC 5150 BIOS 的開發(fā)團(tuán)隊(duì) (Dr. David Bradley)。如上所述,這個(gè)神奇的數(shù)字誕生于1981年,“IBM PC/at Compat” PC/BIOS 供應(yīng)商沒有因?yàn)?BIOS 和操作系統(tǒng)的向后兼容性而改變這個(gè)值。

也不是 Intel(8086/8088)或者是微軟(操作系統(tǒng)廠商)決定的。

0x7c00 = 32 kib - 1024b 是什么意思?

IBM PC 5150 最小的內(nèi)容模型只有 16 kib 的 RAM,所以你可能會有疑問。

最小內(nèi)存型號僅僅 16 kib 能從軟盤加載操作系統(tǒng)嗎?BIOS 會將 MBR 加載到 32 kib - 1024 b ,但是物理 RAM 顯然不夠。

這種情況顯然缺乏考慮,BM PC 5150 ROM BIOS 開發(fā)團(tuán)隊(duì)的成員,David Bradley 博士說到:

DOS 1.0 都需要至少 32 kb,所以我們不用擔(dān)心嘗試以 16 kb 啟動。

BIOS 的開發(fā)者團(tuán)隊(duì)決定使用 0x7c00 這個(gè)地址是因?yàn)橄旅鎺讉€(gè)原因:

他們想要給 32 Kib 操作系統(tǒng)的加載留下足夠的空間。

8086/8088 使用 0x0 - 0x3FF 作為中斷向量地址,并且 BIOS 的數(shù)據(jù)區(qū)在這個(gè)地址后面。

boot 引導(dǎo)扇區(qū)是 512 字節(jié),引導(dǎo)程序的堆棧/數(shù)據(jù)區(qū)域需要的空間要比 512 字節(jié)多。

因此,選擇 0x7C00,即 32 KiB的最后 1024B。

一旦操作系統(tǒng)加載并啟動,啟動扇區(qū)將永遠(yuǎn)不會使用,直到電源重置。因此,操作系統(tǒng)和應(yīng)用程序可以自由使用32 KiB 的最后1024B。

說點(diǎn)人話:

我們可以來計(jì)算機(jī)一下內(nèi)存空間的占用情況:

0x0 - 0x3FF 用來做中斷向量,所以只剩下 0x400 - 0x7FFF(32 kb) 可用。

為了把更多的內(nèi)存空間給操作系統(tǒng),MBR 就被放在了 32 Kib 的尾部,由于一個(gè)扇區(qū)占用 512 字節(jié),MBR 本身也會產(chǎn)生數(shù)據(jù),所以留給 MBR 和其數(shù)據(jù)區(qū)的空間就變?yōu)榱?1024 字節(jié)。

于是 0x7FFF - 1024 + 1 = 0x7c00 。

這就是 0x7C00 的起源和原因,這個(gè)神奇的數(shù)字在 PC/AT Compat BIOS INT 19h 處理程序中存活了大約三十年。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險(xiǎn)等級 參考價(jià)格 更多信息
NRF52840-QIAA-R7 1 Nordic Semiconductor Telecom Circuit, 1-Func, PBGA73, AQFN-73
$7.48 查看
CM7V-T1A-LOW-ESR-32.768KHZ-7PF-20-TA-QC 1 Micro Crystal AG Parallel - Fundamental Quartz Crystal,

ECAD模型

下載ECAD模型
$3.02 查看
AT27C512R-45JU-T 1 Microchip Technology Inc OTP ROM, 64KX8, 45ns, CMOS, PQCC32

ECAD模型

下載ECAD模型
$2.23 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

cxuan 寫的文章還不錯(cuò)。會分享計(jì)算機(jī)底層、計(jì)算機(jī)網(wǎng)絡(luò)、操作系統(tǒng),Java基礎(chǔ)、框架、源碼等文章。