Linux内核启动解析:从start_kernel到保护模式

需积分: 15 30 下载量 11 浏览量 更新于2024-08-23 收藏 1.37MB PPT 举报
"陈香兰的Linux内核源代码解读,主要关注start_kernel函数在Linux启动过程中的作用。本文档详细阐述了Linux内核从启动到start_kernel的流程,包括BIOS、软硬磁盘启动、启动加载器如GRUB和LILO的工作原理,以及实模式、保护模式和分页模式的转换。此外,还介绍了i386架构下的地址空间、段寄存器、GDT和IDT表等关键概念。" 在深入理解Linux内核启动过程时,我们首先要明白的是,start_kernel是Linux内核初始化的核心部分,它标志着从硬件初始化阶段过渡到操作系统核心功能的构建。当系统通过BIOS加载启动加载器(如GRUB或LILO)并读取到kernel镜像(如bzImage)后,会进一步执行内核的启动代码。这部分代码最初是在实模式下运行的,因为i386架构的CPU启动时默认处于实模式。 实模式下,地址总线只有20位,能够访问的内存限制在1MB之内。地址计算依赖于段地址和段内偏移,其中段地址是16位的段寄存器值左移4位。实模式的主要目的是为了保持与早期8086处理器的兼容性。 在启动过程中,内核需要进入更高级别的保护模式,以利用32位地址空间和内存管理功能。这涉及切换到分页模式,通过全局描述符表(GDT)和中断描述符表(IDT)来管理内存和中断处理。GDT存储段选择子,这些选择子与段寄存器(如cs、ds、es、fs和gs)结合使用,确定实际的内存访问地址。IDT则用于定义中断和异常的处理程序。 start_kernel作为内核启动的第一个进程(0号进程),它的任务不仅仅是初始化硬件,还包括创建系统的第一号进程,即init进程。这个进程负责进一步的系统初始化,例如设置文件系统、网络和设备驱动等,最终找到一个init程序来构建完整的Linux运行环境。 在启动过程中,还会涉及到控制寄存器的设置,如控制分页机制的CR0寄存器。一旦内核完成所有必要的初始化,它会调用cpu_idle,将当前进程转换为idle进程,等待后续的任务调度。 start_kernel是Linux内核启动的关键步骤,它涵盖了从低级硬件初始化到高级系统服务设置的全过程。理解这一过程对于深入学习Linux内核的工作原理至关重要。通过陈香兰的讲解,我们可以更清晰地看到这个过程的细节,从而更好地理解和调试内核代码。