MIT-6.828-JOS 启动过程总结

1. BIOS初始化

1.1 CPU启动后,它会先加载BIOS模块代码到内存中执行。

1.2 BIOS会初始化硬件设备,初始化初始中断描述符表,这个中断描述符表叫“初始”是因为它是供内存描述符表初始化之前使用的,内核描述符表初始化后就会被清除。

1.3 BIOS会从启动盘中读取第一块内容并加载到内存的0x7c00,之后就跳转到0x7c00出执行。到这里,BIOS使命就完成了,boot loader模块开始运行。

2. BOOT模块

2.1 首先,看一下JOS的磁盘布局:boot loader存在第一扇区,而内核代码从第二扇区开始存储。

2.2 到目前为止,处理器还处于实模式状态,所以boot loader的第一个工作就是重置数据段寄存器DS,ES,SS为0

MIT-6.828-JOS 启动过程总结

2.3 开启A20地址线,为进入保护模式做准备

MIT-6.828-JOS 启动过程总结

2.4 加载全局描述符表,置位CR0寄存器的PE位,通过ljmp指令正式进入保护模式

MIT-6.828-JOS 启动过程总结

MIT-6.828-JOS 启动过程总结

 

2.5 进入保护模式后,先设置数据段描述符寄存器,然后设置栈指针初始化内核栈,这里值得一提的是JOS把boot loader的这段空间复用为了栈空间。最后call 到bootmain中从磁盘加载内核代码到内存。

MIT-6.828-JOS 启动过程总结

MIT-6.828-JOS 启动过程总结

MIT-6.828-JOS 启动过程总结

2.6 到这里,boot loader工作完成,控制权交给kernel,也就是上一张图片的最后一行代码。