Linux内核启动解析:从bootloader到start_kernel
需积分: 12 102 浏览量
更新于2024-11-21
收藏 59KB DOC 举报
"Linux内核启动代码分析涉及到从bootloader加载内核、内核解压缩以及内核初始化的多个阶段。本文主要关注ARM架构下的Linux内核启动过程,以pxa250处理器为例进行讲解。"
Linux内核启动流程始于bootloader加载。Bootloader将Linux内核(通常为压缩后的piggy.gz)加载到内存中,并设置一些关键寄存器,如CPU模式、内存管理单元(MMU)状态等,随后将控制权交给内核。在启动过程中,MMU通常不开启。
内核的解压缩阶段由`arch/arm/boot/compressed`目录下的`head.S`、`head-xscale.S`和`misc.c`文件负责。这些代码的主要任务是解压内核的真正代码,从`head-armv.S`开始执行,后续的内核启动流程将以此为基础。
启动的第一阶段是从`ENTRY(stext)`开始,直至`start_kernel`函数的调用。这部分代码涵盖了`arch/arm/kernel/head-armv.S`和`arch/arm/mm/proc-xscale.S`。在进入`start_kernel`之前,bootloader会在特定的寄存器中设置参数,如`r0`、`r1`和`r2`,用于传递系统类型、机器类型和内存列表的物理地址。
`ENTRY(stext)`是内核的入口点,它位于`kernel.o`目标文件的`.text.init`区域,并在链接时被整合到内核的`.init`段。这里设置了必要的CPU状态,例如通过设置`r0`、`r1`和`r2`寄存器,以及设置中断和异常处理模式。
进入`start_kernel`函数标志着内核初始化的开始,该阶段包含了众多子系统的初始化,如内存管理、设备驱动、进程管理等。`start_kernel`会依次调用一系列的初始化函数,逐步构建起Linux内核的基础架构。
在这个过程中,内核会初始化MMU,设置页表,初始化内存分配器,注册中断处理程序,以及启动系统定时器。此外,还会创建初始进程`swapper/0`,并初始化调度器。内核还会识别和初始化硬件设备,包括串口、网络接口、块设备等,以提供基本的服务。
整个启动过程是一个复杂且精细的步骤序列,每个环节都至关重要,确保了Linux内核能够正确地接管系统并提供服务。对这个过程的理解有助于开发者调试问题、优化性能,以及在特定硬件上定制内核。
429 浏览量
120 浏览量
114 浏览量
2010-05-10 上传
139 浏览量
139 浏览量
106 浏览量
121 浏览量
347 浏览量
zhenwenxian
- 粉丝: 801
- 资源: 773
最新资源
- win_udp:Windows网络udp框架服务器和侦听器
- 如何规划团队训练课程PPT
- torch_cluster-1.5.5-cp36-cp36m-linux_x86_64whl.zip
- 取Excel表格有数据单元格的起讫行列.rar
- zencharts:将 High Charts 库的强大功能与 Zendesk Developer API 相结合的小型应用程序
- wild-rydes:野生莱德
- Redosnap Launcher-crx插件
- CNN_for_brain_ventricles_segmentation:“个人3D脑图集”项目。 利用全卷积神经网络对大脑的CT数据进行分割
- 批量修改文件名.zip
- 取Excel表格有数据单元格的起讫行、列.rar
- html2text:用 Go 编写的 html 到文本转换器
- torch_scatter-2.0.4-cp37-cp37m-win_amd64whl.zip
- Email Notifier-crx插件
- yun-text:“云杯”景区声誉评价得分预测中第三个解决方案的DL部分
- milestoneproject2-memorygame:一种记忆游戏,要求用户匹配隐藏在牌组中的成对纸牌
- Android Binder通信案例