闪存

本来看华为新弄了 FS 和编译器,想学习下。但是目前似乎放出来的技术资料并不多,就先做下技术储备。先研究下他们做这个优化的历史背景。一路看下来发现链路太长,EXT4、更早的文件系统、最后到了闪存。
大学课堂上学过,但到现在真要考我,估计也说不出个所以然,所以先记录下闪存相关的笔记。

基本定义#

ROM 的一种,虽然看着是read only,但是闪存属于的细分类别已经可以允许重写数据(EEPROM)。比较接近的两种细分类别对比来看:

  • EPROM: 需要用紫外线照射才能重写数据(注定要被淘汰的技术)
  • EEPROM: 多的一个E便是Electrically,可以用电擦除数据

自然 EEPROM 的应用更加广泛。目前手机上的存储主要就是闪存(EEPROM)。闪存用于手机等移动设备的一些原因如下:

  1. 动态抗震性好(没有机械部件)
  2. 极端环境下也比较可靠(手机三防)
  3. 在擦除数据时比一般的 EEPROM 效率更高(区块对字节)

NOR / NAND#

两种 flash 的类型,直接上一个比较简单的表格对比:

NOR NAND
抹写速度
抹写次数 高 (10x)
存取方式 随机 区块
成本
面积
适用场景 微处理器 普通存储
实际使用 BIOS/机顶盒 U 盘/SSD

写/擦除#

这也是一个容易忽略但是细究起来很容易让人迷惑的东西。为什么闪存有擦除的概念?
简单来讲,由于闪存特殊的物理构造,可以理解为操作只能写入0,擦除操作相当于写入1手机闪存和固态硬盘为什么擦除多了会损坏?这篇文章提供了具体的电路图示意:

这个是写操作,控制栅加正电压,将电子(带负电)吸入浮动栅。在此后,由于浮动栅上下的二氧化硅材料并不导电,这些电子被囚禁(Trap)在浮动栅之中,出不去了。这样无论今后控制栅电压有否,这个状态都会保持下去,所以闪存可以掉电保存数据。注意写操作完毕后,该闪存单元存储的是 0。


这个是擦除操作。在源极加正电压利用浮空栅与漏极之间的隧道效应,将注入到浮空栅的负电荷吸引到源极,排空浮动栅的电子。这时读取的状态是 1。

具体为什么分别对应于 0/1 以及读取的逻辑,可参考链接的文章,这里不再赘述。这里重点要说下擦除的逻辑,理论上来说,闪存可以每个单元来单独擦除和编程。但是为了节省成本,实际上作用在控制栅上的擦除电压是整个块(Block)连接在一起的,所以实际的擦除要以块为单位了。这里出现了一种不对称:可以单一字节的方式读或写入,但是擦除一定是一整个区块。
举个例子,有一小区块的值已抹除为 1111,然后写入 1110 的消息。接下来这个区块还可以依序写入 1010、0010,最后则是 0000。不能说从 0010 直接写为 0011 了,必须整个擦除为 1111 之后重写。实际上很少有算法可以从这种连续写入兼容性得到好处,一般来说还是整块抹除再重写。

这个限制也会极大地影响闪存之上的文件系统的设计。

eMMC / UFS#

华为 P10 将这两个东西带到大众视野面前。可以说 UFS/eMMC 是一种内嵌式存储器的标准规格(基于闪存介质的基础上集成主控芯片,而且拥有标准接口)

还是表格对比

eMMC UFS
全拼 embedded MultiMedia Card Universal Flash Storage
读写速度 50MB/S - 600MB/S 780MB/S - 1.5GB/S
价格(仅作对比) 67 - 145RMB 285RMB
工作模式 半双工 全双工模式

Links#

  1. 维基百科:闪存
  2. 杂谈闪存二:NOR 和 NAND Flash
  3. 有关手机闪存类型的一些知识
  4. UFS 与 eMMC 到底是啥?3 分钟带你看懂它们的秘密
  5. 浅谈 SSD,eMMC,UFS
  6. 手机闪存和固态硬盘为什么擦除多了会损坏?