主引导记录的内存地址为什么是0x7C00
Posted 我要出家当道士
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主引导记录的内存地址为什么是0x7C00相关的知识,希望对你有一定的参考价值。
最近看操作系统编写方面的书籍,对于其中的一些代码很好奇。org为什么要指定0x7c00这个位置。书中的解释是下面两张图,。。。不知所云
org 07c00h ; 告诉编译器程序加载到7c00处
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用显示字符串例程
jmp $ ; 无限循环
DispStr:
mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
mov cx, 16 ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中断
ret
BootMessage:
db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
问题真正的答案,在网上找了半天也没有确切的答案。后来再阮一峰的博客里发现了答案(膜拜大佬)。下面揭晓谜底:
简单说,计算机启动是这样一个过程。
1、通电
2、读取ROM里面的Bios,用来检查硬件
3、硬件检查通过
4、BIOS根据指定的顺序,检查引导设备的第一个扇区(即主引导记录),加载在内存地址 0x7C00
5、主引导记录把操作权交给操作系统
主引导记录就是引导"操作系统"进入内存的一段小程序,大小不超过1个扇区(512字节)。0x7C00这个地址来自Intel的第一代个人电脑芯片8088,以后的CPU为了保持兼容,一直使用这个地址。
当时,搭配的操作系统是86-DOS。这个操作系统需要的内存最少是32KB。我们知道,内存地址从0x0000开始编号,32KB的内存就是0x0000~0x7FFF。
8088芯片本身需要占用0x0000~0x03FF,用来保存各种中断处理程序的储存位置。(主引导记录本身就是中断信号INT 19h的处理程序。)所以,内存只剩下0x0400~0x7FFF可以使用。
为了把尽量多的连续内存留给操作系统,主引导记录就被放到了内存地址的尾部。由于一个扇区是512字节,主引导记录本身也会产生数据,需要另外留出512字节保存。所以,它的预留位置就变成了:
0x7FFF - 512 - 512 + 1 = 0x7C00
参考:
http://www.ruanyifeng.com/blog/2015/09/0x7c00.html
https://www.ruanyifeng.com/blog/2013/02/booting.html
http://www.glamenv-septzen.net/en/view/6
《30天自制操作系统》
《Orange’S:一个操作系统的实现》
以上是关于主引导记录的内存地址为什么是0x7C00的主要内容,如果未能解决你的问题,请参考以下文章