3 实模式下的内核代码
通过上一章节,大家都看到了,最终每个Linux系统都有一个类似/boot/vmlinuz-2.6.x的文件,就是所谓的内核映像。而大家对从源代码到内核映像的形成有了一个较完整的认识。前面也提到了,系统启动的时候,grub会把内核映像加载到内存,然后执行它。总结一下Grub的这一个过程,就是:
1. 调用一个BIOS过程显示“Loading”信息。
2. 调用一个BIOS过程从磁盘装入内核映像的初始部分,即将内核映像的第一个512字节加载到物理地址0x00090000开始的内存中,而将setup程序的代码(参见后面的内存布局)从地址0x00090200开始存入RAM中。
3. 调用一个BIOS过程从磁盘中装载其余的内核映像,并把内核映像放入从低地址0x00010000(适用于使用make zImage编译的小内核映像)或者从高地址0x00100000(适用于使用make bzImage编译的大内核映像,也就是我们现在的情况)开始的RAM中。大内核映像的支持虽然本质上与其他启动模式相同,但是它却把数据放在不同的物理内存地址,以避免ISA黑洞问题。
4. 跳转到arch/x86/boot/header.S的_start处开始执行。
注意grub的stage2会临时地打开保护模式,完成上述的第3步,把内核映像vmlinuz-2.6.x除