nbcon 专题
printk nbcon 控制台的 4+1 视图与 5.10 → 7.3 演进 · 与 PREEMPT_RT 的关系 · 聚焦 ARM64
v7.3主线基准6.12.113LTS 对照10篇文档20张架构图
nbcon 专题:用 4+1 视图看 printk 的重构与 RT
结论先行:nbcon(No-BKL console)把「谁在往控制台写、什么优先级、能不能被打断」从一把含糊的全局 console_lock 里拆出来,变成每个控制台一个 32 位原子状态字。普通 printk 只写无锁 ringbuffer,再交给每控制台一个打印线程;WARN/oops/panic 则以更高优先级在调用者上下文原子输出,必要时让线程交出所有权。这套设计在 6.12 合入后,arm64/x86/riscv 才被允许打开 PREEMPT_RT:提交 d8fccd9ca5f9 写的是 "With the recent printk changes, the last known road block has been addressed"。到 7.3,ARM64 上常见的 pl011、8250、i.MX、Qualcomm GENI、Tegra264 UTC 都已是 nbcon 驱动;Samsung、Meson、MSM、Tegra TCU 仍是 legacy。
为什么是 4+1
nbcon 同时牵涉数据结构、并发时序、源码分层与具体硬件四个层面,任何一个视角单独看都会漏掉关键约束。所以本系列用 Kruchten 的 4+1 视图组织:
| 视图 | 回答的问题 | 本系列章节 |
|---|---|---|
| +1 场景视图 | 哪些场景逼出了这套设计?每个场景今天怎么走? | 01 场景视图 |
| 逻辑视图 | 有哪些对象、状态和优先级?所有权怎么流转? | 02 逻辑视图 |
| 进程视图 | 哪些上下文、线程在并发?交接时序是什么? | 03 进程视图 |
| 开发视图 | 代码分几层、在哪些文件?驱动要实现什么契约? | 04 开发视图 |
| 物理视图 | 落到 ARM64 的 CPU、GIC、UART、时钟上要注意什么?各版本的驱动现状如何? | 05 物理视图 |
视图章节描述的是 v7.3 主线的状态,并标注它与本站基准 6.12.113 的差异。演进章节按时间拆成五个阶段,每一阶段的结构固定为:要解决的问题 → 方案 → 开发视图(文件 / 函数 / 提交)→ 架构图(之前 / 之后)→ 调用栈 → 4+1 增量。
| 阶段 | 版本 | 一句话 | 章节 |
|---|---|---|---|
| E1 地基 | 5.10 → 6.6 | 先把「写日志」变成无锁,把控制台链表从 console_lock 里拆出;5.19 线程化尝试被回退 | 06 |
| E2 所有权模型 | 6.7 | 每控制台一个原子状态字、三级优先级、direct / handover / hostile 三种获取 | 07 |
| E3 落地与 RT 进主线 | 6.11 → 6.12 | 6.11 被拒;6.12 合入选路分派、打印线程、emergency、panic 次序,RT 随即进主线 | 08 |
| E4 驱动转换 | 6.13 → 6.18 | imx、pl011、tegra-utc 转换;8250 首次转换被回退;首批修补 | 09 |
| E5 收敛 | 6.19 → 7.3 | 解决撕碎输出、hard lockup、慢启动、Tegra 挂死;8250 / qcom-geni 转换;pl011 时钟修复 | 10 |
源码与行号约定
- 主线源码取自本仓库
linux/的master分支(v7.3,c03c1a14507d),用git show master:<path>只读访问。工作区仍是linux-6.12.y(6.12.113),站内其他章节的行号都以它为准。 - 行号不带前缀时指 v7.3;带版本前缀的(如
v6.6 printk.c:2864、6.12.113 nbcon.c:1698)指对应版本。5.9、5.19-rc1、6.2 的源码取自对应 tag。 - 提交号均为主线 12 位短哈希,「何时合入」用
git describe --contains核对。 - 「解决了什么问题」优先引用提交说明原文,不做推测。
与站内其他章节的关系
- 性能分析 09 · printk 讲的是 6.12 RT 内核上 printk 的延迟代价与调优;本专题讲的是设计与演进,两者互补。
- 性能分析 13 · housekeeping 与 参数深解 01 说明了
pr/*打印线程应该放到哪些 CPU 上。 - 性能分析 14 中的 Orin/Thor 配置,与本专题物理视图里的 Tegra TCU / UTC 现状对应。
章节
- 01 · 场景视图(+1):七个逼出 nbcon 的场景
- 02 · 逻辑视图:对象、优先级与所有权状态机
- 03 · 进程视图:上下文、线程与交接时序
- 04 · 开发视图:源码分层、模块边界与驱动契约
- 05 · 物理视图:落到 ARM64 硬件上
- 06 · E1 地基(5.10 → 6.6):先让「写日志」无锁,再拆小 console_lock
- 07 · E2 所有权模型(6.7):给每个控制台一个状态字
- 08 · E3 落地与 RT 进主线(6.11 被拒 → 6.12)
- 09 · E4 驱动转换(6.13 → 6.18):ARM64 串口第一次真正用上 nbcon
- 10 · E5 收敛(6.19 → 7.3):让打印节奏不再伤人