为什么 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.hqwc.cn/news/212073.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java并发】聊聊线程池原理以及实际应用

线程其实对于操作系统来说是宝贵的资源,java层面的线程其实本质还是依赖于操作系统内核的线程进行处理任务,如果频繁的创建、使用、销毁线程,那么势必会非常浪费资源以及性能不高,所以池化技术(数据库连接池、线程池&a…

成为AI产品经理——模型评估概述

目录 一、模型宣讲和评估的原因 二、模型宣讲 三、模型评估 1. 重要特征 ① 特征来源 ②特征意义 2.选择测试样本 3.模型性能和稳定性 一、模型宣讲和评估的原因 刘海丰老师提到他们在做一个金融AI产品未注重模型指标,过于注重业务指标,导致产生…

电力行业的智能调度:数字孪生技术

随着科技的发展,数字孪生技术正逐渐渗透到各个行业领域,其中包括电力行业。数字孪生技术为电力行业带来了前所未有的机遇,使得电力系统的运行更加高效、安全和可持续。本文借用山海鲸可视化软件几个电力行业数字孪生案例探讨数字孪生技术在电…

HCIP数据通信——BGP协议

引言 我之前写过一篇介绍ISIS的文章,我打算把BGP知识总结以后再做实验。那么现在就讲述一下BGP的一些特点和概念。 BGP特点 BGP属于EGP(EGP也是BGP前身,指的是具体协议,被淘汰了成为了BGP),无类协议。 它…

王道p149 9.设树B是一棵采用链式结构存储的二叉树,编写一个把树 B中所有结点的左、右子树进行交换的函数。(c语言代码实现)

本题代码如下 void swap(tree* t) {if (*t){treenode* temp (*t)->lchild;(*t)->lchild (*t)->rchild;(*t)->rchild temp;swap(&(*t)->lchild);swap(&(*t)->rchild);} } 完整测试代码 #include<stdio.h> #include<stdlib.h> typed…

Java之《ATM自动取款机》(面向对象)

《JAVA编程基础》项目说明 一、项目名称&#xff1a; 基于JAVA控制台版本银行自动取款机 项目要求&#xff1a; 实现银行自动取款机的以下基本操作功能&#xff1a;读卡、取款、查询。&#xff08;自动取款机中转账、修改密码不作要求&#xff09; 具体要求&#xff1a; 读卡…

Java 算法篇-深入理解递归(递归实现:青蛙爬楼梯)

&#x1f525;博客主页&#xff1a; 小扳_-CSDN博客 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 递归的说明 2.0 用递归来实现相关问题 2.1 递归 - 阶乘 2.2 递归 - 反向打印字符串 2.3 递归 - 二分查找 2.4 递归 - 冒泡排序 2.5 递归 - 冒泡排序2.0 2.6 递归 - 插…

【腾讯云 HAI域探秘】StableDiffusionWebUI一小时搞定100张设计图

目录 前言一、选择 HAI部署的优势二、HAI 搭建AI绘图服务实现思路三、生成设计图操作流程1、新建HAI应用2、StableDiffusionWebUI&#xff08;1&#xff09;功能介绍&#xff08;2&#xff09;页面转中文&#xff08;3&#xff09;线稿生成图 四、部署StableDiffusionWebUI服务…

【附代码】判断线段是否相交算法(Python,C++)

【附代码】判断线段是否相交算法&#xff08;Python&#xff0c;C&#xff09; 文章目录 【附代码】判断线段是否相交算法&#xff08;Python&#xff0c;C&#xff09;相关文献测试电脑配置基础向量旋转向量缩放向量投影推导 点乘定义推导几何意义 叉乘定义推导几何意义 判断线…

怎样用AIDL Service 传递复杂数据

大家都知道在Android中通过AIDL可以跨进程调用Service中的数据&#xff0c;网上也有很多实例&#xff0c;但是大部分实例都是关于基本数据类型的远程调用&#xff0c;很少讲到复杂数据的调用&#xff0c;今天我用一个例子来演示一下怎样用AIDL Service 传递复杂数据。 我们分2…

【神印王座】龙皓晨美妆胜过月夜,魔神皇识破无视,撮合月夜阿宝

Hello,小伙伴们&#xff0c;我是拾荒君。 《神印王座》国漫第82集已更新&#xff0c;拾荒君和大多数人一样&#xff0c;更新就去看了。魔神皇枫秀&#xff0c;威严凛然&#xff0c;突然空降月魔宫&#xff0c;整个宫殿都在这股无与伦比的强大气息中颤栗。为了顺利躲避魔神皇的…

延时任务定时发布,基于 Redis 与 DB 实现

目录 1、什么是延时任务&#xff0c;分别可以使用哪些技术实现&#xff1f; 1.2 使用 Redis 和 DB 相结合的思路图以及分析 2、实现添加任务、删除任务、拉取任务 3、实现未来数据的定时更新 4、将数据库中的任务数据&#xff0c;同步到 Redis 中 1、什么是延时任务&#xff…