為什么 x86 操作系統從 0x7c00 處開始

0x00:x86 架構 BIOS 引導加載程序中的"0x7C00"之謎

你知道 x86 操作系統中的"0x7C00"這個神奇數字嗎 ?

"0x7C00" 是BIOS加載MBR(主引導記錄,磁盤中的第一個扇區)的內存地址。操作系統或引導加載程序開發人員必須假設他們的匯編代碼已加載并從 0x7C00 開始。

但是...

第一,你可能很疑惑: "我讀了所有的Intel x86 手冊,但沒有找到神奇的數字0x7C00。"是的。0x7C00 與 x86 CPU 無關。很自然你在 intel 的cpu規格中查不到它。然后,你很想知道 "是誰確定這個數字的?"

第二,你可能很疑惑:"0x7C00 十進制數為 32KiB - 1024B。這個數字意味著什么?難道這只是巧合嗎?"

是誰決定了這個地址?并且,他為什么選擇這樣一個不著邊際的地址呢?現在,讓我們一起深入了解現代 x86 PC 的祖先"IBM PC 5150"的 BIOS 秘密!

0x01:"0x7C00"首先出現在IBM PC 5150中

圖片

縱觀x86 IBM兼容個人電腦的歷史,IBM PC 5150 是現代x86 IBM PC/AT 電腦的始祖。該電腦于 1981 年 8 月發布,配備 Intel 8088(16 位)和 16KiB RAM(最低內存型號), BIOS 和 Microsoft BASIC 存儲在 ROM 中。

當機器上電時,BIOS 執行 "POST"(開機自檢)程序,然后執行中斷調用 INT 19h。在中斷 INT 19h 處理程序中,BIOS 檢查 PC 是否有軟盤/硬盤/固定軟盤。如果有任何可用的磁盤,BIOS 將磁盤的第一個扇區(512B)加載到 0x7C00 中,并從這里開始啟動操作系統。

現在,你明白為什么在 x86 文檔中找不到這個神奇數字了吧。這個幻數屬于 BIOS 規范。

0x02:0x7C00的由來

圖片

