为什么 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.mzph.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产品家族的一员,具有高精度模拟前…

【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、异常的…

前端开发工具集合

文章目录 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方法中,根据业务标识进行…

系列二、Spring整合单元测试

一、概述 Spring中获取bean最常见的方式是通过ClassPathXmlApplicationContext 或者 AnnotationConfigApplicationContext的getBean()方式获取bean,那么在Spring中如何像在SpringBoot中直接一个类上添加个SpringBootTest注解,即可在类中注入自己想要测试…

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…

五分钟,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…

【C++干货铺】适配器 | stack | queue

个人主页点击直达:小白不是程序媛 C系列学习专栏:C干货铺 代码仓库:Gitee 目录 stack的介绍和使用 stack的介绍 stack的使用 queue的介绍和使用 queue的介绍 queue的使用 容器适配器 什么是适配器 STL中stack和queue的底层结构 d…

Python——基于YOLOV8的车牌识别(源码+教程)

目录 一、前言 二 、完成效果 三、 项目包 四、运行项目 (教程) 一、前言 YOLOv8LPRNet车牌定位与识别https://www.bilibili.com/video/BV1vk4y1E7MZ/ 最近做了有一个车牌识别的小需求,今天完成了,在此记录和分享 首先&#x…

办公技巧:Word中插入图片、形状、文本框排版技巧

目录 一、插入图片排版技巧 二、添加形状排版技巧 三、插入“文本框”排版技巧 我们平常在制作word时候经常会遇到插入选项卡下的图片、形状和文本框这三种情况下,那么如何使得Word文档当中添加这三个元素的同时,又能保证样式美观呢,今天小…

ComfyUI搭建使用教程

ComfyUI 是一个基于节点流程式的stable diffusion AI 绘图工具WebUI, 你可以把它想象成集成了stable diffusion功能的substance designer, 通过将stable diffusion的流程拆分成节点,实现了更加精准的工作流定制和完善的可复现性。但节点式的工…

【分布式】分布式事务及其解决方案

目录 一、分布式事务二、分布式事务的解决方案1. 全局事务(1)DTP模型(2) 两阶段提交协议(2PC)原理二阶段提交的缺点 (3)三阶段提交协议(3PC)原理 2. 基于可靠…

DDoS攻击和CC攻击有什么不同之处?

DDoS是针对服务器IP发起,CC攻击针对的是业务端口。DDoS攻击打的是网站的服务器,而CC攻击是针对网站的页面攻击,用术语来说就是,一个是WEB网络层拒绝服务攻击(DDoS),一个是WEB应用层拒绝服务攻击…

【JavaWeb】HTMLCSSJavaScript

HTML&CSS&JavaScript 文章目录 HTML&CSS&JavaScript一、开发工具及在线帮助文档二、 HTML2.1 HTML&CSS&JavaScript的作用2.2 HTML基础结构2.3 HTML概念词汇解释2.4 HTML的语法规则2.5 常用标签 三、CSS3.1 引入方式3.2 CSS选择器3.3 CSS浮动3.4 CSS定位…

Linux | 从虚拟地址到物理地址

前言 本章主要讲解虚拟地址是怎么转化成物理地址的,以及页表相关知识;本文环境默认为32位机器下;如果你连什么是虚拟地址都不知道可以先看看下面这篇文章; Linux | 进程地址空间-CSDN博客 一、概念补充 页表:是一种数据…

【性能优化】CPU利用率飙高与内存飙高问题

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

2023APMCM亚太杯数学建模选题建议及初步思路

大家好呀,亚太杯数学建模开始了,来说一下初步的选题建议吧: 首先定下主基调,本次亚太杯推荐选择B题。 C题如果想做好,搜集数据难度并不低,并且模型比较简单,此外目前选择的人数过多&#xff0c…