想象一座建在硅片上的存储小镇,数据是一颗颗小球,必须住进不会停电的小房间。Flash 闪存就是这座小镇的房间与物流系统。最早的 NOR 像格子间档案馆:每个字节都有独立门牌号,CPU 想读哪个房间就直奔哪个房间;但盖一间独立房间很贵,容量做不大。为了装更多数据,NAND 出现了——它把小球装进密集的集装箱,按“页”搬运、按“块”清场,容量大、成本低,却没法随机取一个字节。再后来,小镇把 NAND 和一位物业管家封装在一起,做成 eMMC 精装公寓;而追求极致速度的 UFS,则修了两条能同时双向跑车的高速隧道。这篇文章就带你在存储小镇里走一圈,看懂四种闪存方案的分工。

岗位关联

对 AI 从业者:边缘盒子、手机推理、自动驾驶设备都离不开启动固件与大模型落盘,理解这些闪存差异能帮你定位存储瓶颈、做对硬件选型。

目录
  1. 可视化演示
  2. 闪存基础:浮栅小柜子
  3. NOR特性:格子间档案馆
  4. NAND特性:集装箱仓库
  5. 单元类型:一柜多档位
  6. eMMC集成:带管家的精装公寓
  7. UFS高速:高铁双隧道
  8. 应用选型:按需配货
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示NOR与NAND单元结构差异、NAND页块写入擦除机制与eMMC并行半双工vs UFS串行全双工接口对比,帮助理解Flash存储核心技术。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+captions.norNand+'

闪存基础:浮栅小柜子

存储小镇上,每个数据都是一颗小球。小球要住得久,就得住进“浮栅小柜子”。柜子的门由控制栅控制,柜子深处是浮栅,中间隔着一层比城墙还厚的氧化层。往柜子里放小球时,仓管员在控制栅上加高压,让小球穿过氧化层进入浮栅;移走电压后,氧化层把小球死死关在柜里,所以断电也不丢。

这颗小球的数量会影响晶体管的阈值电压。读出时,只要看柜子里小球多还是少,就能分辨 0 和 1。这个小柜子就是 Flash 的最基本单元——浮栅晶体管。它天生是非易失存储:柜门不需要持续供电,小球也能被关在里面。

Flash 不能像纸张一样原地改字:必须先擦除(清空柜子)、再编程(写入)。擦除以块为单位,因为高压清场动辄一整片区域;读和写则按页或字节进行。每次擦写,氧化层都会被高压轻微磨损,于是有了 P/E cycle(擦写次数)上限,这就是闪存的寿命来源。

所以选存储设备,本质是在选柜子的结构。NOR 是格子间,NAND 是集装箱,eMMC/UFS 是带管家和高速路的整体方案。

Vth=Vth0+∣Qe∣Cfg\displaystyle V_{th}=V_{th0}+\frac{|Q_e|}{C_{fg}}
浮栅里电荷越多,晶体管开启越困难;读出电路检测阈值变化就知道存的是 0 还是 1。
  1. 初始阈值 \(V_{th0}\)空柜时晶体管的开启阈值电压,是参照基准。
    Vth0V_{th0}
  2. 浮栅电荷 \(Q_e\)被关在浮栅里的电子总电荷量。
    QeQ_e
  3. 等效电容 \(C_{fg}\)浮栅与控制栅之间的等效电容,决定电荷对阈值的影响程度。
    CfgC_{fg}
  4. 公式含义电荷越多,阈值越高,对应“已编程”状态。
    Vth=Vth0+∣Qe∣CfgV_{th}=V_{th0}+\frac{|Q_e|}{C_{fg}}

NOR特性:格子间档案馆

最早的“格子间档案馆”叫 NOR。每个字节都有独立门牌号——地址线可以直接选中任意字节。想读固件里的某条指令,CPU 像拿着门牌号直奔房间,不需要把整个仓库搬出来。

这种随机读取能力来自 NOR 的电路结构:每个存储单元一端接位线,行译码器和列译码器形成一张二维地址网。读出时,行译码选字线,列译码选位线,读出放大器把微弱电流变成 0/1。由于译码电路密集,NOR 单元面积大,所以容量做不大、成本高。

