linux0.11的启动顺序~

来源:互联网 发布:为什么淘宝寄快递便宜 编辑:程序博客网 时间:2024/05/21 18:42

 

入上图所示:

1.系统加电后,80X86的CPU将进入实模式,并从地址0xFFFF0开始自动执行程序代码,而这个地址通常是ROM-BIOS中的地址。

2.BIOS将执行一些系统的检测,并在物理地址0处初始化中断向量。将可启动设备的第一个扇区(磁盘引导扇区MBR)读入内存绝对地址0x7C00处,并跳转到这个地方。对linux0.11来说,读到这个地方的是bootsect.s(磁盘引导块程序)。

3.bootsect.s开始执行后,第一,将自己从0x7C00移动到0x90000(576k);第二,使用BIOS中断将setup.s加载到自己的后面(0x90200)(576.5k);第三,将system加载到地址0x10000处。

4.setup.s的功能主要是利用BIOS中断读取机器系统数据,并将这些数据保存到0x90000开始的位置(覆盖掉了bootsect 程序所在的地方),这些数据将被内核中相关程序使用。

5.然后setup 程序将system 模块从0x10000-0x8ffff(当时认为内核系统模块system 的长度不会超过此值:
512KB)整块向下移动到内存绝对地址0x00000 处。

6.接下来加载中断描述符表寄存器(idtr)和全局描述符表寄存器(gdtr),开启A20 地址线,重新设置两个中断控制芯片8259A,将硬件中断号重新设置为0x20 - 0x2f。最后设置CPU 的控制寄存器CR0(也称机器状态字),从而进入32 位保护模式运行,并跳转到位于system模块最前面部分的head.s 程序继续运行。

7.为了能让head.s 在32 位保护模式下运行,在本程序中临时设置了中断描述符表(idt)和全局描述符表(gdt),并在gdt 中设置了当前内核代码段的描述符和数据段的描述符。在下面的head.s 程序中会根据内核的需要重新设置这些描述符表。