### Linux内核源代码漫游知识点详解 #### 引言 《Linux内核源代码漫游》是一本针对有一定C语言基础及Unix概念的程序员所撰写的书籍,旨在通过逐步剖析Linux内核的源代码来帮助读者理解其体系结构与核心机制。作者Alessandro Rubini是一位资深的Linux内核开发者,本书由赵炯翻译成中文。 #### 知识点一:Linux内核的启动过程 - **BIOS与初始引导** - 当PC开机后,CPU默认进入实模式并在0xFFFF0地址处开始执行程序,这里是BIOS所在的位置。 - BIOS进行初步的硬件检测,并初始化中断向量表。 - BIOS随后读取启动设备(如硬盘或软盘)的首个扇区内容到内存地址0x7C00,并跳转至此地址开始执行。 - **内核引导扇区的加载** - 内核的最初部分(boot/bootsect.S)由BIOS加载到内存的0x7C00地址处。 - 这个引导扇区的代码负责将自身移动到0x90000地址处,并继续加载后续的引导代码(boot/setup.S)到0x90200地址。 - 内核剩余部分则被加载到0x10000地址处。 - 在这一过程中,“Loading”信息会在屏幕上显示。 - **从实模式到保护模式的转换** - boot/setup.S中的实模式汇编代码进一步识别主机特性与VGA卡类型,并根据需要让用户选择控制台显示模式。 - 随后,整个系统从0x10000地址移动到0x1000地址处,并切换到保护模式。 - 控制权转移至更高地址处的内核代码(通常在0x10000附近)。 #### 知识点二:内核解压缩 - **解压缩过程** - 解压缩代码位于zBoot/head.S中,负责初始化寄存器并调用`decompress_kernel()`函数。 - `decompress_kernel()`函数通过调用zBoot/inflate.c、zBoot/unzip.c和zBoot/misc.c等模块来完成解压工作。 - 解压后的数据存放在0x10000地址处,这是因为Linux至少需要2MB的内存才能运行(1MB用于解压内核,另外1MB用于其他用途)。 - **压缩与解压缩的工具** - 内核压缩工作是由zBoot目录下的Makefile及相关工具完成的。 - 这些工具能够有效地将内核压缩成gzip格式的文件,使得内核占用的空间更小。 - **体系结构适应性** - Linux内核1.1.75版本将boot和zBoot目录合并到arch/i386/boot中,以支持不同体系结构的内核构建。 - 这一改动增强了内核的通用性和可移植性。 #### 知识点三:内核的初始化 - **初始化代码** - 初始化过程主要由boot/head.S中的代码完成,包括加载IDT(中断描述符表)、GDT(全局描述符表)以及LDT(局部描述符表),并完成分页机制的设置。 - 如果初始化过程中出现错误,系统将会死锁,因为此时的操作系统尚未具备错误处理能力。 - **启动核心功能** - 完成初始化后,控制权转移到`start_kernel()`函数(位于init/main.c中),该函数没有返回值。 - 从此开始,大部分代码都是用C语言编写的,除了中断管理、系统调用接口以及宏定义中可能包含的部分汇编代码。 - **内核组件初始化** - `start_kernel()`函数进一步初始化内核的各个关键组件,包括: - 设置内存边界并通过调用`paging_init()`来初始化分页机制。 - 初始化中断管理器、IRQ通道和任务调度器。 通过以上三个主要知识点的介绍,《Linux内核源代码漫游》为我们展示了Linux内核从启动到初始化的核心流程。这些流程不仅涉及复杂的硬件交互,还包含了高效的内存管理和高级软件架构的设计思路,对于深入理解现代操作系统有着重要的意义。
剩余8页未读,继续阅读
- 粉丝: 0
- 资源: 8
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助