引言:在上节提到双系统关键技术之一关于系统启动问题,即在执行内核代码前做了些什么?是怎样从汇编代码过渡到c代码执行?arm芯片和x86芯片启动有什么不同?
结合这些问题去研究,这里推荐赵炯的《Linux内核完全注释》v3.0,内核版本0.11,内核版本虽然比较低,但理解起来较为容易,更重要的是该书对引导程序的注解非常到位。有些结论就直接引用该书,他山之石可以攻玉。
计算机系统的粗略启动流程:
上电 –> BIOS自检 –> bootloader –> kernel
对Linux x86启动有几个问题值得关注:
- 上电后PC指针如何跳转到BIOS程序处?
- bootloader的代码放在何处?如何执行bootloader的代码?
- bootloader具体做了什么操作?
问题1,书中给出实模式即cpu访问的是实际内存地址,上电和复位后,cpu自动设置了CS和IP的值,此时IP指向0xfffffff0,此处是系统ROM BIOS存放的位置。
对于这样的回答应该不算满意,比如cpu自动设置能修改吗?BIOS代码在何处?此处0xfffffff0如何映射到BIOS的位置?
继续探索得知,BIOS代码存放在ROM(flash)中,而这块ROM的BIOS地址通常放在CPU能寻址的内在最高端,长度256K~2M。这样的确可以解释BIOS程序的执行,那么这个映射是如何完成的?
这里必须提一下32位cpu最大可寻到的物理址4G,这部分地址主要给RAM用(低端地址)ÿ