基础铺垫知识 —— CPU 控制存储器
CPU 如何控制 UFS ?从硬件层,到软件层一一讲解,去理解它。 一文理解 UFS。 UFS (Universal Flash Storage) 是专为移动设备(如智能手机、平板电脑)设计的高性能持久化存储系统。在功能上,它与 PC 上的硬盘 (HDD) 或固态硬盘 (SSD) 类似:为操作系统和用户数据提供一个非易失性(断电不丢失)的存储空间。
这是基础知识铺垫,系列文章。为以后《从零实现,手机操作系统》,做必要的理论支撑。
本篇我们讲 “CPU 如何控制 UFS,即控制硬盘”的理论知识。

1. 引言
1.1 UFS 是什么?
UFS (Universal Flash Storage) 是专为移动设备(如智能手机、平板电脑)设计的高性能持久化存储系统。在功能上,它与 PC 上的硬盘 (HDD) 或固态硬盘 (SSD) 类似:为操作系统和用户数据提供一个非易失性(断电不丢失)的存储空间。
1.2 核心问题是什么?
在任何现代计算机系统中,都存在一个根本性的性能矛盾:CPU 的速度与持久化存储设备的速度之间存在着巨大的鸿沟。 CPU 每秒可以执行数十亿次操作,而一次存储访问可能需要数万甚至数百万个 CPU 周期。如果 CPU 在读写数据时采取“同步等待”的模式,那么整个系统的性能将被慢速的存储设备严重拖累,CPU 的强大算力将被极大浪费。
1.3 解决方案是什么?
为了解决这个核心矛盾,UFS 体系结构采用了一套精巧的、基于行业标准的解决方案,其哲学核心是 “异步委托与硬件卸载”:
-
异步委托:CPU 不再亲自等待 I/O 操作完成。它像一位总指挥,将任务细节(“读/写什么,放到哪里”)准备好,然后“委托”给专业的下属,之后便立即去处理其他任务。
-
硬件卸载 (Hardware Offloading):这个“专业的下属”就是 UFS 主机控制器 (UFS Host Controller)。它是一个专用的硬件引擎,负责接管所有繁重的 I/O 工作,包括协议封装、物理通信和最关键的 DMA (Direct Memory Access) 数据传输。
-
标准化 (Standardization):为了保证不同厂商的 CPU (SoC) 和 UFS 芯片能够协同工作,JEDEC 行业协会制定了一系列公开标准。这些标准定义了软硬件之间的交互语言和规则,使得驱动开发有据可依。
作为 OS 开发者,我们的任务就是理解并利用这套标准化的解决方案,编写出能够高效“指挥”UFS 主机控制器的驱动程序,即控制存储器。
2. 核心参与者
UFS 系统由四个分工明确、环环相扣的功能实体构成,共同实现了上述解决方案。
2.1 内核驱动
-
角色: 战略制定者和任务发起者。
-
运行位置: 主 CPU,内核态 (EL1)。
-
职责:
-
构建命令 (制定战略):遵循 JEDEC UFS Host Controller Interface (UHC) 规范,在主内存中构建一系列标准化的数据结构(如
UTRD,PRDT),用于精确描述 I/O 任务。 -
硬件交互与适配:通过 MMIO (Memory-Mapped I/O) 与 UFS 主机控制器通信。在初始化时,识别硬件并应用必要的厂商特定配置 (Quirks),以确保最佳兼容性。
-
提交任务 (下达委托):通过向 UHC 规范定义的“门铃寄存器” (Doorbell Register) 写入值,来通知硬件(UFS主机端控制器)有新任务。
-
处理结果 (评估战果):编写中断服务程序 (ISR),响应来自硬件的中断,获取任务完成状态并进行善后处理。
-
2.2 UFS 主机端控制器
-
角色:任务执行的代理和硬件加速器,是“硬件卸载”理念的物理体现。它是一个遵循 JEDEC 规范的硬件状态机(组合逻辑电路)。
-
运行位置: 集成在 SoC 内部。
-
职责:
-
自主执行:被“门铃”唤醒后,通过其内置的 DMA 引擎自主地从主内存获取并解析命令。
-
协议处理:管理命令队列,并将高级命令封装成 UFS 核心协议的协议信息单元 (UPIU)。
-
物理通信:通过 M-PHY 物理层(一种总线)与外部 UFS 设备通信。
-
数据传输核心:执行 DMA 数据传输,在主内存和 UFS 设备之间直接搬运数据,将 CPU 从这项繁重工作中彻底解放。
-
状态回报:任务完成后,通过硬件中断向 CPU 报告。
-
2.3 UFS 设备端控制器
-
角色:存储介质的直接管理者与抽象层。它不仅仅是一块电路,而是一个真正意义上的嵌入式计算系统。
-
运行位置:封装在独立的 UFS 存储芯片内部,是该芯片的“大脑”。
-
职责:
-
隐藏复杂性:它的核心任务是向主机(控制端CPU)隐藏 NAND 闪存介质所有天生的物理缺陷和复杂的管理细节。NAND 闪存有写寿命有限、必须先擦后写、存在坏块等物理缺陷。设备控制器的存在,就是为了处理这些硬件缺陷。
-
响应标准:接收并执行来自主机的标准 SCSI 命令。它的外部行为严格遵守 JEDEC 协议,但内部实现则是厂商的核心机密。
-
-
内部探秘:一个为闪存而生的“专用操作系统”
-
为了完成上述艰巨的职责,UFS 设备控制器内部包含了一颗专用的嵌入式处理器(如 ARM Cortex-R 实时核心)和运行其上的智能固件。我们可以做一个精妙的类比:这个固件,就相当于这个嵌入式处理器的“专用操作系统”,我们称之为 FTL (Flash Translation Layer)。
-
| 对比维度 | 通用操作系统 (如 Linux) | FTL 固件 (“专用 OS”) |
| 管理的核心资源 | 内存、进程、文件、通用外设 | NAND 闪存阵列、内部 RAM、错误校正(ECC)硬件 |
| 核心使命 | 提供一个通用的计算环境 | 提供一个稳定、可靠、高性能的块存储接口 |
| 核心功能 | 进程调度、虚拟内存、文件系统等 | 磨损均衡、垃圾回收、坏块管理、逻辑到物理地址翻译 |
| 服务方式 | 通过系统调用 (System Calls) | 通过响应 UFS/SCSI 命令 |
| 透明性 | 向应用隐藏物理硬件细节 | 向主机 OS 完全隐藏 NAND 的所有物理特性 |
-
这个为闪存而生的“操作系统”(FTL),其存在的唯一目的,就是解决 NAND 的物理限制,从而实现速度与寿命的长存:
-
磨损均衡 (Wear Leveling):通过智能地调度写入位置,确保所有存储单元被均匀使用,从而解决了“写寿命有限”的问题,极大地延长了设备寿命。
-
垃圾回收 (Garbage Collection):通过在后台整理数据、回收无效空间,避免了 NAND “先擦后写”特性带来的巨大性能开销(写入放大),保证了写入“速度”。
-
坏块管理 (Bad Block Management):自动识别并屏蔽损坏的物理单元,提供给上层一个完美无瑕的存储空间。
-
-
因此,UFS 设备控制器之所以如此智能和复杂,正是因为它运行着这样一个“完美的软件”,将一个有缺陷的物理介质,成功地伪装成了一个简单、可靠、高性能的理想存储设备。
2.4 NAND 闪存阵列颗粒
-
角色: 最终的数据存储介质。
-
运行位置: 封装在 UFS 存储芯片内部。
-
职责: 物理上存储比特数据。
-
物理特性——性能鸿沟的根源:
-
工作原理: 它通过在“浮栅晶体管”中囚禁或释放电子来存储数据,这是一个相对缓慢的物理过程。其读、写、擦除的延迟分别在**微秒(µs)到毫秒(ms)**级别,这直接导致了它在存储金字塔中的位置。
-
这是这比机械硬盘,磁盘快得多了。
-
-
天生的“缺陷”:
-
写寿命有限: 物理写入过程会磨损存储单元。
-
必须先擦后写: 不能直接覆盖数据,且擦除单位(Block)远大于写入单位(Page),这会引发巨大的性能开销,即写入放大。
-
存在坏块: 出厂和使用中都可能产生不可用的物理单元。
-
-
这些缺陷决定了我们绝不能像访问 RAM 一样直接控制 NAND 闪存。强行这样做,不仅性能极差,还会迅速摧毁设备。因此,我们需要一个“操作系统”来帮我们处理硬件缺陷。
-
3. 交互流程
以读操作为例,观察整个链路 CPU 是如何控制 UFS 的。
-
准备 (OS Driver):OS 内核驱动在主内存中构建一个 UTRD/PRDT 数据结构,描述“读取N个块到内存地址A”。
-
委托 (OS Driver -> Host Controller):驱动程序“按响” 主机端 UFS 控制器的“门铃”。此时,CPU 的委托完成,可以立即切换去执行其他无关任务,实现了异步。
-
硬件卸载 - 协议处理 (Host Controller):主机控制器被激活,通过 DMA 读取命令,将其打包成 UPIU,并通过 M-PHY(一种总线) 发送给 UFS 设备。
-
智能管理 (Device Controller -> NAND):UFS 设备端控制器接收命令,其 FTL 固件将逻辑地址翻译为物理地址,并从 NAND 阵列中读取数据。
-
数据回传 (Device -> Host):数据通过 M-PHY(一种总线) 回传至主机控制器。
-
硬件卸载 - 数据传输 (Host Controller -> Main Memory):主机控制器的 DMA 引擎接管数据,并将其直接写入主内存地址 A。CPU 在整个数据传输过程中零参与,其算力未被消耗。
-
回报 (Host Controller -> OS Driver):DMA 完成后,主机控制器向 CPU 发送硬件中断。
-
处理回报 (OS Driver):CPU 暂停当前任务,执行中断服务程序,处理 I/O 完成的后续事宜。
4. 总结
通过对 UFS 持久化存储子系统,从软件驱动到物理介质的全链路分析,我们可以得出以下结论,它们共同构成了现代高性能存储的基石:
1. 问题的本质是速度,解决方案的核心是“异步”与“卸载”
UFS 系统的所有复杂设计,都源于一个根本性问题:存储金字塔中 CPU 与持久化存储之间巨大的性能鸿沟。其解决方案的精髓在于:
-
异步:通过“委托-回报”机制,CPU 无需同步等待,实现了计算与 I/O 的并行。
-
卸载:通过专用的 UFS 主机控制器 和其 DMA 引擎,将协议处理和数据传输等繁重任务从 CPU 身上剥离,实现了硬件加速。
2. 软件的焦点是“指挥”,硬件的智能是“伪装”
作为 OS 开发者,我们的世界被清晰地划分:
-
指挥部——OS 内核驱动:我们的职责不是去搬运一砖一瓦,而是成为一个运筹帷幄的指挥官。我们通过 MMIO,向 UFS 主机控制器下达符合 JEDEC 标准的、更抽象的作战命令。
-
设备的伪装艺术——FTL:我们之所以能够轻松地指挥,是因为 UFS 设备控制器和它内部运行的 FTL“专用操作系统” 扮演了完美的“智能士兵”。它将一个充满物理缺陷的 NAND 闪存,巧妙地伪装成了一个线性、可靠、不知疲倦的理想存储空间。这种硬件层面的抽象与伪装,是整个固态存储革命的无名英雄。
3. 标准化是这一切得以实现的“通用语言”
如果说异步和卸载是设计思想,FTL 是内部魔法,那么 JEDEC 标准就是将这一切凝聚起来的“通用语言”。它使得不同厂商的 SoC(主机)和 UFS 芯片(设备)能够无障碍地沟通,确保了我们编写的驱动程序具有强大的可移植性。我们的代码,本质上就是在用 Rust 或 C 语言,去“说”这种标准化的 JEDEC 语言。
最终,控制 UFS 系统的艺术,是在深刻理解其分层、解耦思想的基础上,利用 JEDEC 这桥梁,去高效地指挥那个不知疲倦的硬件代理(主机控制器),并完全信赖远端那个智能管家(设备控制器)会处理好一切物理世界的纷繁复杂。 这不仅是驱动开发的技巧,更是现代计算机体系结构中软件与硬件协同工作的优雅典范。

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)