为什么bios将mbr装载到0x7c00地址,0x7c00怎么来的?(翻译)

2024-04-05 00:58

本文主要是介绍为什么bios将mbr装载到0x7c00地址,0x7c00怎么来的?(翻译),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以下内容纯属于个人翻译,因本人英语有限,必然存在一下错误,望海涵! 

 

你知道0x7c00吗?对于x86汇编编程来说,这个是一个神奇的数字.

  0x7c00h是BIOS用于加载MBR(主引导记录,硬盘/软件的第一个扇区)到操作系统或者的内存地址.因此系统开发人员必须确保他们的汇编程序必须从0x7c00开始加载.

   但是,...第一,你也许很疑惑

   “我读inter X86(32位)的所以编程手册,但我却不能找到,但是我却不能从inter的CPU规格书中找到它.”这时,你就会疑惑”是谁决定这个地址呢?”

       第二,你也许会这么想

       “0x7c00在十进制中刚好等于32KB – 1024 B”,那么这个数有什么意思呢?

       是谁定义这个数,为什么他/她要决定如此一个在中途的地址?

       现在有这么两个问题围绕着这个神奇的数字---0x7c00.

       1,谁定义0x7c00

       2,为什么 x7c00 = 32KB – 1024B,它有什么含义?

Ok,现在让我们回过头看看x86(32位)PC机的祖先—IBM PC 5150.

0x7c00最先出现是在IBM PC 5150 BIOS的19h(即25)号中断的句柄.

追踪到IBM x86系列的PC机的历史,你发现它们的祖先是IBM PC 5150 PC机,这么一台PC是在1981年八月份发布的,带有intel的8088(16位)和16K的RAM(迷你内存模式)BIOS和微软基础指令存放在ROM中.

但开机是,BIOS会执行POST(开机自检)程序,之后就会调用 19h号中断,在19h号中断句柄,BIOS会检查pc是否有软盘,硬盘或者可用设备.如果pc拥有可有的设备.BIOS就会从0x7c00这个地址开始加载第一个扇区(512字节)

现在,你已经明白为什么你不能从x86的手册中找到这个神奇的数字,因为这个数字是属于BIOS的规范.

0x7c00的起源

围绕着IBM PC dos,微软和SCP的86-doc有着很著名的故事,你可以去看” A Short

History of MS-DOS”

SCP的 86-dos(1980年)是引用IBM PC DOS 1.0的,86-dos(早期叫做QDOS)是兼容8086/8088CPU的CP/M操作系统.在1979年, 数字研究公司还没有在8086/8088 CPU上发展CP/M出售两套S-100总线板,一个基于是8686CPU,一个是基于CPU监控板(CPU Monitor), CPU Monitor程序提供引导程序和调式功能.这个引导程序是从0x200加载MBR的,并非从0x7c00 在1981年,IBM PC DOS出了一款新的8086/8088的CP/M操作系统.所以,我告诉你这个数字第一次出现于PC 5150 ROM 的BIOS中.

之前,SCP的CPU监控引导程序是从0x200开始引导的,而不是0x7c00.为什么它要从0先0x200引导MBR呢?这里有三个原因.

1,8086的中断向量使用0x0到0x3ff

2,86-dos从0x400加载

3,86-dos不使用0x200-0x3ff的中断向量

 

这些原因就意味着0x200-0x3ff是必须保留的而且在操作系统是是不碍事的,无论是被86-dos或者用户程序加载.

所以,Tim Paterson(86-dos开发者)选择从0x200开始加载MBR

Q:谁决定0x7c00

A:IBM PC 5150 BIOS开发团队,0x7c00是被IBM 5150 BIOS开发团队决定的.

综上所述,这一神奇的数字是出生于1981年, IBM PC / AT COMPAT “ PC / BIOS供应商没有更改BIOS的规范,为了使操作系统的向后兼容。而不是intel或者微软决定的.

q:0x7x00=32KB - 1024B有什么含义?

