【BIOS 运行阶段】上电后,内存空空如也,CPU 在傻等内存中的能够运行的程序(OS),内存在等待 BIOS 加载 OS,一切的重担落在了 BIOS 上,谁来执行 BIOS 中的程序?——硬件自动加载。BIOS 是一个固化到内存末端的 ROM 程序,我们将从 BIOS 程序的某处开始运行,CPU 逻辑电路在加电瞬间强行执行 0xFFFF0H 处的代码,正是 BIOS 的地址位置。如果这个位置没有代码呢?那就无法启动了。
【引导任务阶段】分三部分加载所需代码。
【BIOS 加载 bootsect.s】BIOS 阶段建立的 int 0x19 中断,将硬盘第一个扇区(512B)中的程序(bootsect.s)加载到内存的 0x7C00H,这个中断服务程序的功能是 BIOS 提前设计好的,代码是固定的。bootsect.s 加载 setup.s 和 system.s。
两个约定:对于操作系统,设计者必须把最开始执行的程序放在启动扇区,其余的程序可以依照操作系统的设计顺序加载在后续的扇区中。对于 BIOS,0xFFFF0 位置就应该是启动程序,目的是为了从硬盘的启动扇区加载引导程序,必须将程序加载到内存的 0x7C00 处,忽视启动扇区中的内容,不管其中是什么,不管是什么操作系统,只负责加载。
【setup.s】利用 BIOS 提供的中断服务程序从设备上提取内核运行所需的机器系统数据,其中包括光标位置和显示页面等数据,并且获取硬盘参数表 1 和硬盘参数表 2,将它们存放在内存中的特定位置上,这些机器数据被加载到内存 0x90000 开始的位置上,即覆盖了 bootsect 程序所在的部分区域。
为什么说是部分区域呢?因为这些数据大小是 510 字节,而 bootsect 的大小是 512 字节,需要加载的数据刚好占用仅一个扇区的位置,而 bootsect 又占用一个扇区,启动扇区的使命刚刚完毕,它的地址空间就被 setup 所加载的数据所覆盖,内存使用率极高。
【system.s】内核程序+head.s。
main 的由来。
相关文章: