nbcon 专题Linux v7.3 · 6.12.113

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。

nbcon 演进总览:5.10 → 7.3(颜色 = 演进阶段)
nbcon 演进总览:5.10 → 7.3(颜色 = 演进阶段)

为什么是 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

源码与行号约定

与站内其他章节的关系

章节

  1. 01 · 场景视图(+1):七个逼出 nbcon 的场景
  2. 02 · 逻辑视图:对象、优先级与所有权状态机
  3. 03 · 进程视图:上下文、线程与交接时序
  4. 04 · 开发视图:源码分层、模块边界与驱动契约
  5. 05 · 物理视图:落到 ARM64 硬件上
  6. 06 · E1 地基(5.10 → 6.6):先让「写日志」无锁,再拆小 console_lock
  7. 07 · E2 所有权模型(6.7):给每个控制台一个状态字
  8. 08 · E3 落地与 RT 进主线(6.11 被拒 → 6.12)
  9. 09 · E4 驱动转换(6.13 → 6.18):ARM64 串口第一次真正用上 nbcon
  10. 10 · E5 收敛(6.19 → 7.3):让打印节奏不再伤人