A:受操作系统和CPU的内存布局的影响.IBM PC 5150秘密内存模式仅仅只有16K的RAM,所以,你可能有一个问题"这个迷你内存模式能从diskette加载操作系统吗?BIOS加载的地址是32K-1024的地址,实际内存不够啊?"不,这个并没有问题.一个IBM PC 5150ROM BIOS开发团队的一个成员--Dr. David Bradley说过:"DOS 1.0要求最低为32KB ,因此我们不关心尝试16KB的引导。"

(注:这个迷你内存模式是要求16位还是32位,我现在也无法考证.)但是,至少,在1981年之前的BIOS开发,他们就已经在dos迷你版支持32KB.

BIOS开发团队定义0x7c00的原因:

1,他们要尽可能留足够的空间给操作系统在32K内加载自己.

2,8086/8088使用0x0-0x3ff作为中断向量,并且之后就是BIOS的数据空间.

3,开机扇区是512字节,开机程序需要的堆栈和数据空间至少要512字节.

4,因此,0x7c00,在32K的最后1024字节就被选择了.

一旦OS加载和启动,引导扇区是从来没有使用过,直到上电复位。

之后操作系统加载后,内存布局将会是

0x0:中断向量

0x400,BIOS数据

0x5?? 操作系统引导空间

0x7c00 开机引导

0x7e00    开机数据/堆栈

0x7fff 没有使用

这就是使用0x7c00的缘由和原因.在PC / AT COMPAT BIOS的INT 19H处理,存活约三十年的神奇的数字。

86-DOS related:

?      "8086 Monitor Instruction Manual"(MON 86 - V1.4)

?      "86-DOS(TM) User's Manual Version 0.3"

?      "86-DOS(TM) Programmer's Manual Version 0.3"

?      "86-DOS(TM) Instruction Manual Version ??"

IBM PC 5150 related:

?      "IBM Personal Computer Hardware Reference Library", "Technical Reference" (IBM Personal Computer Technical Reference manual)

?      "IBM Personal Computer XT Hardware Reference Library", "Technical Reference" (IBM Personal Computer XT Technical Reference manual)

Intel 8086/8088 data sheets:

?      "8086 16-BIT HMOS MICROPROCESSOR"

?      "M80C86/M80C86-2 16-BIT CHMOS MICROPROCESSOR"

?      "8088 8-BIT HMOS MICROPROCESSOR"

CP/M related:

?      The Unofficial CP/M Web Site

o     http://www.cpm.z80.de/

?      CP/M Internals : Oscar Vermeulen Personal Web Site

o     http://www.dcast.vbox.co.uk/cpm.html

?      Digital Research - CP/M

o     http://www.digitalresearch.biz/CPM.HTM

?      CP/M Main Page

o     http://www.seasip.demon.co.uk/Cpm/

86-DOS related:

?      Origins of DOS - Paterson Technology

o     http://www.patersontech.com/dos/

?      86-DOS Resource Website

o     http://www.86dos.org/index.htm

?      DosMan Drivel

o     http://dosmandrivel.blogspot.com/

And all related Wikipedia pages.

Special Thanks To...

Special Thanks To:

?      Tim Peterson

?      David Bradley

for japanese article, see:

"Assembler/なぜx86ではMBRが"0x7C00"にロードされるのか?(完全版)"

 

这篇关于为什么bios将mbr装载到0x7c00地址,0x7c00怎么来的?(翻译)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877265

相关文章

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

Mac备忘录怎么导出/备份和云同步? Mac备忘录使用技巧

《Mac备忘录怎么导出/备份和云同步?Mac备忘录使用技巧》备忘录作为iOS里简单而又不可或缺的一个系统应用,上手容易,可以满足我们日常生活中各种记录的需求,今天我们就来看看Mac备忘录的导出、... 「备忘录」是 MAC 上的一款常用应用,它可以帮助我们捕捉灵感、记录待办事项或保存重要信息。为了便于在不同

springboot+vue项目怎么解决跨域问题详解

《springboot+vue项目怎么解决跨域问题详解》:本文主要介绍springboot+vue项目怎么解决跨域问题的相关资料,包括前端代理、后端全局配置CORS、注解配置和Nginx反向代理,... 目录1. 前端代理(开发环境推荐)2. 后端全局配置 CORS(生产环境推荐)3. 后端注解配置(按接口

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重