0x7c00是BIOS将主引导扇区加载到内存的地址。0x7c = 32KB - 1KB,为什么是这个数?
从头开始讲:
计算机是这样启动的:
- 上电
- 读取ROM里面的BIOS,用来检查硬件(Power On Self Test)
- 硬件检查通过
- BIOS根据指定的顺序,检查引导设备的第一个扇区(即主引导记录),将这个扇区加载在内存地址 0x7c00处
- 主引导记录把操作权交给操作系统
主引导记录就是引导“操作系统”进入内存的一段小程序,大小不超过1个扇区(512字节)。
0x7c00这个地址来自Intel的第一代个人电脑芯片8088,之后的CPU为了保持兼容就一直使用这个地址。
1981年8月,IBM公司最早的个人电脑 IBM PC 5150 上市,就用了这个芯片。当时搭配的操作系统是86-DOS.这个操作需要的内存最少是32KB。内存地址从0x0000开始编号,32KB的内存就是 0x0000~0x7FFF。
8088芯片本身需要占用 0x0000~0x03FF,用来保存各种中断处理程序的储存位置。(主引导记录本身就是中断信号INT 19h的处理程序)。所以,内存只剩下 0x0400~0x7FFF可以使用。
为了把尽量多的连续内存留给操作系统,主引导记录就被放到了内存地址的尾部。由于一个扇区是512 字节,主引导扇区本身也会产生数据,需要另外留出512字节保存。所以,它的预留位置就变成了:
0x7FFF - 512 - 512 + 1 = 0x7c00,也即 32KB - 1KB。
所以0x7c00 就是这样来的。
计算机启动后,32KB内存的使用情况如下:
+--------------------- 0x0
| Interrupts vectors
+--------------------- 0x400
| BIOS data area
+--------------------- 0x5??
| OS load area
+--------------------- 0x7C00
| Boot sector
+--------------------- 0x7E00
| Boot data/stack
+--------------------- 0x7FFF
| (not used)
+--------------------- (...)