linux内核启动的入口介绍及说明
目录
- linux内核启动的入口点根据架构不同而有所差异
- Linux内核启动流程可分为以下几个关键阶段
- 关键架构差异
- 总结
Linux内核启动的入口点根据架构不同而有所差异
主要分为以下几个关键阶段和入口位置:
1.链接脚本定义的初始入口
内核镜像通过vmlinux.lds链接脚本指定入口符号,ARM架构通常为_text或stext,x86架构则为startup_32或shttp://www.devze.comtartup_64。该入口位于.head.text段,由汇编代码实现。
2.架构相关入口函数
- ARM架构:
arch/arm/kernel/head.S中编程客栈的stext函数,负责关闭MMU/D-Cache、校验处理器类型、创建初始页表等硬件初始化。 - x86架构:
arch/x86/boot/header.S中的startup_32(32位)或startup_64(64位),完成实模式到保护模式切换、解压内核等操作。
3.通用内核入口
架构相关初始化完成后,统一跳转到C语言编写的start_kernel()函数(位于init/main.c),这是内核初始化的核心入口,负责调度器、内存管理等子系统初始化。
4.启动流程关键节点
- Bootloader加载压缩内核镜像并传递参数
- 解压程序(如
handroidead.o/misc.o)解压内核主体 - 执行架构特定的
__primary_switch等函数切换到虚拟地址空间 - 最终通过
rest_init()创建init进程(用户态第一个进程)。
不同架构的入口实现虽存在差异,但均遵循“汇编初始化→跳转C代码→完成核心初始化”的流程模式。
Linux内核启动流程可分为以下几个关键阶段
固件初始javascript化阶段
- BIOS/UEFI执行硬件自检(POST)并加载引导程序
- 传统bios读取MBR,UEFI通过ESP分区查找引导程序
- GRUB等引导加载程序将压缩内核(vmlinuz)www.devze.com和initramfs加载到内存
内核解压阶段
- 执行压缩内核头部的解压程序(head.o/misc.o)
- 解压后跳转到架构特定入口:x86为startup_32/64,ARM为stext
- 完成实模式到保护模式切换(32位)或直接进入长模式(64位)
早期初始化阶段
- 关闭中断并初始化临时页表
- 检测CPU特性(PAE/SSE等)和内存布局
- 设置初始堆栈和异常处理机制
核心初始化阶段(start_kernel)
- 初始化调度器(sched_init)和内存管理(mem_init)
- 建立伙伴系统和slab分配器
- 初始化中断子系统(IDT/PIC)和控制台
- 加载驱动模块并探测硬件设备
用户空间过渡阶段
- 通过rest_init()创建内核线程kthreadd
- 挂载根文件系统并执行/sbin/init(或systemd)
- 移交控制权给用户空间第一个进程(PID 1)
关键架构差异
- x86:通过bootsect.S→setup.S→head.S三级跳转
- ARM:直接由stext入口执行向量表和页表初始化
- 嵌入式系统可能跳过initramfs直接挂载根文件系统
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
加载中,请稍侯......
精彩评论