Linux内核分析之基础知识-5
第5章:通用启动流程 start_kernel
所有架构的 C 语言初始化入口
本章概述
start_kernel() 是 Linux 内核的通用 C 语言入口点,所有架构最终都会跳转到这个函数。本章详细讲解这个核心初始化函数的执行流程。
start_kernel 调用链
1 | ┌─────────────────────────────────────────────────────────────┐ |
5.1 start_kernel 入口
5.1.1 函数定义和初始化
1 | /* init/main.c */ |
5.1.2 栈魔数机制
1 | /* 内核栈魔数定义 */ |
5.2 早期初始化
5.2.1 完整的早期初始化序列
1 | void start_kernel(void) |
5.3 setup_arch() - 架构特定初始化
5.3.1 x86_64 的 setup_arch()
1 | /* arch/x86/kernel/setup.c */ |
5.3.2 ARM64 的 setup_arch()
1 | /* arch/arm64/kernel/setup.c */ |
5.4 核心子系统初始化
5.4.1 完整的 start_kernel 序列
1 | void start_kernel(void) |
5.5 rest_init() - 最终初始化
5.5.1 rest_init 函数
1 | /* init/main.c */ |
5.5.2 kernel_init 线程
1 | /* init/main.c */ |
5.6 initcall 机制
5.6.1 initcall 级别
1 | /* init/main.c */ |
5.6.2 do_initcalls() 执行
1 | /* init/main.c */ |
5.6.3 常见 initcall 示例
1 | /* core_initcall 示例 */ |
5.6.4 initcall 调试
1 | /* 启用 initcall 调试 */ |
5.7 系统状态转换
5.7.1 系统状态枚举
1 | /* include/linux/kernel.h */ |
5.7.2 状态转换图
1 | ┌─────────────────────────────────────────────────────────────┐ |
5.8 本章小结
start_kernel 流程回顾
1 | start_kernel() |
时间线总结
| 时刻 | 事件 |
|---|---|
| ~1s | startup_64/__primary_switch 完成 |
| ~1.2s | start_kernel 开始 |
| ~1.5s | setup_arch 完成 |
| ~2s | sched_init 完成, 调度器启动 |
| ~2.5s | console_init, 可以看到输出 |
| ~3s | initcalls 开始执行 |
| ~3s-5s | 设备驱动初始化 |
| ~5s | 用户空间 init 启动 |
- Title: Linux内核分析之基础知识-5
- Author: 韩乔落
- Created at : 2026-01-08 02:47:03
- Updated at : 2026-01-19 13:40:38
- Link: https://jelasin.github.io/2026/01/08/Linux内核分析之基础知识-5/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments