主引导记录的内存地址为什么是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的主要内容,如果未能解决你的问题,请参考以下文章

为什么主引导记录的内存地址是0x7C00?

x86下SylixOS引导过程分析

第二课 一个简单的“引导程序”

CPU工作原理

在引导加载程序中跳转到0x7C00不会引起无限循环

Linux0.11内核系列—1.引导程序分析