BIOS加载MBR到内存地址0x7C00的由来
2014-04-07 19:13
323 查看
为嘛BIOS将MBR读入0x7C00地址处(x86平台下)
http://www.douban.com/note/249471773/2012-11-27 14:03:48
对于很多人来讲0x7C00这个地址是很神秘的,不知道这是干什么的。但是对于了解过x86平台下BIOS启动过程的人,对这个地址再熟悉不过了。BIOS就是将MBR读入0x7C00地址,然后进行后续的引导的。操作系统或是bootloader开发者必须假设 他们的汇编代码被加载并从0x7C00处开始执行。
0x7C00的定义
对于这个地址,它不属于Intel x86平台规范的,而是属于BIOS规范中定义的内容。0x7C00第一次出现在IBM PC 5150的BIOS处理int 19(19号中断)的时候,IBM PC 5150是x86(32位)IBM PC/AT系列的祖先,这款PC于1981年发布,使用了intel 8088(16位)的处理器和16KB的RAM内存,BIOS和微软的基本指令均放在该内存中。
当打开电源,BIOS开始自检,然后出发19号中断,在处理19号中断时,BIOS检测电脑是否具有软盘、硬盘或是固定磁盘,如果有任何可以使用的磁盘,BIOS酒吧磁盘的第一个扇区(512B)加载到内存的0x7C00地址处。
0x7C00的前身
0x7C00地址第一次出现在IBM PC 5150的ROM bios中,在此之前使用的地址是0×200。使用该地址的原因主要有:当时8086中断向量使用地址为0×0-0x3FF;86-DOS从0×400处被加载;而它不使用0×200-0x3FF这段中断向量地址。因此这段0×200-0x3FF地址不能被其他程序使用,Tim Paterson(86-DOS开发者)选择0×200作为MBR加载地址。
0x7C00的意义
他们想留下32kb内更多的空间给操作系统来加载自己;8086/8088使用0×0-0x3FF作为中断向量,然后BIOS数据紧随之后;引导扇区是512字节,但是用于引导程序的栈或数据区域需要多于512字节;因此0x7C00,32kb中的最后1kb被选中。
一旦操作系统被引导并开始,引导扇区将一直不会被使用指导重启,因此操作系统和应用程序可以自由的使用32KB的最后1kb空间。在操作系统被加载后,内存布局如下:
+——————— 0×0
| Interrupts vectors(中断向量表)
+——————— 0×400
| BIOS data area(BIOS的数据区域)
+——————— 0×5??
| OS load area(操作系统加载区域)
+——————— 0x7C00
| Boot sector(引导区域)
+——————— 0x7E00
| Boot data/stack(引导数据/堆栈)
+——————— 0x7FFF
| (not used)
+——————— (…)
参考:
http://www.glamenv-septzen.net/en/view/6
相关文章推荐
- BIOS加载MBR到内存地址0x7C00的由来
- 为什么x86模式里BIOS在0x7c00加载MBR
- 很有趣的BIOS加载MBR到0X7C00的故事
- Why BIOS loads MBR into 0x7C00 in x86 ?
- Why BIOS loads MBR into 0x7C00 in x86 ?
- Why BIOS loads MBR into 0x7C00 in x86 ?
- (ZT)Why BIOS loads MBR into 0x7C00 in x86 ?
- 为什么bios将mbr装载到0x7c00地址,0x7c00怎么来的?
- 为什么bios将mbr装载到0x7c00地址,0x7c00怎么来的?
- Why BIOS loads MBR into 0x7C00 in x86 ?
- Why BIOS loads MBR into 0x7C00 in x86 ?
- Why BIOS loads MBR into 0x7C00 in x86 ?
- Why BIOS loads MBR into 0x7C00 in x86 ?
- 矩阵乘法 and BIOS loads MBR into 0x7C00?
- Why BIOS loads MBR into 0x7C00 in x86 ?
- 为什么bios将mbr装载到0x7c00地址,0x7c00怎么来的?
- Why BIOS loads MBR into 0x7C00 in x86 ?
- Why BIOS loads MBR into 0x7C00 in x86 ?
- Why BIOS loads MBR into 0x7C00 in x86 ?
- Why BIOS loads MBR into 0x7C00 in x86 ?