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

计算机启动时,BIOS会将主引导记录加载到内存的0x7C00地址,这一传统源于8088芯片时代,以确保足够的连续内存供操作系统使用。8088需要内存的前部分来存放中断处理程序,因此主引导记录被放在了内存尾部。主引导记录是一个不超过512字节的小程序,负责将控制权转交给操作系统。这一设计保持了与早期系统的兼容性。
摘要由CSDN通过智能技术生成

        最近看操作系统编写方面的书籍,对于其中的一些代码很好奇。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:一个操作系统的实现》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要出家当道士

打赏是不可能,这辈子都不可能

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值