启动与初始化
系统上电后,内核如何一步步把自己搭起来,并拉起各大子系统。
进入专题这是一套面向初学者的 Linux 内核中文学习站。你可以先从这里建立整体地图,再按专题页逐步展开学习;不需要先读源码,也不需要先翻内核自带文档。
这页是整套内容的首页,负责先铺开 Linux 内核的大模块、学习顺序和专题入口。第一次来到这里时,直接从 `index.html` 开始就可以。
如果你想系统读,建议先从“启动与初始化”开始,再顺着每个专题页里的“下一主题”往后走;如果你只想补某一块,也可以直接从专题入口跳转。
整站都放在同一个目录里,页面之间使用相对链接,适合直接打包分享、放进 GitHub 仓库,或者挂到 GitHub Pages 这类静态托管环境。
先把这里当成 Linux 内核的中文地图站:先知道模块职责、边界和关系,再带着问题进入源码、官方文档或更细的专题资料。这样更不容易一开始就陷进局部细节。
Linux 内核不是单一模块,而是一整套系统管理能力:CPU、内存、文件、网络、设备、安全和隔离都归它管。你以后看到的每个子系统,都是它这个“大管家”中的一部分。
先知道每块负责什么、不负责什么,比一开始理解实现细节更重要。这样后续你就不会把文件系统、块层、驱动、设备模型、总线这些概念混在一起。
内核学习最关键的是关系感:调度和线程是什么关系,内存和文件系统为什么互相牵连,容器和虚拟化又为什么不是一回事。
| 层次 | 它负责什么 | 代表模块 | 你现在怎么理解 |
|---|---|---|---|
| 用户空间边界 | 程序如何向内核请求服务 | 系统调用、文件接口、socket、ioctl、procfs、sysfs | 应用不是直接碰硬件,而是先通过这层边界把请求交给内核。 |
| 公共底座 | 所有模块都会依赖的通用能力 | Core API、调度、内存、锁/RCU、中断、定时器 | 这是“地基层”。不理解这一层,后面看任何大模块都会感觉逻辑漂着。 |
| 系统能力层 | 对上给程序提供功能,对下组织资源 | 文件系统、块层、网络、设备模型 | 这是用户最常感受到的系统能力:读文件、发网络、访问设备都在这里成形。 |
| 硬件接入层 | 把具体硬件纳入系统统一管理 | 驱动、总线、ACPI、DeviceTree、外设子系统 | 这是“让硬件真正工作起来”的层,但它也要服从前面的公共规则。 |
| 扩展与治理 | 系统安全、观测、隔离与现代扩展能力 | 安全、虚拟化、容器、eBPF、跟踪与测试 | 这些建立在前面几层的基础之上,更像“把内核拿去支撑复杂世界”的能力。 |
系统上电后,内核如何一步步把自己搭起来,并拉起各大子系统。
进入专题对象模型、引用计数、工作队列、通用容器等公共工具箱。
进入专题进程和线程如何争用 CPU,系统怎么决定“谁先运行、谁先等待”。
进入专题物理内存、虚拟内存、页缓存、回收、OOM 背后的总管家。
进入专题锁、RCU、中断、定时器,解释为什么内核必须认真处理并发正确性。
进入专题VFS、具体文件系统、块层和磁盘 I/O 的分工与关系。
进入专题从收包到协议处理,再到把数据交给应用的完整视角。
进入专题设备、总线、驱动如何被统一组织,硬件如何成为系统能力的一部分。
进入专题系统如何响应外部事件、如何按时间推进任务。
进入专题应用如何正式向内核请求服务,为什么用户空间和内核空间之间必须有清晰边界。
进入专题容器背后依赖的是 Linux 提供的隔离与资源治理能力。
进入专题日志、tracepoint、perf、ftrace、eBPF 帮你看清系统运行时发生了什么。
进入专题内核如何被裁剪、编译和装配,以及哪些能力内建、哪些按需加载。
进入专题谁能做什么、哪些边界必须守住,这些规则如何嵌入内核本身。
进入专题Linux 如何支撑虚拟机,为什么它和容器是不同的系统组织思路。
进入专题为什么内核不是“能跑就行”,而必须在复杂环境下保持可信与稳定。
进入专题把“进程/线程”从抽象词汇拆成内核真正关心的执行实体和共享关系。
进入专题更细地理解文件名、目录项、inode、打开文件实例为什么不是一回事。
进入专题把文件请求怎样变成真正设备请求的中间路径单独拆出来理解。
进入专题把应用看到的 socket 和实际网络包长路径接到一起看。
进入专题把虚拟地址、物理页和进程地址空间之间的映射关系单独拆开理解。
进入专题把“缓存占用”和“内存紧张”放到同一张图里,理解卡顿与回收路径。
进入专题把设备如何被找到、登记并和正确驱动配对这条接入路径拆开看。
进入专题理解设备地址视角、CPU 地址视角和高吞吐数据路径为什么不能混为一谈。
进入专题理解中断后续工作为什么常被分层延后,而不是都在最前线做完。
进入专题把后台待办、进程上下文和系统异步执行能力单独拆开理解。
进入专题理解模块如何进入系统、持续存在,以及为什么退出往往更难。
进入专题把阻塞等待、任务睡眠和条件满足后的唤醒关系单独拆开理解。
进入专题理解未来时刻触发、超时边界和延迟工作为什么是系统正式能力。
进入专题把驱动接管、失败回滚和退出清理这条生命周期路径单独拆开看。
进入专题理解高并发服务为什么要把大量等待对象交给内核统一组织。
进入专题把对象存活关系、异步持有和最终释放时机单独拆开理解。
进入专题理解设备如何安全睡下、恢复,以及为什么功耗管理也是生命周期问题。
进入专题理解驱动接手设备之前,系统怎样先知道硬件拓扑、资源和依赖。
进入专题把内核对象、系统状态和调试入口为什么常以文件树形式暴露拆开看。
进入专题理解复杂配置、管理和协商动作为什么需要专门边界接口。
进入专题理解为什么有些共享数据路径不想每次读都上重锁,而要把回收时机延后组织。
进入专题把高频小对象分配、缓存复用和分配上下文限制单独拆开看。
进入专题理解 SoC 和板级设备怎样被正式纳入驱动框架,而不是靠私有路径硬接。
进入专题理解内核对象为什么既能挂进 sysfs,又能在变化时把事件送到用户空间。
进入专题把 CPU、内存节点和数据距离为什么会直接影响性能单独拆开看。
进入专题理解“等某事完成”和“限制同时进入人数”为何不是普通互斥锁能自然表达的问题。
进入专题把访问地址为什么有时会变成“正常补页”、有时又会变成进程错误结果单独拆开看。
进入专题理解进程为什么会被异步提醒、打断、暂停、继续或因异常收到正式通知。
进入专题理解用户态线程同步为什么会在无争用时留在用户态、在争用时再进入内核组织等待。
进入专题把上层块访问意图为什么要先组织成中间工作单元,再继续往设备方向推进单独拆开看。
进入专题理解现代块层为什么要重组并发队列模型,而不再让所有 I/O 都挤一个入口。
进入专题理解缓存里的修改怎样被系统按节奏推回存储,以及这为什么会直接影响卡顿体感。
进入专题理解一颗 CPU 退出或重新进入在线集合时,系统为什么要先迁走任务、中断和定时角色。
进入专题理解 CPU 在线工作时为什么要持续平衡性能、功耗和温度,而不是永远固定一个频率。
进入专题理解 CPU 暂时没活时为什么不是简单待机,而要选择合适的空闲深度来平衡省电和唤醒延迟。
进入专题把大量普通超时任务为什么适合按时间分桶批量组织,而不是逐个用重型精细计时方式硬管拆开看。
进入专题理解某些时间需求为什么更在乎触发精度和确定性,而不能只满足“大概到点”。
进入专题把内核内部一个事件发生后怎样按注册关系通知多个模块这条广播路径单独拆开看。
进入专题理解当前执行为什么不一定能一直跑下去,以及系统在什么边界上允许把 CPU 切给别的执行。
进入专题把高频状态为什么常按 CPU 各自保存一份,以减少全局争用和缓存抖动拆开看。
进入专题理解内核为什么需要自己长期存在的后台执行者,而不是把所有工作都塞进一次性回调。
进入专题把不能睡眠的短临界区为什么常用忙等方式保护,而不是把等待者全挂起拆开看。
进入专题理解较长共享路径为什么更适合让等待者睡下,由调度器正式组织互斥等待。
进入专题把读多写少对象为什么常允许多个读者并行、但仍要求写者独占修改窗口拆开看。
进入专题理解某个最小共享状态更新为什么必须整体发生,而不能让别人看见中间态。
进入专题把并发世界里“操作做了”和“别人按什么顺序看见了”为什么不是同一回事拆开看。
进入专题理解读者先快读、撞上写者就认错重来,这种轻量快照同步为什么适合读多写少场景。
进入专题把“只有旧值还没变时才允许替换新值”这种条件式原子更新,以及失败后重试的写法拆开看。
进入专题理解对象持有关系为什么不是普通计数问题,而是和 UAF 边界紧密相关的安全协议。
进入专题把锁顺序、上下文合法性和潜在死锁为什么能在运行时被提前发现拆开看。
进入专题理解对象为什么常直接带着挂链节点,以便被组织进队列、桶和各种运行时关系里。
进入专题把对象如何按地址、时间或编号这类键有序组织起来,以支持稳定查找和邻近关系拆开看。
进入专题理解大而稀疏的整数索引空间为什么需要专门结构来组织对象,而不是硬开巨大数组。
进入专题把底层物理页块怎样按阶数拆分、合并和供应给上层分配路径单独拆开看。
进入专题理解为什么有些需求只在乎虚拟地址连续,而不必硬拿物理连续页块。
进入专题把设备侧连续物理内存需求为什么要提前规划和保路单独拆开看。
进入专题| 模块 A | 模块 B | 为什么它们总被一起提到 |
|---|---|---|
| 调度器 | 并发控制 | 任务什么时候切换、在哪里等待,会直接影响锁的持有和竞争。 |
| 内存管理 | 文件系统 | 页缓存把文件 I/O 和内存回收绑在了一起,所以很多文件读写问题本质上也是内存问题。 |
| Core API | 驱动框架 | 设备对象、引用计数、异步工作和日志,很多都不是驱动自己发明的,而是复用公共底座。 |
| 网络 | 调度 / 内存 | 网络路径要处理队列、缓冲、上下文切换和并发,性能问题常常跨多个底座模块。 |
| 启动 | 所有模块 | 启动阶段要先搭好最基本环境,后面的模块才能被一个个拉起并进入正常运行状态。 |
| 中断 | 驱动 / 网络 / 存储 | 很多硬件事件都通过中断通知内核,所以它几乎是设备路径的共同触发点。 |
| 系统调用边界 | 文件 / 进程 / 网络 | 很多上层请求都会在边界处正式进入内核,再被分发到不同子系统。 |
| 容器治理 | 调度 / 内存 / 网络 / 文件系统 | 容器并不是单独一块,而是把多个内核能力重新组合和约束。 |
| 观测 | 所有模块 | 很多性能和故障问题要靠跟踪和观测把多个模块的症状串成完整路径。 |
| 构建系统 | 驱动 / 测试 / 安全 | 配置和装配方式会直接影响系统里有哪些能力、哪些防护和哪些调试设施可用。 |
| 虚拟化 | 容器 / 安全 / 设备 | 它和容器同属隔离主题,但思路不同,同时又依赖更强的资源、边界和设备抽象。 |
| VFS | 块层 | 前者组织统一文件语义,后者组织真正设备 I/O,它们把“读文件”一路拆成多层路径。 |