南京大学 操作系统 (JYY) 学习笔记:持久化的黑魔法------从磁铁、刻坑到闪存电荷
写在前面:这是本系列的第二十一篇。
在计算机硬件五花八门的设备中,有一类专门负责持久化数据的存储设备。而"文件系统"正是在这些存储设备上实现的,使我们的计算机能可靠地保存宝贵的数据。
在短短几十年间,我们见证了存储器从 KB 到 TB 的恐怖跨越。本讲内容:我们将化身底层黑客,拆解存储设备是如何持久保存数据的,以及操作系统是如何将其抽象为 Block Device(块设备)的。

课前复习:设备和驱动程序

概念很简单
- 它就是实现了
struct file_operations的一个"东西",把底层的硬件寄存器操作封装成标准的read/write接口。
实现很复杂
- 打印机、扫描仪、显卡、KVM......
- 每种设备背后都有一整个产业链。
正式进入持久化 (Persistence) 阶段
Persistence: "A firm or obstinate continuance in a course of action in spite of difficulty or opposition."(在困难或反对面前坚定或固执地坚持某一行动过程。)
- 我们的祖先早就希望数据能永久留存。
- 在石头上刻字就行啦(呃,但我们还想修改数据,石头可不好擦)。

1-Bit 的存储:磁铁 (正 v.s. 反)
"持久化"可能没有想象的那么困难
- 本质上就是需要一个**"能反复改写的物理状态"**。
- 当然,前提是这个状态必须能被寻址,并且能用电路快速改写。
- 比如:磁极的方向,State = 1 (正) or 0 (反)。

电磁感应:物理世界与虚拟世界的桥梁
1D 存储设备:把 Bits "卷起来" (磁带,1928年)
- 在纸带(今天是塑料带)上均匀粘上铁磁性颗粒。
- 只需要一个机械部件(转动)进行一维的定位。
- 读取: 放大感应电流。
- 写入: 电磁头(电磁铁)改变磁畴的磁化方向。

密度可高,可不高


- 这是一个典型的一维存储材料。
磁带:作为存储设备的分析
- 价格低: 廉价塑料材料,几乎不涉及大规模集成电路。
- 容量高。
- 可靠性高: 适当封装后,寿命极长。
- 读写性能: 顺序读写勉强(需要花很长时间卷带定位),随机读写几乎完全不行!
- 应用场景: 大厂机房冷数据的终极存档和备份。
磁鼓(Magnetic Drum)
- 1D \\rightarrow 1.5D (1D x n):
- 用旋转的二维曲面存储数据(虽然无法内卷导致总容量变小)。
- 优势:读写延迟绝对不会超过旋转一个周期,随机读写速度大幅提升!

疯狂内卷:机械磁盘 (Hard Disk, 1956)
- 1.5D \\rightarrow 2.5D (2D x n):
- 既然一个盘面容量不够,那就在垂直方向上叠加无数个盘片(磁带平摊)。

磁盘:克服各种工程挑战的工业奇迹


磁盘:作为存储设备的分析
- 价格低: 高密度、低成本。
- 容量高: 2.5D 结构,上万个磁道。
- 可靠性较高: 但里面是高速运转的机械部件,跌落或剧烈震动是致命威胁。
- 读写性能: 顺序读写较高;随机读写依然勉强(需要等待机械臂寻道)。
- 应用场景: 计算机系统长期的主力数据存储库。
磁盘:性能调优的极限
既然随机读写慢,如何想办法压榨出它的极限速度?
延迟剖析:读/写一个扇区需要经历什么?
- 寻道时间 (Seek Time): 机械读写头需要移动到对应的磁道。
- 旋转延迟 (Rotational Latency): 转轴将盘片旋转,使得读写头恰好悬停在目标扇区的上方。
- 7200 rpm \\rightarrow 每秒 120 转 \\rightarrow 平均等待半圈的旋转延迟约为 4.16ms,加上寻道通常需要 8ms 左右。
操作系统的神级缓解策略:
- 电梯调度算法 (SCAN): 把磁头想象成电梯,顺着一个方向把顺路的读写请求全部处理完再掉头,极大地减少了机械臂的折返跑。(虽在 SSD 时代已成历史尘埃)。
- 硬件级的 NCQ (Native Command Queuing, 原生指令队列): 允许硬盘内部自行对排队的指令进行优化排序。
软盘(Floppy Disk)
- 把读写头和盘片分开------实现数据的物理移动!
- 计算机上装一个固定驱动器(Drive),盘片可以随时拔插带走。
- 尺寸演进:8" (1971) \\rightarrow 5.25" (1975) \\rightarrow 3.5" (1981)。
- 最初的软盘真的很"软",外壳就是个纸壳子。后来 3.5 英寸为了可靠性做成了硬塑料壳。