圍繞 IBM DOS、微軟和SCP 86-DOS 這些科技公司,都是很有趣的故事。請參閱:MS-DOS 簡史(http://www.patersontech.com/dos/Byte/History.html)。

IBM?DOS 1.0 操作系統是參考的?SCP 的"86-DOS"(1980?年)。86-DOS(早期稱為QDOS)是8086/8088 cpu 的 CP/M 兼容操作系統。SCP出售兩塊 S-100總線板,一塊是8086 CPU板,另外一塊是"CPU Monitor" rom板。"CPU Monitor"程序提供了引導加載程序和調試器,這個"CPU Monitor"引導加載程序將 MBR 加載到"0x200",而不是"0x7C00"。?

1981 年,IBM DOS 是適用于 8086/8088 的下一代 CP/M 操作系統,"0x7C00 首次出現在 IBM PC 5150 ROM BIOS 中"。在這之前,SCP 的 CPU Monitor 引導加載程序加載到 0x200,而不是 0x7C00。

0x03:為什么早期的 CPU Monitor 的引導加載程序將 MBR 寫入"0x200"?

關于"0x200"有三個原因:

  • (1) 8086 中斷向量使用 0x0 - 0x3FF

  • (2) 86-DOS 是從0x400加載的

  • (3) 86-DOS 不使用 0x200 - 0x3FF 之間的中斷向量

這些原因意味著 0x200 - 0x3FF 保留空閑,并且86-DOS 或用戶應用程序想要加載到位置,不能妨礙操作系統,因此 Tim Paterson(86-DOS 開發人員)選擇 0x200 作為 MBR 加載地址。

0x04:"0x7C00" 又是誰決定的?

圖片

答案是:IBM PC 5150 BIOS 開發團隊。

"0x7C00 "是由 IBM PC 5150 BIOS 開發團隊(David Bradley 博士)決定的。如上所述,這個神奇的數字誕生于 1981 年,"IBM PC/AT Compat" PC/BIOS 供應商為了 BIOS 和操作系統的向后兼容性,從沒改變過這個值。

不是英特爾(8086/8088 供應商)或微軟(操作系統供應商)決定的。

0x05:"0x7C00 = 32KiB - 1024B"是什么意思?難道只是巧合嗎?

答案是:受操作系統要求和 CPU 內存布局影響。

IBM PC 5150 最小內存型號只有 16KB 內存。因此,你可能會有這樣的疑問:最小內存型號(16KiB)可以從軟盤加載操作系統嗎?BIOS 將 MBR 加載到 32KiB - 1024B 地址處,但物理內存顯然不夠。

不,這種情況不在考慮范圍之內。IBM PC 5150 ROM BIOS 開發團隊成員之一 David Bradley 博士說:"DOS1.0至少需要32KB,所以我們并不考慮在16KB內啟動。"

(注:DOS 1.0 最低要求 16KB 還是 32KB ?我找不到正確的答案。但至少在 1981 年的早期 BIOS 開發中,他們認為 32KB 是 DOS 的最低要求)。

BIOS 開發團隊決定使用 0x7C00 是因為:

  • (1) 他們希望在 32KiB 內為操作系統留下盡可能多的空間來加載自身。

  • (2) 8086/8088使用0x0 - 0x3FF作為中斷向量,BIOS數據區在其之后。

  • (3) 引導扇區為 512 字節,引導程序的堆棧/數據區域需要更多 512 字節。

  • (4) 因此,選擇了 0x7C00,即 32KiB 的最后 1024B。

一旦操作系統加載并啟動,引導扇區在電源重置之前不會被使用。因此,操作系統和應用程序可以自由使用 32KiB 的最后 1024B。

其內存布局如下所示:

+--------------------- 0x0| Interrupts vectors+--------------------- 0x400| BIOS data area+--------------------- 0x5??| OS load area+--------------------- 0x7C00| Boot sector+--------------------- 0x7E00| Boot data/stack+--------------------- 0x7FFF| (not used)+--------------------- (...)

參考:

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165312.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165312.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165312.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2-Linux學習環境搭建

1 Linux學習環境搭建 1.1 虛擬化介紹 # win 機器----》裝一個虛擬化軟件----》虛擬化出linux操作系統# kvm vmware openstack docker k8s # kvm vmware 虛擬化軟件 -運行在linux上,做虛擬化的軟件 -vmware運行在win,linux,商業軟件…

AMEYA360:瑞薩面向高端工業傳感器系統推出高精度模擬前端的32位RX MCU

全球半導體解決方案供應商瑞薩電子(TSE:6723)宣布面向高端工業傳感器系統推出一款全新RX產品——RX23E-B,擴展32位微控制器(MCU)產品線。新產品作為廣受歡迎的RX產品家族的一員,具有高精度模擬前…

hadoop2.x linux集群部署

hadoop2.x 集群部署 下載hadoop需要提前準備好jdk1.8 和rsync 和ssl集群信息解壓安裝配置環境變量配置site配置文件(/hadoop/etc/hadoop目錄下)core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xmlhadoop-env.sh要追加java_home!配置節點slaves 配置免密ssh訪問沒有ssh-co…

【計算方法與科學建模】矩陣特征值與特征向量的計算(四):乘冪法及其python實現

文章目錄 一、Jacobi 旋轉法二、Jacobi 過關法三、Householder 方法四、乘冪法 矩陣的特征值(eigenvalue)和特征向量(eigenvector)在很多應用中都具有重要的數學和物理意義。 本文將詳細介紹乘冪法的基本原理和步驟,并…

【JavaSE】基礎筆記 - 異常(Exception)

目錄 1、異常的概念和體系結構 1.1、異常的概念 1.2、 異常的體系結構 1.3 異常的分類 2、異常的處理 2.1、防御式編程 2.2、異常的拋出 2.3、異常的捕獲 2.3.1、異常聲明throws 2.3.2、try-catch捕獲并處理 3、自定義異常類 1、異常的概念和體系結構 1.1、異常的…

datasets.Dataset.map方法學習筆記

Dataset.map 方法概要 可以將datasets中的Dataset實例看做是一張數據表。map方法會將輸入的function按照指定的方式應用在每一行(每一行稱為一個example)上。本文采用一下示例進行說明: from datasets import Dataset # datasets.__versi…

前端開發工具集合

文章目錄 Visual Studio Code (VS Code)安裝及配置一、安裝二、常用插件三、相關配置四、統一配置代碼 Visual Studio Code (VS Code)安裝及配置 一、安裝 下載地址:https://code.visualstudio.com/ ?> VS Code 下載慢,解決辦法請點擊 雙擊下載文件…

Java零基礎——SpringMVC篇

1.SpringMVC介紹 SpringMVC是Spring框架中的一個組件,是一個輕量級的web的MVC框架,充當controller,其本質就是一個Servlet。 1.1 傳統Servlet的不足 每個請求,都需要定義一個Servlet。雖然可以在service方法中,根據業務標識進行…

【Linux 帶寬限速】trickle,限制docker 上傳速度

限制docker 上傳速度 然而,你可以使用第三方工具來實現這個目的。一個常用的工具是 trickle,它可以模擬網絡帶寬。 首先,你需要安裝 trickle。在 Ubuntu 上,可以使用以下命令安裝: sudo apt-get install trickle然后…

deepxde 源碼閱讀筆記(長期更新)

2023.11.23 閱讀的deepxde version: 1.9.0 1. train_aux_vars ,即pde當中的第三個參數 這個變量的含義困惑很久。最后發現就是operator learning的PDEs方程parameters。 脈絡:def pde aux_vars-> deepxde目前支持tf1最多,但是對其他框架…

系列二、Spring整合單元測試

一、概述 Spring中獲取bean最常見的方式是通過ClassPathXmlApplicationContext 或者 AnnotationConfigApplicationContext的getBean()方式獲取bean,那么在Spring中如何像在SpringBoot中直接一個類上添加個SpringBootTest注解,即可在類中注入自己想要測試…

優秀的企業協同OA系統如何促進團隊協作?

優秀的企業協同OA系統可以幫助團隊協同工作變得更簡單、更高效。 一、以下是一些優秀的企業協同OA系統可以幫助團隊協作的方法: 1、提高工作效率 優秀的企業協同OA系統可以提高工作效率,減少工作的重復性和低效率。例如,可以使用共享日歷和…

vue2生命周期

前言 vue的生命周期其實可以分為兩塊,一個是vue實例的生命周期,一個是組件的生命周期。 vue實例的生命周期方法共有4個:$mout,$forceUpdate,$nextTick,$destroy vue組件的生命周期鉤子共有8個:beforeCreate,created,beforeMount,mounted,beforeUpdate, updated,beforeDestr…

C/C++小寫字母的判斷 2022年3月電子學會中小學生軟件編程(C/C++)等級考試一級真題答案解析

目錄 C/C小寫字母的判斷 一、題目要求 1、編程實現 2、輸入輸出 二、算法分析 三、程序編寫 四、程序說明 五、運行結果 六、考點分析 C/C小寫字母的判斷 2022年3月 C/C編程等級考試一級編程題 一、題目要求 1、編程實現 輸入一個字符,判斷是否是英文小…

iframe內部子頁面與外部主頁面通訊

文章目錄 一、問題二、解決2.1、子頁面2.2、主頁面 三、知識點3.1、[瀏覽器兼容性](https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%85%BC%E5%AE%B9%E6%80%A7)3.2、詳解3.2.1、發送方3.2.2、接收方 一、問題 如上所示&a…

被刪數據庫+勒索

被刪數據庫勒索 – WhiteNights Site 標簽:日志 快照在手,天下我有 服務器又給人黑了。這次是給人黑了數據庫,被人刪庫勒索,先放圖吧。我還花了今天一個下午的時間查修這個漏洞,導致網站有接近6個小時都沒法訪問。 …

編程示例: Session Id的生成

實現思路 Session的實現方式如下:在用戶第一次登錄的時候,系統為它分配一個唯一Id(被稱為Session Id)作為標識,并且 記錄下這個用戶的用戶名、要登錄的賬套名、用戶擁有的權限等,以Id為鍵,用戶名、賬套名等信息為值保…

云原生Kubernetes系列 | Kubernetes靜態Pod的使用

云原生Kubernetes系列 | Kubernetes靜態Pod的使用 靜態pod不建議在master上操作,因為master上跑的是集群核心靜態pod,如果配置失敗,會導致集群故障。建議在knode1或knode2上去做。 kubernetes master節點上的核心組件pod其實都是靜態pod: [root@k8s-master ~]# ls /etc/ku…

java中鎖的使用-實戰

技術主題 技術原理 在實際的業務中,為了保證線程安全,會進行對一些邏輯進行加鎖,保證當前只有一個線程在操作。在代碼中,我們經常使用兩種方式進行加鎖,來保證線程安全。一種是synchronized關鍵字,另一種是ReentrantLock加鎖。寫這一份的博客,就是為了記錄下鎖的基本使…

五分鐘,Docker安裝flink,并使用flinksql消費kafka數據

1、拉取flink鏡像,創建網絡 docker pull flink docker network create flink-network2、創建 jobmanager # 創建 JobManager docker run \-itd \--namejobmanager \--publish 8081:8081 \--network flink-network \--env FLINK_PROPERTIES"jobmanager.rpc.ad…