i2c-smbus
[TOC] drivers/i2c/i2c-core-smbus.c I2C/SMBus核心协议(I2C/SMBus Core Protocol) 实现SMBus事务处理历史与背景这项技术是为了解决什么特定问题而诞生的?drivers/i2c/i2c-core-smbus.c 文件实现了对**系统管理总线(System Management Bus, SMBus)**协议的支持。SMBus是基于I2C(Inter-Integrated Circuit)协议演变而来的一种子集或变体,专为系统和电源管理而设计。这项技术旨在解决以下问题: 标准化系统管理:为计算机系统中的各种低速设备(如电池、温度传感器、风扇控制器、电源管理芯片)提供一个标准的、低速、两线式的通信接口。 事务可靠性:SMBus在I2C的基础上增加了协议层面的可靠性检查,例如,大多数SMBus命令都包含**PEC(Packet Error Checking,数据包错误校验)**机制,以确保数据传输的完整性。 简化驱动开发:提供了一套预定义的、原子性的事务类型(如快速命令、读...
i2c-dev
[TOC] Linux i2c-dev 字符设备接口解析[drivers/i2c/i2c-dev.c] [I2C 用户态访问接口(/dev/i2c-X)] [把 I2C/SMBus 适配器以字符设备形式暴露给用户态,通过 read/write/ioctl 执行传输] 介绍i2c-dev.c 的核心作用是:为每个 I2C adapter 创建一个字符设备节点 /dev/i2c-N,让用户态可以不写内核驱动也能直接做 I2C/SMBus 访问。它通常被 i2c-tools(如 i2cdetect/i2cget/i2cset/i2ctransfer)等工具使用,也常用于板级 bring-up、调试、产测脚本、以及临时验证寄存器读写。 历史与背景诞生为了解决什么问题? 调试与快速验证:很多时候只想验证总线是否通、寄存器是否可读写,不希望立刻写完整内核驱动。 用户态工具生态:把“原始 I2C 事务”能力开放给用户态,便于通用工具工作。 重要迭代特征(从当前设计可推断的演进方向) 从“只支持简单 rea...
bcd
[toc] Linux 内核 BCD 转换工具解析[lib/bcd.c] [BCD 转换(bcd2bin/bin2bcd)] [提供 1 字节 BCD 与二进制数之间的高效互转实现,并导出为内核通用符号]介绍lib/bcd.c 只有两件事:实现并导出两个函数 _bcd2bin() 与 _bin2bcd()。它们通常通过 include/linux/bcd.h 里的宏 bcd2bin() / bin2bcd() 被驱动代码调用: 常量参数:走 const_* 宏,编译期直接折叠; 非编译期常量:走 _bcd2bin/_bin2bcd,运行期完成转换,同时尽量避免代价更高的除法/取模路径。 BCD(Binary-Coded Decimal,二进制编码十进制)就是:用 4 个二进制位表示 1 个十进制数字(0~9)。常见是把一个字节拆成两个“半字节”(nibble): 高 4 位:十位数字 低 4 位:个位数字 例子 十进制 45 十位是 4 → 二进制 0100 个位是 5 → 二进制 0101 合在一起:0x45(也就是 01...
seq_buf
[TOC] Linux 内核 seq_buf 实现解析(lib/seq_buf.c)[lib/seq_buf.c] [seq_buf:序列化缓冲区工具] [在固定大小缓冲区内安全地累积格式化输出,并支持“分段读出”给用户态]介绍seq_buf 可以理解为一个**“带状态的 snprintf 追加器”:你给它一个固定大小的 char buffer[],然后不断 printf/puts/putc 追加内容。它会维护当前写入位置、是否溢出等状态,保证不越界写**,并且常配套提供“按 readpos 分段把数据拷给用户态”的能力,常用于各种 debug 输出路径(尤其是实现 proc/debugfs/sysfs 的 show/read 辅助逻辑)。 历史与背景为了解决什么问题而诞生?内核里经常需要拼接字符串输出(调试信息、统计信息、状态信息): 只用 snprintf/scnprintf:每次都要手动管理“剩余长度、当前偏移”,代码重复且容易写错。 只用 seq_file:能力强但更重,必须走 start/next/...
bust_spinlocks
[toc] bust_spinlocks:在 oops/panic 等路径放宽“控制台/日志相关锁约束”,保证关键日志可达作用与实现原理 yes != 0:进入 oops/panic 类路径,递增 oops_in_progress,表示系统正处在异常打印阶段。 yes == 0:退出异常打印阶段,调用 console_unblank() 尝试唤醒/点亮控制台;递减 oops_in_progress,当其回到 0 时唤醒日志守护线程(传统实现中为 klogd 相关等待队列)。 该函数名中的 “bust spinlocks” 的含义是:异常阶段可能有锁/状态阻止日志输出,该函数通过提升 oops_in_progress 等全局状态让相关路径避免在锁上阻塞或放宽某些限制,从而提高“panic/oops 信息可达性”。 bust_spinlocks123456789101112131415161718/** * @brief 在 oops/panic 等异常路径中切换“允许输出关键日志”的模式。 * * @param...
panic
[toc] [kernel/panic.c] [内核 Panic/Oops 终止路径] [在不可恢复错误时完成“停止系统/通知/转储/重启”等收尾流程]介绍kernel/panic.c 主要实现内核在致命错误时的统一收尾路径: panic():不可继续运行时进入的终止流程(通常不返回)。 与 Oops/BUG/WARN 的策略联动:例如 “Oops 是否升级为 panic”、是否自动重启、是否触发 kdump 等。 提供 panic notifier、kmsg dump、停止其它 CPU、控制台输出解锁(bust spinlocks)等机制,尽量在系统已不稳定时仍完成关键动作。 历史与背景诞生解决的问题 内核遇到不可恢复错误时,继续运行可能导致数据破坏扩大;需要统一路径完成: 记录信息(console/printk、dumpers) 通知相关子系统(notifier) 尝试转储(kdump/kmsg_dump/pstore 等) 停止并发扰动(停其它 CPU...
Git实战指南:如何从另一个分支同步文件时完整保留Commit提交历史
@[toc] Git实战指南:如何从另一个分支同步文件时完整保留Commit提交历史本文将深入解析Git中两种截然不同的文件同步方式,重点解决一个核心问题:如何从另一个分支获取文件,同时不丢失原作者、提交时间和提交说明等历史记录。我们将对“仅复制文件内容”与“移植提交记录”进行对比,并详细拆解“手动修改触发Cherry-Pick”这一高阶技巧的底层逻辑。 1. 为什么普通复制会丢失历史记录?在Git中,最直观的同步方式是直接把文件“拿过来”。这种方式对应命令 git restore 或 git checkout。它的本质是将文件的当前状态复制到你的工作区,但不包含该文件之前的任何演变过程。 1.1 git restore/checkout 的工作原理当执行这两个命令时,Git仅仅是读取了源分支里该文件的内容(Blob数据),然后用这些内容覆盖你当前分支的文件。 结果:你得到了最新的文件代码。 代价:当你提交(commit)时,Git会把这当作是你刚刚创建的一次全新修改。原作者的名字、原来的提交时间、原来的Commit Message(提交说明)全部消失,变成了当前操作者的...
serio
drivers/input/serio.c 串行输入总线抽象(Serial Input Bus Abstraction) PS/2及传统输入端口的核心历史与背景这项技术是为了解决什么特定问题而诞生的?这项技术以及它所实现的serio(Serial I/O)子系统,是为了给Linux内核提供一个标准化的、与具体硬件控制器解耦的框架,来管理传统的、基于串行字节流的输入设备。它主要解决了以下问题: 抽象硬件接口:在PC体系结构中,键盘和PS/2鼠标都连接到一个称为i8042(或兼容的)键盘控制器上。这个控制器本身有其复杂的、通过I/O端口访问的底层接口。serio框架将这种底层的、特定于控制器的交互,抽象成一个简单的、通用的串行字节流接口。 分离总线与设备驱动:serio扮演了一个“总线”的角色。它将硬件控制器(如i8042)的驱动与连接在该控制器上的具体设备(如PS/2鼠标、AT键盘)的驱动分离开来。这使得鼠标驱动(psmouse.c)无需关心它是在和一个真实的i8042芯片通信,还是在和一个虚拟化环境模拟的控...
Ubuntu 虚拟机根文件系统损坏故障的深度分析与修复
@[toc] Ubuntu 虚拟机根文件系统损坏故障的深度分析与修复 1. 问题背景与故障现象本次故障发生于一台运行 Ubuntu 的虚拟机。异常关机后,系统在下次启动过程中无法正常完成根文件系统挂载,进入 initramfs 维护环境并要求手动执行文件系统一致性修复。 12345flowchart TB A[异常关闭虚拟机电源] --> B(下次启动时进行文件系统检查) B --> C{检测到根文件系统错误} C --> |是| D[挂载根分区失败,进入initramfs环境] D --> E[管理员执行fsck修复] 1.1 initramfs 进入条件与报错定位系统在启动早期阶段输出以下错误信息,表明根分区 /dev/sda5 需要人工修复: 1234/dev/sda5 contains a file system with errors, check forced.Directory inode ... directory corruptedUNEXPECTED INCONSISTENCY; RUN...
sys_info
lib/sys_info.c:sys_info 调试掩码 sysctl 子系统概览介绍lib/sys_info.c 为 sys_info() 调试输出提供配置接口与执行路径:sys_info_sysctl_init() 在子系统初始化阶段注册 kernel_sys_info sysctl 项,由 sysctl_sys_info_handler() 统一处理读写,内部通过位掩码选择任务、内存、定时器、锁、ftrace、全 CPU 回溯等信息的收集范围。 历史与背景 诞生动机:为内核调试路径提供可配置的统一入口,通过位掩码决定 sys_info() 触发时的输出范围。 迭代里程碑:引入 sysctl 处理器与早期 initcall 注册,确保调试接口在大多数驱动加载前即可使用。 社区与应用:常用于现场调试或自动化诊断脚本,结合 SysRq/延迟工作触发,以收集当前系统状态。 核心原理与设计 sysctl 表注册:sys_info_sysctls 定义 kernel_sys_info 项,绑定到全局位掩码 kernel_si_mask,读写均由 sysctl_sy...