曾经那个"软件 == 软盘"的时代
早期的硬盘是冷插拔的,系统运行时绝对不能拔硬盘,否则直接报废。
但软盘的出现,让"移动数据"和"贩卖软件"成为了可能。

软盘分析:
- 价格低: 塑料片成本极低。
- 容量极低: 裸露介质,密度受限(经典的 1.44MB)。
- 可靠性极低: 防磁防尘极差,随时准备损坏。
- 读写性能: 极低。
- 应用场景: 它现在最大的作用,就是变成了 Word 和 Excel 里的"保存"图标。
1-Bit 的存储:挖坑 (坑 v.s. 平)
坑:天然容易"阅读"的数据存储
跨越千年的持久化存储方法:雕刻。

但现代工业可以挖出纳米级精度的坑。假设:挖坑表示 0,平整表示 1。

Compact Disk(CD 光盘)
- 在反光的塑料平面上,挖出粗糙的坑。
- 激光扫过表面,遇到平整面反射光线 (1),遇到坑洼产生散射 (0),这样就能瞬间读出海量二进制数据。
- 飞利浦与索尼的杰作:44.1kHz, 16-bit, 2 声道刚好能装下 74 分钟的贝多芬第九交响曲(约 700MB)。

光盘最有趣的特性:极其容易低成本复制!
这在很大程度上促进了前互联网时代盗版软件和影音的疯狂传播。只要造一个母盘,剩下的只需像印章一样往下压即可。
- "压盘"后镀上反射膜。
- 工业流水线:3 秒钟就能压出一张 100GB 的蓝光光盘(相当于 33,000MB/s 的恐怖写入速度!)。
光盘:作为存储设备的分析
- 价格极低。
- 容量高(在那个年代)。
- 可靠性高: 你划伤的其实是没有数据的那一面(数据层在标签面底下),且双面不对称。
- 读写性能: 顺序读较好,随机读极低。写入极度困难(刻录机其实是在用高功率激光"烧"坏染料层,不可逆)。
- 应用场景: 统治了一个时代的数字内容实体分发。
Project Silica:回归 Rosetta Stone (石碑)
微软的黑科技:用飞秒激光在极其耐用的石英玻璃内部写入 3D 立体数据。保质期高达上万年。

1-Bit 的存储:电荷 (充电 v.s. 放电)
以上所有的物理存储都有致命缺陷:
- 磁: 存在机械部件(无法避免的毫秒级机械延迟)。
- 光: 挖坑效率极低,填坑(复写)几乎不可能。
Solid State Drive (固态驱动器)
我们真正想要的是:电子的密度,加上纯电路的光速!
- Flash Memory (闪存) 登场。
- 如何在微观电路中持久保持 1-bit?
- 在硅片里挖个"坑"(浮栅极)。
- 用高压把电子强行塞进去 = 状态 0。
- 把电子放跑 = 状态 1。
1-Bit Flash Memory 原理

闪存:近乎完美的存储介质
- 价格低: 纯大规模集成电路。
- 容量高: 目前已经可以做到 200 层以上的 3D 堆叠。
- 可靠性高: 没有机械部件,完全不怕摔。
- 读写性能极高: 天然的电路并行。
- 极为离谱的优点:容量越大,速度越快!(因为更多的芯片可以同时拉起并发读写)。
Jim Gray (图灵奖得主, 2006):
"Tape is Dead, Disk is Tape, Flash is Disk, RAM Locality is King."
(磁带已死,磁盘沦为磁带,闪存成为磁盘,内存局部性才是王道。)
开启"优盘"时代

但是!Flash Memory 会面临"物理磨损" (Wear Out)
- 闪存的"放电 (Erase)"做不到 100% 把电子全清干净。
- 当同一个单元被擦写数千/数万次以后,由于绝缘层的损毁,它就像漏水一样,永远呈现"充电"状态了。这就是 Dead cell。
- 听到这里有没有觉得有点害怕?如果操作系统还像操作磁盘那样,频繁在同一个位置更新系统日志,你的 U 盘不出一天就会直接暴毙报废!
终极答案:软件定义磁盘 (FTL)
你的 SSD、优盘,甚至是小小的 TF 卡里,其实都藏了一台完整的计算机系统 (SoC)!

