深入解析Linux内核源代码:从实模式到硬件初始化

需积分: 0 0 下载量 77 浏览量 更新于2024-10-11 收藏 414KB PDF 举报
"Linux内核源代码导读" 在深入解析Linux内核源代码的过程中,了解其工作原理至关重要。这里我们将探讨4.1实模式setup阶段,这是Linux内核启动过程中的关键部分,它负责进行体系结构相关的硬件初始化。setup阶段的代码主要存在于arch目录下针对不同体系结构的平台代码中,例如在32位x86平台上,它的入口点位于`arch/x86/boot/header.S`中的`_start`。 代码片段4.1.节展示了在x86平台上setup阶段的部分源代码。首先,代码使用16位代码模式(`code16`)进行编译,并定义了`.bstext`段,这是一个特殊的文本段,用于存储启动阶段的代码。接着,代码通过`ljmp`指令跳转到指定的内存段(`BOOTSEG`)执行`start2`函数。 在`start2`函数中,代码对寄存器进行初始化,将代码段寄存器`CS`的值复制到数据段寄存器`DS`、额外的数据段寄存器`ES`和堆栈段寄存器`SS`。清零堆栈指针`SP`,启用中断(`sti`)并设置方向标志(`cld`),这表明接下来的内存操作是从低地址向高地址增长。 然后,程序进入一个消息循环(`msg_loop`),显示错误消息,告知用户直接从软盘启动不再被支持,建议使用引导加载器。这段代码通过`lodsb`指令逐字节加载字符串,`int $0x10`调用BIOS服务在屏幕上显示字符。当字符串结束时,程序会提示用户移除磁盘并按任意键重启。 在代码的`.bsdata`和`.header`段中,分别定义了错误消息字符串和一些重要的内核启动参数,如`setup_sects`表示setup扇区的数量,`root_flags`指定了根文件系统的读写状态(`ROOT_RDONLY`表示只读),`syssize`是系统大小,`ram_size`是内存大小,`vid_mode`是视频模式,而`root_dev`则是根设备号。 理解这个阶段的代码对于深入学习Linux内核启动流程至关重要。在实际模式下,CPU使用实地址模式,无法访问超过1MB的内存,setup阶段的主要任务是初始化硬件环境,设置内存映射,为进入保护模式做准备,最终引导内核进入更高层次的操作系统功能。这个过程涉及到BIOS调用、内存管理、设备初始化等多个方面,是理解Linux内核整体架构的关键一步。后续阶段将涉及保护模式的切换、内核解压、页表设置等复杂操作,这些都将构建起整个Linux系统的基石。