Linux内核启动流程详解:从bootsect.s到main.c的执行关键步骤

版权申诉
0 下载量 78 浏览量 更新于2024-07-06 收藏 55KB DOCX 举报
本文档深入探讨了Linux内核的启动执行流程,主要分为两个阶段:第一阶段从BIOS引导到main.c函数的加载和初始化,第二阶段是从main.c函数执行到系统完全准备就绪。以下是每个阶段的详细分析: **第一阶段:从BIOS引导到main.c执行** 1. **BIOS引导和中断向量表设置**: - 启动时,BIOS负责设置实模式下的中断向量表和中断服务程序,这些信息存储在0x00000到0x003FF处,包括BIOS数据区。 - 利用BIOS中断0x19h加载bootsect.s代码至内存0x07c00,然后转到该地址执行。 - bootsect.s的功能包括将自身复制到0x90000,以及加载setup.s到0x90200。 2. **内存管理和加载setup.s**: - 内存布局中,bootsect.s被覆盖,仅留下少量空间。 - 将系统代码复制到0x00000,覆盖中断向量表和BIOS数据,同时创建新的页目录和页表以扩展寻址空间到4GB。 3. **中断服务程序与硬件配置**: - 开启地址线A20,启用更大的内存寻址范围,并对8259中断控制器进行重新编程,调整中断号。 4. **head.s的执行**: - head.s负责初始化内存的不同部分,如页目录、页表、软盘缓冲区、中断描述符表和全局描述符表,为后续操作做好准备。 **第二阶段:main.c函数后的进程管理与系统初始化** 1. **进程0的创建与保护模式支持**: - 在main.c中,通过一系列操作创建进程0,并确保其能够在32位保护模式下运行,这涉及到硬件和内存管理的协调。 2. **物理内存规划**: - 根设备和硬盘参数表被复制到内存,这是系统设备驱动程序的基础。 - main.c的102、110、111行代码可能涉及内存分配、设备注册等关键步骤。 3. **系统初始化与设备驱动**: - 此阶段包括初始化操作系统核心组件,如内存管理、进程调度、文件系统等,以便为用户提供一个稳定的操作环境。 总结,Linux内核的启动流程复杂且有序,涉及到BIOS交互、内存管理、中断处理、系统分区和设备驱动等多个方面。理解这个过程对于深入研究Linux内核工作原理至关重要,尤其是在底层开发和优化性能时。