linux0.11的启动顺序~

本文详细介绍了从系统加电到Linux内核启动的具体过程,包括BIOS初始化、磁盘引导扇区加载、bootsect.s及setup.s执行、system模块加载与初始化、保护模式设置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

入上图所示:

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 程序中会根据内核的需要重新设置这些描述符表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值