代价是写入和擦除非常慢。NOR 擦除同样要把一个大块清空,编程也要先擦后写,所以它只适合存很少改动、经常随机读的内容,比如 BIOS、Bootloader、固件参数。CPU 甚至可以直接在 NOR 上执行代码(XIP),省去先拷贝到 RAM 的步骤。

存储小镇里,NOR 像一间间独立档案室:查资料快,但建档案室贵、扩建难、整层改造更慢,所以它只放最重要的启动说明书。

Tread=trow+tcol+tSA\displaystyle T_{read}=t_{row}+t_{col}+t_{SA}
地址到数据的读出时间,等于行译码、列译码、读出放大器三段接力耗时之和。
  1. 行译码延迟 \(t_{row}\)行译码器选中字线所需时间。
    trowt_{row}
  2. 列译码延迟 \(t_{col}\)列译码器接通目标位线所需时间。
    tcolt_{col}
  3. 读出放大器稳定时间 \(t_{SA}\)把电流转换成逻辑电平需要的时间。
    tSAt_{SA}
  4. 总读出时间三段串行相加,就是一次随机读取的大致延迟。
    Tread=trow+tcol+tSAT_{read}=t_{row}+t_{col}+t_{SA}

NAND特性:集装箱仓库

数据越来越多,格子间太贵。于是 NAND 来了——它不是一个个独立房间,而是把晶体管串成一条长队,做成一排排密集的集装箱。为了节约面积,NAND 不给每个字节单独拉地址线,数据最小按“页”(例如 4KB)读写。

在 NAND 集装箱堆场里,一个块由一个或多个页组成。读数据可以按页搬;擦除却必须按“块”整片清场,用高压把浮栅里的电子一次性赶走。这种结构让单元之间不需要大量金属线,容量密度高、单位成本低,但也带来两个麻烦:不能覆盖写,必须先擦整块;读取时可能出现位翻转,需要控制器做 ECC 纠错和坏块管理。

所以存储小镇的集装箱仓库 NAND 擅长一次装很多货物、按箱进出,不适合零散取单个字节。它成为 SSD、存储卡、手机大容量存储的底层主角。

BlockBytes=Pper_block×Spage,Terase≫Tprogram≫Tread\displaystyle BlockBytes=P_{per\_block}\times S_{page},\quad T_{erase}\gg T_{program}\gg T_{read}
一个块的容量由页数乘以页大小决定;速度上,擦一块远慢于写一页,写一页又慢于读一页,这是 NAND 的基本节奏。
  1. 页数 \(P_{per\_block}\)每个块里包含的页数量。
    Pper_blockP_{per\_block}
  2. 页大小 \(S_{page}\)一个页的字节数,常见 4KB 或 16KB。
    SpageS_{page}
  3. 擦除耗时 \(T_{erase}\)擦除一个块需要的时间,量级最大。
    TeraseT_{erase}
  4. 写读速度关系写入一页比读出一页慢得多。
    Tprogram≫TreadT_{program}\gg T_{read}

单元类型:一柜多档位

同样是 NAND 集装箱,柜门上的“刻度”还能再分。SLC 只分两档:有没有电子,代表 0/1,一柜存 1 比特;MLC 把电压分成 4 档,每柜存 2 比特;TLC 分成 8 档,每柜存 3 比特。

档位越多,同一个柜子里塞的比特越多,容量密度越高、单 GB 成本越低。但相邻档位之间的电压差值变小,读写电路更容易判断错;反复擦写后氧化层老化,电平偏移,纠错压力变大,寿命缩短。于是 SLC/MLC/TLC 成为不同产品间的取舍。

小镇里的看门人最清楚:格子里的抽屉越多,找东西越便宜但越容易看走眼。为了省成本,MLC/TLC 进入大众设备;为了高可靠,SLC 留给工业级关键数据。

Nbits=log⁡2M\displaystyle N_{bits}=\log_2 M
电压档位数每翻一倍,每个存储单元能存的比特数就加 1。
  1. 电压档位数 \(M\)存储单元支持的电压等级数量。
    MM
  2. 比特数 \(N_{bits}\)每个存储单元能够保存的比特数量。
    NbitsN_{bits}
  3. 对数关系档位从 2 变 4 再变 8,比特数从 1 到 2 到 3。
    Nbits=log⁡2MN_{bits}=\log_2 M

