这几天看了赵炯老师的《Linux内核完全注释》引导启动部分, 这里把我的理解和所学到的记录下来, 怕以后忘了。 :)
在系统启动的时候:
- l BISO把bootsect.s 代码(512b)读到内存绝对地址0x7c00, 并跳到这个地方开始执行.
- l bootsect程序主要动能是把自己copy到0x90000, 之后转到新地方继续执行. 之后把setup.s的代码加载到0x90200处, 把系统内核加载到0x10000处. 并跳到setup中执行;
- l setup程序主要得到一下机器系统参数, 并把这些参数保存到0x90000处, 供以后使用; 之后把系统内核加载到0x00000处; 接下来设置中断描述寄存器(IDTR)和全局描述符表寄存器(GDTR); 同时开启A20地址线, 从新设置硬件中断号; 最后设置CR0寄存器, 进入32为保护模式, 并跳到system模块head.s处(地址0x00000)执行;
- l head.s 是在保护模式下运行的, 为进入main函数做准备工作; 主要是加载各种数据段寄存器, 重行设置IDTR和GDTR; 这只分页管理相关内容等; 最后跳到main函数执行对linux内核的初始化工作.