- FTL (Flash Translation Layer - 闪存转换层):
- 固态硬盘主控芯片里运行的一套"微型操作系统"。
- Wear Leveling (磨损均衡): 当你以为你在覆写 0x01 地址时,FTL 其实偷偷在物理颗粒上找了一块全新的干净区域写下数据,然后悄悄修改了内部的映射表。它用极其复杂的软件算法,保证了整块硬盘的物理磨损是极其均匀的。
Flash Disk 和 NAND Flash 的参差
U盘、SD卡、高端 SSD 本质都是 NAND Flash,但软件/硬件系统的复杂程度天差地别:
- 高端 SSD: 拥有强大的多核 CPU 控制器、板载 DRAM 缓存、Store Buffer 以及极其聪明的 FTL 固件。正常使用可以达到上千年的寿命。
- 廉价 U 盘 / SD 卡: 为了省钱,控制器极度简陋,甚至没有正规的损耗均衡。高频读写分分钟暴毙。
极客警示:一定不要买过度便宜的 U 盘保存重要数据!
- 还记得什么是"设备"吗?设备只是一个对外通信的接口。
- 设备是完全可以被"伪造"的! 它可以假装自己是金士顿,它更可以向操作系统谎报自己有 1TB 容量(实际只有 8GB 物理芯片)。
- 当你写入超过 8GB 的数据时,黑心主控会直接把数据丢进黑洞,依然向操作系统返回
Write Success!
学了《操作系统》底层的 FTL 原理,你完全可以自己刷写主控固件去当扩容奸商。但这挣钱的途径已经被写在了《刑法》第一百四十条里。
存储设备在操作系统中的抽象
从 1-Bit 到 1-TB 的代价
要实现对 TB 级海量数据的精确定位寻址,硬件代价是巨大的(磁盘需要扇区头,电路需要行/列选通信号线)。
解决之道:按块访问 (Block Devices)
- 不再允许按 Byte 寻址,读写的最小物理单位被强制设定为 Block(块,通常为 512B 或 4KB)。
- 一整个块共享同一份 metadata(纠错码 ECC 等),极大地节省了硬件开销。
- 所以在 Linux 中,硬盘被称为
Block devices(如ls -l /dev/sd*中第一列的b)。
块设备抽象的代价:读写放大 (Write Amplifications)
- 这种"只能按块操作"的底层限制导致了读写放大。
- 如果你只想修改文件里的 1 个字节?对不起,底层硬件必须把这 1 个字节所在的整个 4KB 块全部读入内存,修改那 1 个字节,然后再把这 4KB 完整写回硬盘!
- 这也意味着,文件系统的软件设计者,必须在代码层面深深地感知到底层"块"的存在。
Linux Bio 子系统 (Spicy 🌶️)
面对成百上千个杂乱的读写请求,操作系统内核(Bio + Driver)是如何在底层进行调度的?
- Request/response 接口: 上层应用任意乱丢请求。
- Multi-queue block I/O queuing: 内核通过多队列技术,把请求打散、重排、合并。
核心数据结构(你可以通过让 AI 阅读这些 Linux 内核源码感受极客之美):
struct requeststruct biostruct bvec_iter(真正的 I/O vector,记录扇区号)

总结
Take-away messages:
无论是高贵的内存还是持久存储,最终在底层胜出的依然是电(电荷)------它的密度和光速般的传输是其他机械/光学介质绝对难以比拟的。
但 NAND Flash 也是有妥协的,巨大的"写入寿命"缺陷曾让它备受质疑。幸运的是,人类的工业界敢于试制这样跨时代的半导体产品,用强大的软件层(FTL)硬生生弥补了硬件的短板,让 SSD 终究在争议中成为了今天存储的绝对主角。
如果未来有一天,比 Flash 更快、且永不磨损的 Non-volatile Memory (非易失性内存,如 3D XPoint) 彻底普及,我们的计算机底层架构是否又会发生翻天覆地的洗牌?
强烈建议大家在 AI 的帮助下阅读经典的 Coding for SSDs 系列文章。海量的底层阅读,将帮助你建立起极其硬核的"计算机科学世界观"。