eMMC集成:带管家的精装公寓

裸 NAND 擦写麻烦、有坏块、还要纠错,用户直接使用太痛苦。于是存储小镇推出一体化精装房:eMMC。它把 NAND 芯片和一位“物业管家”(控制器)封装在同一个模块里,用户插上就能用,不需要懂坏块、磨损均衡和擦写算法。

eMMC 的接口采用并行总线:8 根数据线可以同时发 8 位数据,就像八辆小车并排出小区。为了进一步提高吞吐,eMMC 支持 DDR 双倍速率——时钟上升沿和下降沿都传数据。控制器还负责 ECC、坏块管理、功耗控制。它成为手机、平板、车载中控常见的嵌入式存储。

eMMC 的短板在并行总线:八辆车并排跑,频率高了容易互相干扰,而且发送和接收共用道路,不能同时双向。高档小区还想要更快,就得换 UFS 高铁。

ReMMC=Wbus×fclk×2\displaystyle R_{eMMC}=W_{bus}\times f_{clk}\times 2
并行总线越宽、时钟越高、DDR 翻倍,每秒能搬的数据就越多。
  1. 总线宽度 \(W_{bus}\)并行数据总线位数,eMMC 常见 8 位。
    WbusW_{bus}
  2. 时钟频率 \(f_{clk}\)接口时钟频率,单位通常为 MHz。
    fclkf_{clk}
  3. DDR 系数 2在时钟上升沿和下降沿都采样,速度翻倍。
    ×2\times 2
  4. 计算示例8 位总线、200MHz 时钟,DDR 时约为 3200Mbps。
    ReMMC=8×200×2R_{eMMC}=8\times 200\times 2

UFS高速:高铁双隧道

UFS 是存储小镇新修的高铁系统。它不用 8 条并行马路,而是用 2 条高速串行 Lane——每条是一条专用隧道,数据以极高频率一列车接一列车发。并行总线怕时钟偏斜和串扰,串行隧道反而容易把单车道速度推到很高。

更关键的是全双工:两条 Lane 可以一条下行、一条上行,同时发车;eMMC 的半双工一次只能一个方向。UFS 还支持命令队列,相当于调度中心可以同时安排多趟列车,而不是等上一趟到站再问下一趟。因此随机读写和顺序读写都大幅提升,高端手机从 eMMC 转向 UFS。

如果 eMMC 是八车道普通公路,UFS 就是两条可同时反向跑的高铁隧道。隧道窄,但班次密、调度聪明,整体吞吐反而更高。

BUFS=2×Nlane×Rlane×η\displaystyle B_{UFS}=2\times N_{lane}\times R_{lane}\times \eta
全双工系数 2 乘以 Lane 数、单 Lane 速率和有效载荷率,就是理论带宽。
  1. 全双工系数 2收和发两个方向同时工作,吞吐翻倍。
    22
  2. Lane 数量 \(N_{lane}\)UFS 常见 2 条 Lane。
    NlaneN_{lane}
  3. 单 Lane 速率 \(R_{lane}\)每条 Lane 的物理传输速率。
    RlaneR_{lane}
  4. 有效载荷率 \(\eta\)扣除编码和协议开销后,真正传数据的有效比例,约 0.8。
    η\eta

应用选型:按需配货

最后回到小镇的物流调度台:没有最好的存储,只有最合适的送货方式。需要快速随机取用小数据、还要断电不丢的,派 NOR 去,比如 BIOS、Bootloader、网卡固件;需要海量数据、按块搬运的,派 NAND/eMMC 上,比如监控录像、手机相册、SSD 数据盘。

手机和平板里,中低端常用 eMMC,因为便宜、封装省心;高端机用 UFS,因为要秒开应用、加载大型游戏,AI 模型文件也需要快速读入内存。服务器和数据中心则直接用带更强控制器的 NAND SSD,追求高 IOPS 和低延迟。

