Linux 内核是一个表面简单,内部十分完整而复杂的开源操作系统内核,被广泛应用于服务器,智能设备,移动端和嵌入式等各种场景。想要系统地学习 Linux 内核,首先需要明确它的总体框架和模块分布。
本文将从应用观点出发,分析 Linux 内核中各个核心组成部分,帮助阅读者打通某一部分学习后,能与全局交合,结构综合理解。
在这里插入图片描述
一、Linux 内核总体构成
以使用观点说,Linux 内核可以分为四层:
Linux 内核总体构成
|
|│
|├—【一、架构层 (arch/)】
|├—【二、核心层 (kernel/)】
|├—【三、子系统层 (fs/mm/sound/net/...)】
|└—【四、驱动层 (drivers/)】
【1】架构层 (arch/)
实现对应 CPU 架构的启动线程、下升文件、中断调用、MMU配置等架构级别的选择和扩展,如 arch/arm64/ 。
【2】核心层 (kernel/)
包括内核调度器、并发断言、时钟机制、常规表等内核核心环节,也包括 kthread 线程管理、rcu 缓存、printk 日志系统。
【3】子系统层
包括存储系统(mm/)、文件系统(fs/)、声音子系统(sound/)、网络系统(net/)、安全系统(security/)等。每一子系统都是一套自我完整的 API + 内核协调机制。
【4】驱动层 (drivers/)
接口硬件,属于实际运行环境级,包括 platform 驱动,各类总线(i2c/spi/usb),存储、声音、电源、gpu/vpu 等高级驱动。
二、启动流程前端观察
U-Boot/TF-A↓
start_kernel()↓
init/main.c -> rest_init()↓
kernel_init_freeable()↓
initcalls 初始化各子系统
根据这个流程,你在阅读内核日志或调试时,可以看 initcall debug 日志,分析每个子系统被调用的时机和顺序。
三、核心模块系统细分
1. 调度器
- 优先级系统:CFS(常规调度)和 RT 系统
- task_struct 中的所有操作
- 多核 CPU 下的补偿:affinity / load balance
2. 内存管理
- buddy 分配器
- slab/slub/slob 分配器
- vmalloc / kmalloc / page
- MMU 和页表 / TLB flush
3. 时钟和事件
- jiffies / hrtimer
- 调用延时:workqueue / tasklet / softirq
4. 日志 / printk
- printk 级别
- 日志环绕 buffer
- dev_info / dev_err / dev_dbg
四、设备模型和驱动配套机制
Linux 设备模型是重中之重,分为三个核心概念:
- device:硬件对应对象,在 sysfs 中有存在
- driver:是操作这些设备的程序
- bus:包括 platform / i2c / spi 等总线,托管配对
通过 match 机制,device 和 driver 配对,触发 probe 。
它是进入各类子系统的入口,核心原则是:
实现 driver 配套 bus,并通过设备树(设备树 + device_register) 实现 device 组织
五、子系统分类细解
【1】ALSA 声音子系统
- machine/codec/dai driver 分层
- dapm 电源经路管理
【2】regulator 子系统
- regulator_desc 描述
- supply 关系解析
- runtime PM 系统交互
【3】pinctrl / gpio
- pin 嵌套到 pad 、func 线路
- mux + bias 配置
- 设备树形式表达
【4】clock CCF 子系统
- clk_hw / clk_ops
- clk_get / clk_prepare_enable
- 无效时怎么调试
【5】power domain
- genpd 和 device 关系
- runtime_suspend 切换
六、内核调试和分析手段
类型 | 方法 | 描述 |
---|---|---|
日志 | printk / dev_info | 基础日志输出 |
进程 | ps / top / pidstat | 跟踪进程体 |
系统跟踪 | ftrace / trace_printk | 问题线程折线释放 |
sysfs | cat /sys/… | 观察设备状态 |
debugfs | cat /sys/kernel/debug/ | 内核状态清单 |
panic 分析 | call trace / 栈序解析 | oops 原因根据 |
结论:学习 Linux 内核,不能泛而不精,更需路线清晰
如果你是开发者,想要系统地综合 Linux 内核知识,请按照以下路线简止进行:
- 先看懂总体构成
- 重点看 startup / initcall / probe 调用连
- 选一个子系统(声音,电源,时钟)深挑一周
- 学会用日志和 trace 跟踪内核行为
每天一题面试题,参照内核模块进行代码调试,才是本义的学习。