bootsect.S和setup.S两个文件是为了完成将内核加载到内存,并跳转到内核执行而写的。bootsect.S是由BIOS加载到内存的,只有512个字节,无法完成跳转到内核执行的任务,所以写了setup.S文件,该文件有2KB大小,当然该文件可以更加的大。该文件完成进入32位模式并跳转到内核执行的任务,且该文件实现了通过BIOS中断获取硬件信息的任务,当然该任务也可以有内核完成。
bootsect.s流程
- 将0x07c00的代码移动到0x90000处并跳转到0x90000处继续执行。
(0x07c00的代码BOIS加载的引导扇区) - 跳转后重新设置寄存器(设置段寄存器为0x9000,sp为0x4000-12,代码段,数据段,堆栈段都设置完毕)
- 从内存0x00078复制原软驱参数表到0x94000-12处,然后修改表中的每磁道最大扇区数为18.
- 加载setuo模块(后面的4个扇区)到内存0x90200处。如果出错显示提示,重试。
- 加载system模块至0x10000处
- 确定根设备系统号
setup.s流程
- 使用中断获取所需信息
- 将0x100000处程序移动到0x01000处
- 加载暂时使用的ldt和gdt,gdt基地址为0x00000000
- 开始32为地址线
- 初始化中断控制器
- 开启32位保护模式并跳转到0x00001000处