2.1 计算机的启动过程
载入内存:
(1) 程序被加载器(软件或硬件)加载到内存某个区域
(2)CPU 的 cs:ip 寄存器被指向这个程序的起始地址
2.2 软件接力第一棒,BIOS
2.2.1 实模式下的 1MB 内存布局
Intel 8086 有 20 条地址线,故其可以访问 1MB 的内存空间,即2的20次方=1048576=1MB。
实模式下的内存布局如下:
(1)在电脑未开机前,BIOS就被事先写入到内存的F0000~FFFFF中,此区域为ROM,这里面存的是 BIOS 的代码。BIOS的主要工作是检测、初始化硬件,建立中断向量表。
(2)除了内存条,还有一些外设同样是需要通过地址总线来访问。
2.2.2 BIOS 是如何苏醒的
在开机的一瞬间,CPU的cs:ip
寄存器被强制初始化为0xF000: 0xFFF0
,由于开机的时候处于实模式,按照实模式的寻址方式段基地址要乘以16,也就是左移4位,然后再加上段内偏移地址,则计算得这个实际的物理地址为0xFFFF0
,此地址便是BIOS程序的入口地址。而从地址0xFFFF0~0xFFFFF
只有16B的空间,这说明BIOS真正的执行脚本并不存储在这里,开机后执行的第一条语句一定是跳转语句jmp
,其实执行的第一条语句是:
jmp far f000:e05b
跳转到了0xfe05b
处,说明这里才是BIOS代码真正开始的地方。接下来就是BIOS不断进行检测内存,显卡等外设信息,然后初始化硬件的过程了。
2.2.3 为什么是 0x7c00
BIOS 最后一项工作校验启动盘中位于0盘0道1扇区的内容。如果此扇区末尾的两个字节分别是魔数0x55
和0xaa
,BIOS便认为此扇区中确实存在可执行的程序,并把这个扇区的内容加载到物理地址0x7c00
的内存中。
2.3 实验
任务:
(1)完成mbr主引导记录的代码编写,并完成编译,完成的代码编译并非真正的MBR主引导程序,而是为了测试mbr程序是否会被加载到0x07c00处被正确执行。
(2)将编译生成的主引导记录内容刻录到我们的创建的启动硬盘中。
创建mbr.s文件:
(1ÿ