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

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…