Linux内核启动过程详解

需积分: 10 1 下载量 160 浏览量 更新于2024-07-23 收藏 471KB PDF 举报
"这篇文档主要讨论了Linux内核的启动过程,特别是针对2.4版本以前内核的启动装载内存布局。文中提到了Image和zImage两种内核启动方式,并详细解析了不同部分在内存中的分布。" 在Linux操作系统中,内核启动是整个系统运行的起点。本文档详细阐述了Linux内核的传统启动协议,这主要适用于2.4及更早版本的内核。首先,启动协议中提到的`Image`和`zImage`是两种不同的内核映像格式: 1. **Image**:这是一个未压缩的内核映像,包含了所有必要的初始化代码和数据,直接加载到内存后就可以执行。 2. **zImage**:这是经过压缩的内核映像,通常比Image小,因为它去除了空洞和重复的数据。在加载到内存后,系统会先解压,然后再执行。 内存布局在启动过程中起着关键作用,以下是文档描述的传统内存布局: - **0x0A0000**:保留给BIOS使用,不应被其他程序占用。这部分区域包含BIOS扩展数据区(EBDA)。 - **0x09A000 - 0x098000**:存放命令行参数,这是用户在启动时传递给内核的参数。 - **0x098000 - 0x090200**:栈和堆空间,用于内核实模式代码的运行。 - **0x090200 - 0x090000**:内核设置,包含实模式下的初始化代码。 - **0x090000**:内核引导扇区,即传统的MBR加载的512字节扇区。 - **0x010000 - 0x090000**:保护模式的内核主体,这部分在启动后会被加载到内存的高端地址。 - **0x001000 - 0x010000**:引导加载器区域,这是引导程序的入口点,通常位于0x7C00。 - **0x000800 - 0x001000**:MBR(主引导记录)预留空间。 - **0x000600 - 0x000800**:通常由MBR使用。 - **0x000000 - 0x000600**:仅限BIOS使用。 对于使用`bzImage`的情况,内核映像是被放置在高端内存(0x1000000)开始的地方,而实模式代码可以被重定位到0x100000到低端内存底部之间的任何地址。这种布局是为了避免与BIOS或其他早期加载的代码冲突。 文档中提到,从2.00版本开始,内核启动过程进行了一些调整,包括内核实模式代码的可重定位性增强,使得内核能够适应不同的内存配置。这种灵活性使得Linux内核能够在各种硬件平台上高效运行。 理解这些启动过程和内存布局对于系统管理员、驱动开发者以及对Linux内核感兴趣的任何人都非常重要,因为它有助于诊断启动问题,优化内存使用,以及开发和调试内核模块。