所以存储选型就像安排送货路线:说明书放格子间,照片视频扔集装箱,旗舰机直接上高铁双隧道。你只需要问三个问题:读多还是写多?随机多还是顺序多?预算够不够?

Veffective=min⁡(Vinterface,Vcontroller,VNAND)\displaystyle V_{effective}=\min(V_{interface},V_{controller},V_{NAND})
系统实际速度看最短那块木板:接口、控制器、闪存介质任何一环慢,整体就慢。
  1. 接口速度 \(V_{interface}\)接口能提供的带宽,如 eMMC 或 UFS。
    VinterfaceV_{interface}
  2. 控制器速度 \(V_{controller}\)控制器处理命令的速度。
    VcontrollerV_{controller}
  3. 介质速度 \(V_{NAND}\)闪存颗粒本身的读写和擦除速度。
    VNANDV_{NAND}
  4. min 运算木桶效应,整体性能由最慢环节决定。
    Veffective=min⁡(Vinterface,Vcontroller,VNAND)V_{effective}=\min(V_{interface},V_{controller},V_{NAND})

AI 应用场景

边缘AI盒子启动与固件更新

阶段:部署与启动

解决的问题:传统方案把 Bootloader 放在普通磁盘里,启动慢且容易被异常断电破坏;AI 边缘盒子需要在毫秒级完成设备初始化,并可靠保存模型版本与 OTA 标记。NOR 随机读取快,适合放启动固件;eMMC 负责放系统和大模型镜像。把两者结合,既保证启动可靠,又避免频繁擦写 NOR。

具体案例:一台自动售货机的视觉识别盒子,把 Bootloader 放在 SPI NOR 上,Linux 系统和 TensorFlow Lite 模型放在 eMMC 中。上电后 NOR 先执行,再从 eMMC 加载模型,固件升级时只替换 eMMC 分区,不会把 NOR 写坏。

手机端大模型应用提速

阶段:模型加载与推理初始化

解决的问题:端侧大模型文件动辄几个 GB,还包含大量小文件;eMMC 命令队列浅、半双工,加载慢,用户等白屏。UFS 的全双工和命令队列可以同时处理多个读取请求,显著降低冷启动延迟。

具体案例:手机端侧部署量化后的 7B 模型,模型文件约 4GB。使用 UFS 的旗舰机比使用 eMMC 的中端机打开 AI 助手时,模型加载时间缩短接近一半,首字延迟明显下降。

数据中心AI训练数据读取

阶段:数据管道

解决的问题:训练集包含海量小图片和 JSON 样本,传统机械硬盘随机读 IOPS 太低,GPU 经常等数据。基于 NAND 的企业级 SSD 提供高随机读和深度队列,把 DataLoader 瓶颈降到最低。

具体案例:PyTorch DataLoader 读取 10 万张图片时,把数据盘从 HDD 换成 NAND SSD 后,单卡 GPU 利用率从 60% 提升到 95%,训练步耗时明显缩短。

Python 演示

python39 行
class FlashStorage:    def __init__(self, name, page_bytes, pages_per_block, blocks, read_ms, program_ms, erase_ms):        self.name = name        self.page_bytes = page_bytes        self.pages_per_block = pages_per_block        self.blocks = blocks        self.read_ms = read_ms        self.program_ms = program_ms        self.erase_ms = erase_ms     def capacity_gb(self):        total = self.page_bytes * self.pages_per_block * self.blocks        return total / (1024 ** 3) def simulate(disk, reqs):    total_ms = 0.0    for op, addr in reqs:        if op == 'read':            total_ms += disk.read_ms        elif op == 'write':            total_ms += disk.program_ms        elif op == 'erase':            total_ms += disk.erase_ms    return total_ms if __name__ == '__main__':    nor = FlashStorage('NOR', 2, 128, 1024, 0.10, 0.35, 60.0)    nand = FlashStorage('NAND', 4096, 512, 2048, 0.08, 0.50, 3.50)    emmc = FlashStorage('eMMC', 4096, 512, 4096, 0.06, 0.40, 3.00)    ufs = FlashStorage('UFS', 4096, 512, 8192, 0.03, 0.25, 2.00)     requests = []    for i in range(100):        requests.append(('read', i))        requests.append(('write', i))    requests.append(('erase', 0))     for disk in [nor, nand, emmc, ufs]:        print(disk.name, 'capacity=', round(disk.capacity_gb(), 3), 'GB', 'total_ms=', simulate(disk, requests))
目的:用同一组读写请求横向模拟 NOR、NAND、eMMC、UFS 的容量与总耗时差异。
  1. class FlashStorage:定义一个存储抽象,把容量、读写和擦除耗时打包在一起。
  2. total / (1024 ** 3)从字节换算成 GB,方便对比容量密度。
  3. requests.append(('read', i))给所有存储相同的 100 次读、100 次写和 1 次擦除,保证公平。
  4. simulate(disk, requests)用统一请求集模拟总耗时,突出结构差异。
  5. for disk in [nor, nand, emmc, ufs]四种方案轮流上场,代码跑完就能看到 NOR 容量小但读快、NAND 系容量大但处理同一批请求更省时。

