以下内容纯属于个人翻译,因本人英语有限,必然存在一下错误,望海涵!
你知道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"にロードされるのか?(完全版)"
分享到:
相关推荐
- `mov sp, 0x7c00`:将SP(栈指针寄存器)设置为0x7c00,这表示栈的顶部将被初始化到MBR代码区域的末尾。 这些操作用于设置栈环境,以便后续可以正确地使用栈进行数据传递和存储。 #### 2. 设置中断和保护模式 `...
首先,反编译结果显示的汇编指令是从地址`0x7C00`开始的,这是BIOS加载MBR到内存的默认位置。以下是部分关键指令的解释: 1. `xor ax, ax`: 清零AX寄存器,通常用于初始化。 2. `mov ss, ax`: 将AX寄存器的值(0)...
在地址7C00处,我们发现了一个jmp 7c0c指令,这个指令将控制权转移到地址7C0C处。 2. 在地址7C0C处,我们发现了一个sti指令,这个指令将中断标志置位。然后,我们发现了一个REPZ MOVSB指令,这个指令将7C1B地址的...
5. **为什么BIOS将MBR读入0x7C00地址处(x86平台下).doc**:主引导记录(MBR)包含启动加载器,用于启动操作系统。此文档可能解释BIOS选择0x7C00作为加载点的历史原因和技术考虑。 6. **VGA.doc**:VGA(Video ...
引导扇区程序被加载到物理地址0x7c00开始执行,这是BIOS加载引导扇区的标准位置。在Bochs中,可以通过`sreg`命令查看CPU的段寄存器状态,`xp`命令用于打印内存区域的内容,而`vb`命令则用于设置断点。 实验步骤中,...
1. bootsect.S将自己从ROM BIOS载入的绝对地址0x7C00处搬到0x9000处,然后利用一个jmpi的指令,跳到新位置的jmpi的下一行(go:)去执行。 2.接着,将其他segment registers包括DS、ES、SS都指向0x9000这个位置,与CS...
### BIOS、MBR、PBR、分区等基础知识详解 #### 一、BIOS(基本输入输出系统) **定义与功能:** BIOS(Basic Input/Output System)是一种存储在计算机主板上的只读内存(ROM)中的程序。它为计算机硬件与操作系统...
1. **BIOS中断调用**:MBR的执行始于BIOS,它会加载MBR到内存的0x7C00地址。源码中可能会包含诸如`int 13h`这样的中断调用来与BIOS交互,如读取硬盘数据。 2. **检测硬盘分区**:MBR中包含了检查硬盘分区表的代码,...
(1) BIOS执行INT 0x19,加载MBR至0x7c00并跳转执行。如果你安装GRUB到MBR,GRUB的安装程序会把Stage1(512B)拷贝到MBR。视stage2的大小,安装程序会在Stage1中嵌入Stage1_5或者Stage2的磁盘位置信息。 (2) Stage1...
使用功能02H可以将光标定位到指定的文本坐标。BH为显示页码,DH和DL则分别代表行和列的坐标。 4. **读取光标信息** (功能03H) 这个功能用于获取光标的位置和形状信息。CH和CL返回光标的起始和终止行,DH和DL返回...
下面这段代码实现把0000:7c1b处MBR代码复制485个字节到0000:061b处,为什么不从0000:7c00开始复制512个到0000:06cc处,因为前面1b 个字节为复制代码,所以忽略.空出的0000:7c00 开始的空间将读入活动分区的操作系统的...
BIOS将引导扇区加载到内存的0x7C00处,然后跳转执行,因为这是BIOS规定的位置。 2. BIOS仅加载一个扇区是因为它的职责是找到操作系统并将其初步加载到内存,后续的扇区加载由引导加载器(如bootsect)负责。这样的...
而这个工作最开始的部分,BIOS需要完成一些检测工作,和设置实模式下的中断向量表和服务程序,并将操作系统的引导扇区加载至0x7C00处,然后将跳转至0x7C00。 思考题2:为什么BIOS只加载了一个扇区,后续扇区却是由...
引导过程始于BIOS读取MBR并将其加载到内存的0x7C00地址。MBR中的汇编代码首先执行一些基本的硬件初始化,如设置堆栈指针、检查引导扇区的签名以验证其有效性。接着,代码会查找活动分区,即分区表中标识为活动的分区...
`BC007C mov sp,0x7c00`设定堆栈指针SP为0x7c00,初始化堆栈。`FB sti`开启中断,允许系统处理中断请求。 `B8C007 mov ax,0x7c00`将0x7c00赋值给AX,`8ED8 mov ds,ax`设置数据段DS。这一系列操作是用来设置系统的...
计算机启动过程(1)- BIOS+MBR 部分 本文总结了计算机启动过程的第一部分,主要介绍了 BIOS 和 MBR 的基本概念、组成和工作原理。 一、BIOS(Basic Input/Output System) BIOS 是计算机的基本输入/输出系统,...
- **0x0009**: 文件缓冲区地址无效。 - **0x000A**: 未知错误。 - **0x000B**: 系统无法识别某种格式。 - **0x000C**: 系统无法读取数据。 - **0x000D**: 系统无法执行指定的操作。 - **0x000E**: 文件缓冲区太小,...
BIOS+MBR硬盘,一步一步教你怎么用clover装黑苹果,教程采用的格式是MBR硬盘格式安装的,采用的电脑是笔记本G510,关闭独显采用核显为HD4600,配置如下:
### BIOS、MBR、PBR等基础知识 #### 1. BIOS概述 BIOS(Basic Input/Output System)即基本输入输出系统,是一组被固化在计算机主板上的ROM芯片中的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息...