### Linux内核源代码漫游知识点详解 #### 一、引言 《Linux内核源代码漫游》是一本深入浅出介绍Linux内核的书籍,对于初学者来说非常友好。本书作者Alessandro Rubini是一位知名的Linux内核贡献者,他通过这本书引领读者逐步探索Linux内核的核心机制。译者赵炯也为中文读者提供了良好的翻译,使得国内的技术人员能够更加容易地理解和学习Linux内核的相关知识。 #### 二、Linux内核启动过程 1. **系统加电** - 当PC开机时,CPU进入实模式并在ROM-BIOS中从地址0xFFFF0开始执行。 - BIOS进行基本硬件检测,并初始化中断向量表。 - BIOS读取启动设备(如软盘或硬盘)的第一个扇区(即引导扇区)到内存地址0x7C00,并跳转到该位置执行。 2. **引导扇区执行** - 引导扇区由8086汇编语言编写,位于`boot/bootsect.S`文件中。 - 执行过程中,引导扇区代码首先将自身移动到内存地址0x90000,并从启动设备读取额外的2KB代码到内存0x90200。 - 接下来,将内核剩余部分读入到内存地址0x10000,并显示“Loading”提示。 - 控制权转移给`boot/setup.S`中的代码,这是一个实模式汇编程序。 3. **硬件识别与配置** - 启动阶段会识别主机的部分特性及VGA卡类型。 - 可能会提示用户选择控制台显示模式。 - 将整个系统从地址0x10000移动到0x1000,进入保护模式,并跳转到系统剩余部分。 4. **内核解压缩** - 解压缩代码位于`zBoot/head.S`中,初始化寄存器并调用`decompress_kernel()`函数。 - `decompress_kernel()`函数是由`zBoot/inflate.c`、`zBoot/unzip.c`和`zBoot/misc.c`等文件组成的。 - 解压后的数据存储在内存地址0x10000(1MB),这是Linux至少需要2MB内存才能运行的原因之一。 5. **内核构建变化** - 在内核版本1.1.75中,`boot`和`zBoot`目录被移到`arch/i386/boot`中,以支持不同架构下的内核构建。 - 这个改动增强了Linux内核的跨平台能力。 6. **32位设置启动** - 解压后的代码从地址0x10100开始执行。 - 在此阶段,完成IDT、GDT和LDT的加载,确认处理器状态,设置分页等。 - 最终调用`start_kernel`子程序。 #### 三、start_kernel()函数 `start_kernel()`函数位于`init/main.c`中,其主要任务是初始化内核各个组成部分: 1. **内存管理初始化** - 设置内存边界,调用`paging_init()`初始化分页机制。 2. **中断管理初始化** - 初始化中断控制器、IRQ通道等。 3. **调度初始化** - 初始化进程调度器,确保进程能够被正确调度。 4. **其他核心组件初始化** - 包括但不限于文件系统、网络栈、驱动程序等的初始化。 #### 四、总结 《Linux内核源代码漫游》一书通过逐步解析Linux内核启动过程,帮助读者深入了解Linux内核的工作原理。从开机引导到内核解压缩,再到各个关键组件的初始化,每一步都充满了技术细节。通过对这些知识点的学习,不仅能够增进对Linux内核的理解,还能为后续深入研究打下坚实的基础。
剩余8页未读,继续阅读
- 粉丝: 2
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助