常见误区

误区NOR 读起来这么快,写应该也不差,为什么大家不用 NOR 装所有数据?是不是厂商故意不用好东西?

正解NOR 只有随机字节读取快,写入和擦除都很慢,而且单元面积大、容量做不大。NAND 虽然不能随机读字节,但页读写、块擦除的结构让密度和成本远优于 NOR。分工不同:NOR 守固件,NAND 扛数据。

为何常见:初学者先接触 NOR 的“随机读快”优势,容易把局部优势放大成整体优势,忽略了容量和成本。

误区eMMC 和 UFS 是不是像 SLC、MLC、TLC 一样,是闪存颗粒的类型?

正解eMMC 和 UFS 是“封装+接口+控制器”的整体方案,底层仍然是 NAND 闪存。eMMC 使用并行接口和内置控制器,UFS 使用串行高速 Lane、全双工和命令队列,但它们都不是颗粒工艺。

为何常见:手机参数表只写“eMMC 5.1”或“UFS 3.1”,不解释内部结构,容易让人把它们误认为新的颗粒技术。

误区TLC 一柜能存 3 比特,比 SLC 存得多,所以 TLC 一定更快更先进。

正解档位越多,单柜容量密度越高、成本越低,但相邻电压差变小,读写判断更容易出错,寿命和速度反而可能下降。TLC 能大规模普及,靠的是控制器 ECC 和磨损均衡,而不是“更快”。

为何常见:人们习惯用“数字大=更好”来判断,忽略了模拟电路里电压窗口变窄带来的可靠性代价。

误区eMMC 有 8 条数据线,UFS 只有 2 条 Lane,8 条并行肯定比 2 条串行快。

正解并行总线频率提高后,线间串扰和时钟偏斜会严重限制速度;UFS 的串行 Lane 单通道速率极高,再加上全双工和命令队列,实际吞吐远超 eMMC。车道多不等于跑得快,还要看车道频率和调度。

为何常见:“八车道比两车道宽”符合日常直觉,但电子世界里并行高频的物理局限不容易被直观感知。

面试题

Q1. NOR Flash 最典型的应用场景是哪个?

单选题 · easy

  • A.存放BIOS固件代码← 正确答案
  • B.存放4K高清视频
  • C.当作计算机主内存
  • D.作为CPU里高速缓存

答案:A。NOR 支持随机字节读取,且能够原地执行,适合存放 BIOS、Bootloader 等固件。高清视频需要大容量,NAND 更合适;主内存需要可快速改写且容量大,DRAM 才是主角;CPU 缓存需要极高速 SRAM,也不是 NOR。

Q2. NAND Flash 以什么为最小单位进行读和编程?

单选题 · easy

  • A.字节
  • B.页← 正确答案
  • C.块
  • D.整片

答案:B。NAND 为了高密度,不给每个字节单独引出地址线,读和编程的最小单位是页;擦除的最小单位是块。字节寻址是 NOR 的特点,整片擦除一般不是正常操作单位。

Q3. TLC 存储单元将电压大致划分为几个档位?

单选题 · easy

  • A.2 档
  • B.4 档
  • C.8 档← 正确答案
  • D.16 档

