Linux 系统启动过程(initrd部分) --- Linux boot process (initrd part)

来源:互联网 发布:qt编程语言 编辑:程序博客网 时间:2024/05/16 10:30

 

 Linux 系统启动过程(initrd部分) --- Linux boot process (initrd part)

 

  bzImage和zImage的区别来自于保护模式代码的放置位置:

1.众所周知,内核映像包括两部分代码:实模式代码和保护模式代码,当引导装载器装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行中转入CPU保护模式,开始执行32位保护模式代码。

2.不管是zImage还是bzImage,他们的实模式代码部分都被装入0x9000:0000(物理地址0x90000)-0x9A00:0000(物理地址0x9A000),其中0x9000:0000-0x9020:0000是内核引导扇区,现在只是些假代码,无用。0x9020:0000-0x9800:0000是内核实模式代码。内核从这里开始执行。

3.bzImage的内核映像中的保护模式代码,由引导装载器直接装载入高位内存(物理地址0x100000),就是1M以上。内核实模式代码在完成检查引导装载器兼容性(旧loader可能把实模式代码放在不是0x90000的其他地方,这是需要移到这里),A20(不明白:-(),初始化gdt,idt(全局描述表,和中断描述表)之后,就将CPU初始化为保护模式,然后跳转到0x100000。至此内核活了起来,他进入了强大的32位线性地址空间执行。由于bzImage是在1M以上,所以它的大小理论上是没有限制的。

4.zImage的的内核映像中的保护模式代码由引导装载器装载入低位内存区0x1000:0000-0x9000:0000(物理地址0x10000-0x90000),然后实模式代码在把它移到从64K=0x10000位置移到4K位置0x1000,然后做和bzImage实模式代码一样的事情,如:检查引导装载器兼容性,A20,初始化gdt,idt(全局描述表,和中断描述表),最后进入保护模式代码执行,0x100:0000(物理地址0x1000)位置。所以我们看到保护模式代码范围必须是0x10000-0x90000,大小是512K字节,再大就会覆盖实模式安装代码。所以zImage的内核最大只能512K.