gpiolib
[toc] drivers/gpio/gpiolib.cgpiochip_setup_dev: 为单个GPIO控制器完成设备和接口的注册此函数的核心职责是接收一个代表GPIO控制器(如STM32的GPIOA)的内核对象gdev,并完成以下三件关键事情: 初始化设备对象: 确保gdev中的struct device成员被正确初始化。 创建字符设备: 在/dev目录下创建对应的gpiochipN字符设备节点,使用户空间程序可以通过文件I/O操作来访问GPIO。 创建sysfs接口: 在/sys/class/gpio目录下创建对应的gpiochipN目录和属性文件,提供一种基于文件的、用于管理和调试GPIO的接口。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687/* ...
simple-pm-bus
[toc] drivers/bus/simple-pm-bus.c 简单电源管理总线(Simple PM Bus) 通用的、轻量级的设备电源管理协调器历史与背景这项技术是为了解决什么特定问题而诞生的?simple-pm-bus 的诞生是为了解决在复杂的片上系统(SoC)中一个常见的、但缺乏标准化解决方案的问题:如何以一种通用、有序的方式管理一组相互关联的、但又不属于任何标准总线(如I2C, SPI)的设备的电源状态(主要是休眠与唤醒)。 在许多SoC设计中,存在大量简单的、直接挂在内存映射I/O(MMIO)上的设备。这些设备可能在逻辑上属于一个功能单元(例如,一个视频处理流水线上的多个IP核),它们需要按照特定的顺序进入休眠(suspend)或从中恢复(resume)。 在simple-pm-bus出现之前,处理这种情况通常依赖于: 平台代码中的硬编码:在板级支持文件(board file)中硬编码休眠/唤醒的调用顺序,这使得代码难以移植和维护。 驱动间的隐式依赖:驱动程序之间通过msleep等脆弱的方式来猜测和等待其他设备的状态。...
sysrq
[toc] drivers/tty/sysrq.c 内核魔法键(Magic SysRq Key) 系统的终极应急与调试工具历史与背景这项技术是为了解决什么特定问题而诞生的?Magic SysRq Key(魔法系统请求键)是为了解决一个系统管理员和内核开发者面临的终极难题:当系统完全冻结,无法通过网络(SSH)或本地终端响应时,如何进行诊断或安全地重启? 在系统严重死锁或负载极高的情况下,用户空间的程序、Shell、甚至内核的调度器都可能停止工作。然而,内核的底层部分,如键盘中断处理,可能仍然在运行。SysRq机制就是利用这个“一线生机”,提供了一个直接与内核底层进行通信的“后门”。它允许操作员通过一个特殊的键盘组合键,绕过所有上层软件栈,直接向内核发送预定义的命令,从而: 获取调试信息:在系统崩溃的瞬间,抓取任务状态、内存使用情况等快照。 执行应急操作:如同步磁盘、以只读方式重新挂载文件系统。 安全地重启系统:在别无选择时,执行一个比直接按电源键(硬重启)更安全的重启序列,最大限度地减少数据损坏的风险。 它的发展经历了哪些重要的里程碑或版本迭代? 源自...
sys
[toc] kernel/sys.c 系统信息与控制接口(System Information and Control) 内核的通用系统调用集合历史与背景这项技术是为了解决什么特定问题而诞生的?kernel/sys.c 是Linux内核中历史最悠久、最基础的文件之一。它不是为了解决某一个单一、特定的技术问题而生,而是扮演着一个内核“工具箱”的角色。它实现了一大批杂项但至关重要的系统调用,这些系统调用为用户空间提供了一个与内核进行全局性、管理性和信息性交互的标准化接口。 这些系统调用解决的问题包括: 获取系统状态:如何让 top, free, uptime 等工具知道系统的负载、内存使用情况和运行时间?(sysinfo) 识别系统身份:程序如何知道自己运行在哪个操作系统版本、哪个硬件架构上?(uname) 控制系统生命周期:管理员如何安全地重启或关闭计算机?(reboot) 配置系统标识:系统启动时如何设置自己的主机名?(sethostname) 调整进程行为和资源:如何设置进程的调度优先级 (setpriority) 或资源限制 (setrlimit)? 细粒度...
bfq-iosched
[toc] block/bfq-iosched.c BFQ I/O调度器(Budget Fair Queueing) 追求极致公平与交互响应的重量级调度器历史与背景这项技术是为了解决什么特定问题而诞生的?BFQ(Budget Fair Queueing)I/O调度器的诞生是为了解决一个长期困扰Linux用户,尤其是桌面用户的核心问题:I/O密集型任务对系统交互响应能力的严重破坏。 在BFQ出现之前,当一个后台进程(如大型文件复制、软件更新、文件索引)开始疯狂读写磁盘时,用户会明显感觉到整个系统变得卡顿:启动应用程序变慢、窗口响应迟钝、甚至鼠标指针都会跳动。这是因为后台任务产生的海量I/O请求“淹没”了存储设备,导致前台交互式应用(如浏览器、文本编辑器)的关键读写请求必须排很长的队。 BFQ的核心目标就是实现进程间的I/O公平性,并优先保障交互式应用的低延迟。它不仅仅是调度I/O请求,更是在管理不同进程对I/O带宽的访问权,确保没有任何一个进程可以霸占整个存储设备。 它的发展经历了哪些重要的里程碑...
kyber-iosched
[toc] block/kyber-iosched.c Kyber I/O调度器 基于延迟目标的现代I/O调度器历史与背景这项技术是为了解决什么特定问题而诞生的?Kyber I/O调度器的诞生是为了解决一个在超高速存储设备(如NVMe SSD)上日益凸显的问题:传统的I/O调度器(如Deadline, CFQ)主要优化吞吐量或公平性,但在现代硬件上,软件排队本身成为了延迟的主要来源。 当存储设备快到可以在微秒级完成I/O时,如果内核软件栈中排队了过多的请求(即高队列深度),那么一个新到来的、关键的读请求可能会排在几百个已提交的请求之后,导致其总延迟变得很高。Kyber的设计目标是转变优化思路:不再间接地追求低延迟,而是直接将延迟作为一个可配置的、必须达成的目标。 它旨在回答这样一个问题:我们如何向设备施加恰到好处的压力,既能获得足够的吞吐量,又能确保绝大多数请求的完成延迟都低于一个预设的目标值? 它的发展经历了哪些重要的里程碑或版本迭代? Facebook (Meta) 的创新:Kyber最初由Facebook的工...
elevator
[toc] block/elevator.c I/O调度器框架(I/O Scheduler Framework) 可插拔I/O调度的通用层历史与背景这项技术是为了解决什么特定问题而诞生的?block/elevator.c 的诞生是为了解决一个核心的性能问题,并提供一个灵活的解决方案。问题在于:如何高效地组织对机械硬盘(HDD)的I/O请求。 机械硬盘的性能瓶颈在于物理移动:磁头寻道(seek)和盘片旋转(rotation)。无序地处理随机I/O请求会导致磁头在盘片上疯狂来回移动,造成极大的性能浪费。elevator.c 实现的“电梯”(Elevator)框架,其核心目标是: I/O请求排序:像电梯服务楼层一样,先朝一个方向(例如,逻辑块地址LBA递增)处理所有请求,到达末端后再反向,从而将多次随机寻道变为一次或几次大的顺序扫描,最大化吞吐量。 请求合并:将对相邻磁盘区域的小请求合并成一个大请求,减少I/O操作的总次数。 提供可插拔框架:认识到没有一种调度算法能适应所有工作负载(例如,数据库 v...
mq-deadline
[toc] block/mq-deadline.c 多队列截止时间调度器(Multi-Queue Deadline I/O Scheduler) 兼顾吞吐量与延迟的经典算法历史与背景这项技术是为了解决什么特定问题而诞生的?截止时间(Deadline)I/O调度器的诞生是为了解决一个根本性的矛盾:最大化I/O吞吐量与保证请求的公平性和低延迟之间的冲突。 最大化吞吐量:对于机械硬盘(HDD),最高效的方式是处理物理上连续的请求,以最小化昂贵的磁头寻道时间。这意味着应该对请求进行排序和批处理。 保证公平性与低延迟:如果系统只顾着处理连续的大块写操作,那么一个关键的小块读操作(例如,应用程序等待此数据才能继续运行)可能会被“饿死”(starve),等待很长时间才能被服务,导致应用卡顿。 Deadline调度器通过一个优雅的设计来解决这个矛盾:它在默认情况下会合并和排序请求以优化吞吐量,但同时为每个请求设置一个**“截止时间”。如果一个请求在这个时间窗口内没有被服务,它就会被赋予高优先级,强制调度器去处理它,从而防止饥饿并保证了一个可预测的...
blk-core
[toc] block/blk-core.c 块层核心(Block Layer Core) I/O请求的派发与管理中心历史与背景这项技术是为了解决什么特定问题而诞生的?block/blk-core.c 是Linux块层(Block Layer)的绝对核心。它的诞生是为了解决一个根本性的架构问题:如何在种类繁多的上层I/O请求者(文件系统、裸设备访问、交换等)和五花八门的下层块设备驱动(SATA, SCSI, NVMe等)之间建立一个高效、通用、可扩展的中间层。 这个中间层的核心任务包括: 请求抽象与标准化:将来自不同源头的I/O请求(在现代内核中,这些请求被封装在 struct bio 中)转换成一个标准的、可供调度和处理的单元(struct request)。 请求排队与派发 (Queuing & Dispatch):为每个块设备维护一个请求队列(struct request_queue),管理等待处理的I/O请求。 I/O调度 (I/O Scheduling):在将请求发送给硬件之前,通过可...
fops
[TOC] block/fops.c 块设备文件操作(Block Device File Operations) 用户空间直接访问块设备的桥梁历史与背景这项技术是为了解决什么特定问题而诞生的?block/fops.c 的存在是为了实现UNIX哲学的核心思想之一:“一切皆文件”。它专门为了解决一个根本性需求:为用户空间提供一个标准的、基于文件接口的、直接与块设备(如硬盘、SSD)进行底层交互的方式。 在文件系统被创建和挂载之前,操作系统需要一种方法来对原始的块设备本身进行操作。block/fops.c 实现了这个接口,使得以下基础任务成为可能: 分区(Partitioning):工具如 fdisk, parted 需要能够读取和写入磁盘的第一个扇区来管理分区表。 文件系统创建(Formatting):工具如 mkfs.ext4 需要能够直接向一个分区写入文件系统的元数据(超级块、inode表等)。 裸数据传输(Raw Data Transfer):工具如 dd 需要能够进行块级别的、不经过文件系统解释的磁盘克隆或镜像创建。 底层硬件控制(Hardware Cont...