答案:C。TLC 每单元存 3 比特,2 的 3 次方等于 8,所以需要 8 个电压档位。SLC 是 2 档,MLC 是 4 档,QLC 才是 16 档。

Q4. eMMC 相对裸 NAND 最重要的改进是什么?

单选题 · mid

  • A.内置控制器做坏块磨损管理← 正确答案
  • B.把接口改成串行差分
  • C.让存储单元支持全双工
  • D.不需要擦除就能覆盖写入

答案:A。eMMC 把 NAND 和控制器封装在一起,由控制器统一处理坏块、磨损均衡、ECC 等复杂逻辑,用户拿到的是一块“省心”的嵌入式存储。串行差分、全双工是 UFS 的特性;Flash 仍然不能覆盖写。

Q5. UFS 使用命令队列带来的直接好处是什么?

单选题 · mid

  • A.同时处理多个读写命令降低延迟← 正确答案
  • B.增大每个存储单元的电平档位
  • C.支持随机字节读取和XIP执行
  • D.使NOR也可以大容量存储

答案:A。命令队列让控制器一次性接收多个命令并优化执行顺序,多个读写请求可以并发处理,从而降低延迟、提升吞吐。电平档位由单元类型决定,随机字节读取和 XIP 是 NOR 特性,与 UFS 命令队列无关。

Q6. 一块 UFS 芯片有 2 条 Lane,每条 Lane 速率 2.4Gbps,有效载荷率 80%,且支持全双工,理论总带宽约为多少?

单选题 · single

  • A.7.68Gbps← 正确答案
  • B.3.84Gbps
  • C.9.60Gbps
  • D.4.80Gbps

答案:A。全双工表示收发两个方向同时工作,所以先算 2 个方向乘以 2 条 Lane 再乘以 2.4Gbps 得到 9.6Gbps;再乘 80% 有效载荷,得到 7.68Gbps。B 少算了全双工,C 是未扣除协议开销的物理带宽,D 既没算全双工也没按有效载荷修正。

Q7. 磨损均衡(Wear Leveling)的主要目的是什么?

单选题 · mid

  • A.让各块擦写次数接近延长寿命← 正确答案
  • B.把电压细分成更多档位
  • C.提高NOR随机读取速度
  • D.减少UFS的Lane数量

答案:A。如果频繁写同一个块,它会很快达到 P/E cycle 上限;磨损均衡会把写操作分散到整个 NAND 的各个块上,让寿命更均匀。电压档位和 Lane 数量由颗粒工艺与接口标准决定,与磨损均衡无关。

Q8. 以下哪些是 NOR Flash 的特点?

多选题 · mid

  • A.支持随机字节读取← 正确答案
  • B.容量密度通常低于NAND← 正确答案
  • C.写入和擦除速度慢← 正确答案
  • D.常用于大数据量视频存储

答案:ABC。NOR 有独立地址译码,可以随机读字节;单元面积大,容量密度低;写入和擦除需要高压且按块清场,速度慢。大数据量视频存储需要高密度 NAND,而不是 NOR。

Q9. 以下哪些属于 UFS 相对 eMMC 的架构优势?

多选题 · hard

  • A.串行高速Lane← 正确答案
  • B.全双工同时收发← 正确答案
  • C.支持命令队列← 正确答案
  • D.8位并行总线更宽

答案:ABC。UFS 用串行高速 Lane 替代并行总线,支持全双工和命令队列,因此性能更强。eMMC 的 8 位并行总线是它自己的接口特点,并非 UFS 的优势。

Q10. 在给视频监控设备做存储选型时,选择 NAND/eMMC/UFS 而不是 NOR 的原因包括哪些?

多选题 · extreme

  • A.容量密度更高← 正确答案
  • B.单位容量成本更低← 正确答案
  • C.按页读写适合大块数据← 正确答案
  • D.支持字节级随机访问

答案:ABC。监控视频是大块连续数据,NAND 按页读写、块擦除的结构适合这类负载,并且容量密度高、单位成本低。NOR 支持字节级随机访问,但容量小、成本高,适合放固件而不适合放下几个月的视频。