核心冲突总结主机端的诉求传统的软件逻辑都是按照 $2^n$ 来对齐的如 16KB、64KB、128KB、256KB。突然被要求按照96KB或192KB非 $2^n$ 的奇葩数字来对齐导致软件层需要大改。SD卡厂商的诉求要求主机必须按照 96KB/192KB 的倍数下发写命令。如果不这么做卡内的“空闲块消耗太快”寿命急剧缩短引发掉速或损坏。为什么会冒出 96KB / 192KB 这种奇怪的对齐要求这完全是由现代3D TLC NAND Flash 的物理结构和固件的FTL闪存转换层策略决定的。1. NAND Flash 的物理页Page变大了以前的 SLC/MLC 时代一个物理页通常是 2KB、4KB。所以以前推荐 4K 对齐。 但现在的 3D TLC 卡片为了追求容量物理页Page变得非常大常见的物理页大小已经是16KB甚至32KB。2. 主控的“超级页”Super Page策略为了提高写入速度SD 卡的主控Controller通常不会一页一页地写而是会开启**多通道Multi-plane / Multi-die Interleaving**并发写入。单颗芯片里面封装了 8 个 Die。 如果主控的 FTL 设计为了追求最大效率将多个 Die 的物理页绑定在一起作为一个“最小写入单元”我们通常叫 Super Page 或 Chunk那么它的最佳对齐值就会变成一个非 $2^n$ 的数字。96KB 的由来比如物理页是 16KB主控为了填满内部的某些并发通道将 6 个物理页或通道组合$16KB \times 6 96KB$。192KB的由来硬件升级了通道数翻倍或者物理页变大变成了 $16KB \times 12 192KB$ 或者 $32KB \times 6 192KB$。如果主机坚持用 128KB 写入会发生什么灾难空闲块为何消耗快假设 SD 卡底层的最优写入单元是96KB但主机坚持每次写128KB。第一次写入 (128KB)主控拿出 96KB完美地填满了一个底层单元。剩下的 32KB主控只好拿出一个新的 96KB 单元来存导致这个单元有 64KB 是“空”的内部碎片。后续写入的恶性循环读-改-写 / RMW车载监控是在持续不断录像的高强度的顺序写。为了不浪费那 64KB 的空间SD 卡的 FTL 必须把之前的数据读出来和新来的数据拼在一起然后再找一个新块写进去。结果极高的写放大Write Amplification, WAF为了写 32KB 的有用数据主控在后台可能搬运了成百上千 KB 的数据。这会导致后台的**垃圾回收Garbage Collection, GC**疯狂运转。“空闲块消耗太快”闪存的擦写次数P/E Cycle是有限的疯狂的 GC 会导致备用的空闲块被迅速耗尽卡片很快就会进入只读状态写死或者因为主控忙于搬垃圾而导致严重掉速录像卡顿、丢帧。给设备端BSP 工程师的建议面对这种定制化的、带有强硬件属性的 SD 卡设备端通常只能妥协因为车载录像对卡片寿命的要求极其苛刻不对齐真的会出大问题。解决方案通常是在主机内存RAM里做缓冲。既然底层的vfs或文件系统习惯用 64K/128K 处理你们可以在驱动层Driver或应用层拦截一下开辟一个192KB或其倍数如 384KB, 768KB的环形缓冲区Ring Buffer。 当上层应用把数据塞满这个 192KB 的 Buffer 时再统一调用底层的块设备写指令Block Write一次性以 192KB 为单位“砸”给 SD 卡。这样就能完美契合SD卡主控的 FTL 胃口。在操作系统的传统认知里数据对齐永远是 $2^n$比如 16K、64K、128K。SD卡厂商提出的96KB和192KB看似违背常理但只要剥开3D TLC NAND的物理底层这个数字的出现不仅合理而且是数学上的必然。这背后核心的物理原因可以总结为一个公式最优写入大小 物理页大小 $\times$ TLC的字线页数 $\times$ 并发通道数下面为你详细拆解这三个物理参数佐证这 96KB 是怎么算出来的。1. 物理基石16KB 的物理页 (Page)在早期闪存SLC/MLC时代一个物理页通常是 4KB 或 8KB。但到了 3D TLC如 64层、96层及以上时代为了平摊外围电路的面积并提升存储密度业界主流包括铠侠、美光、三星等将标准的物理页Physical Page大小统一做到了 16KB。物理限制闪存的最小读写单位是“页”。你不能只写 1KB哪怕只写 1 字节底层也要刷入完整的 16KB。2. TLC 的特殊结构一个字线包含 3 个页 (Wordline)这是 96KB 出现非 $2^n$ 属性的最核心原因TLC 的定义TLCTriple-Level Cell代表一个物理存储单元Cell里存了 3 个比特Bit的数据。物理映射在电路上同一排的 Cell 被一根叫作**字线Wordline, WL**的控制线连在一起。因为每个 Cell 存 3 个 Bit所以在 TLC 闪存中一条物理字线实际上映射了 3 个逻辑上的物理页分别称为 Lower Page、Middle Page、Upper Page。One-Shot 编程关键点早期 TLC 可以一页一页写但极易产生严重的电压干扰程序干扰导致寿命极速下降。现代 3D TLC 为了保证寿命和写入速度强烈要求 FTL 采用One-Shot Programming一次性全字线编程。计算也就是说主控在对一个字线进行写入时必须把 3 个页一次性写满。容量$16\text{KB (物理页大小)} \times 3\text{ (TLC的三层页)} 48\text{KB}$到这里48KB这个基础的非 $2^n$ 模块就已经诞生了。3. 主控的并发榨汁机多 Plane 与交错 (Interleaving)如果每次只写 48KBSD 卡的速度根本达不到 V3030MB/s或更高级别的视频卡标准。为了提速SD 卡的主控芯片如群联、慧荣的方案引入了空间并行技术。Plane面一颗 NAND 裸片Die内部通常被切割成 2 个或 4 个独立运作的区域Plane。主控可以同时向这两个 Plane 发送写指令Multi-Plane Operation。96KB如果SD 卡底层采用了双面并行2-Plane的写入策略那么主控为了实现最高效率、最低磨损就会要求每次下发的数据量刚好填满两个 Plane 的完整字线。计算$48\text{KB (单Plane满字线)} \times 2\text{ (Plane数)} 96\text{KB}$192KB这说明新款卡片升级了底层的并发规模。要么是采用了4-Plane架构的更先进 NAND要么是主控开启了双 Die2-Die交错写入$96\text{KB} \times 2 192\text{KB}$。