【详解】Nand Flash 必看知识1
常见缩略词
- BBM (BBM):Bad Block Management 坏块管理
- BBT (BBT):Bad Block Table 坏块表
- ECC (ECC):Error Correction Code 错误校验码
- E2PROM/EEPROM (EEPROM):Electrically Erasable Programmable Read-Only Memory:电可擦只读存储器
- MLC (MLC):Multi Level Cell 多层单元
- MOSFET (MOSFET):Metal-Oxide–Semiconductor Field Effect Transistor 金属氧化物半导体场效应晶体管
- MTD (MTD):Memory Technology Device 内存技术设备
- NVM (NVM):Non-Volatile Memory
- NDA (NDA):None-Disclosure Agreement 非公开协议,保密协议
- OTP (OTP):One Time Programmable 一次性可编程(存储器)
- SLC (SLC):Single Level Cell 单层单元,单层式存储
1. 名词解释
1.1 Non-Volatile Memory (非易失性存储器)
NVM,即 NV (RAM)Memory,断电数据也不会丢失的存储器,比如 Nand Flash,Nor Flash,硬盘等等。于此相对的是,断电了数据会丢失的存储器,比如 DRAM 等。
1.2 OTP 一次性可编程存储器
OTP,一种非易失性存储器,但是只允许一次性写入数据,写入(或称烧写)数据之后,就不能修改了。
OTP的好处或者说用途是,常用于写入一些和芯片相关的一些特定数据,用于加密的一些数据等。
与一次性写入数据的 OTP 相对应的是,像 Nand Flash,硬盘等存储器,可以被多次写入数据。只要硬盘这类的存储器没坏,你愿意写入几次就写入几次,而 OTP 就只能写入一次,就没法再修改里面的数据了。
1.3 NDA 保密协议
NDA,中文可以翻译为,非公开协议,保密协议。
常用于这种情况: 某家厂商的某种技术或资料,是保密的,不希望公开的。但是呢,如果你要用他家的芯片之类的东西,在开发过程中,又必须得到对应的技术和资料,才能开发产品,所以,他就会要求和你签订这样的 NDA 协议,意思就是,你可以用我的技术和资料,但是你不能公开给(我未授权的)其他人。如果非法泄露我的机密技术,那势必要走法律程序控告你之类的。
1.4 Datasheet 数据手册和 Specification 规范
- 英文 datasheet,中文一般翻译为数据手册。
- 指的是对应某个硬件,多为芯片,的功能说明,定义了如何操作该硬件,达到你要的功能,这其中主要包括芯片中的相关寄存器的定义,如何发送命令,发送什么命令,以此来操作此硬件等等。
- 英文 Specification,引文常缩写为Spec.,中文一般翻译为规范。
- 多指某个组织(盈利的或非盈利的),定义了一些规矩,如果你要用某种东西,在计算机领域,常常指的是某硬件和相关的软件协议,就要按照此规矩来操作,这个组织保证你只要实现了此规范,设备就能按照你所期望的运行,能够实现对应的功能,而你的芯片实现了此规范,就叫做,是和此规范兼容(compatible)的。
1.5 (Bad)Block Management(坏)块管理
Nand Flash 由于其物理特性,只有有限的擦写次数,超过那个次数,基本上就是坏了。在使用过程中,有些 Nand Flash的 block 会出现被用坏了,当发现了,要及时将此 block 标注为坏块,不再使用。于此相关的管理工作,属于 Nand Flash 的坏块管理的一部分工作。
1.6 Wear-Leveling 负载平衡
Nand Flash 的 block 的管理,还包括负载平衡。
正是由于 Nand Flash 的 block 都是有一定寿命限制的,所以如果你每次都往同一个 block 擦除然后写入数据,那么那个 block 就很容易被用坏了,所以我们要去管理一下,将这么多次的对同一个 block 的操作,平均分布到其他一些 block 上面,使得在 block 的使用上,相对较平均,这样相对来说,可以更能充分利用 Nand Flash。以此延长 Nand Flash 的使用寿命或者说更加充分利用 Nand Flash。
1.7 ECC 错误校验码
Nand Flash 物理特性上使得其数据读写过程中会发生一定几率的错误,所以要有个对应的错误检测和纠正的机制,于是才有此 ECC,用于数据错误的检测与纠正。Nand Flash 的 ECC。
常见的算法有 汉明码(Hamming Code)、BCH(Bose-Chaudhuri-Hocquenghem)码、RS码(Reed-Solomon Code)和LDPC码(Low-Density Parity-Check Code)。
- 汉明码(Hamming Code):
- 特点:能够纠正单比特错误,检测双比特错误。
- 使用场景:常用于早期的NAND Flash和小容量的存储器。
- 优点:实现简单,计算开销小。
- 缺点:纠错能力有限,不适用于高密度存储器。
- BCH码(Bose–Chaudhuri–Hocquenghem Code):
- 特点:能够纠正多个比特错误,灵活性强。
- 使用场景:广泛应用于现代NAND Flash存储器,尤其是MLC(多层单元)和TLC(三层单元)NAND。
- 优点:可以纠正多个随机错误,适应性强。
- 缺点:实现复杂度较高,计算开销大。
- RS码(Reed-Solomon Code):
- 特点:能够纠正突发错误,非常适合纠正连续的比特错误。
- 使用场景:主要用于NAND Flash存储器的控制器中,用于数据块级别的错误校正。
- 优点:适合纠正突发性错误,纠错能力强。
- 缺点:实现复杂度高,计算开销大。
- LDPC码(Low-Density Parity-Check Code):
- 特点:纠错能力强,接近香农极限,适合长码字。
- 使用场景:逐渐被应用于高密度和高性能的NAND Flash存储器中。
- 优点:纠错性能优越,特别适用于高数据速率和大容量存储。
- 缺点:实现复杂度高,解码算法需要较大的计算资源。
在 NAND Flash 中,选择适当的 ECC 算法主要取决于以下因素:
- 存储密度:高密度的 NAND Flash(如MLC、TLC)需要更强的纠错能力。
- 性能需求:实时性要求高的系统需要高效的ECC算法。
- 硬件资源:嵌入式系统和控制器的处理能力和存储资源限制了可用的 ECC 算法。
BCH 码和 LDPC 码是现代 NAND Flash 存储器中最常用的 ECC 算法。BCH 码因其灵活性和较强的纠错能力被广泛应用于大多数 NAND Flash,而 LDPC 码则因其优越的纠错性能逐渐在高性能存储器中占据一席之地。
这类算法的实现,可以是软件也可以是硬件。不同系统,根据自己的需求,采用对应的软件或者是硬件。
相对来说,硬件实现这类 ECC 算法,肯定要比软件速度要快,但是多加了对应的硬件部分,所以成本相对要高些。如果系统对于性能要求不是很高,那么可以采用软件实现这类 ECC 算法,但是由于增加了数据读取和写入前后要做的数据错误检测和纠错,所以性能相对要降低一些,即Nand Flash的读取和写入速度相对会有所影响。
其中,Linux 中的软件实现 ECC 算法,即 NAND_ECC_SOFT 模式,就是用的对应的汉明码。
而对于目前常见的 MLC 的 Nand Flash 来说,由于容量比较大,动辄 2GB,4GB,8GB 等,常用 BCH 算法。BCH 算法,相对来说,算法比较复杂。
笔者由于水平有限,目前仍未完全搞懂 BCH 算法的原理,所以不讲原理。
BCH 算法,通常是由对应的 Nand Flash 的 Controller 中,包含对应的硬件 BCH ECC 模块,实现了 BCH 算法,而作为软件方面,需要在读取数据后,写入数据之前,分别操作对应 BCH 相关的寄存器,设置成 BCH 模式,然后读取对应的 BCH 状态寄存器,得知是否有错误,和生成的 BCH 校验码,用于写入。
其具体代码是如何操作这些寄存器的,由于是和具体的硬件,具体的 nand flash 的 controller 不同而不同,无法用同一的代码。如果你是 nand flash 驱动开发者,自然会得到对应的起 nand flash 的 controller 部分的 datasheet,按照手册说明,去操作即可。
不过,额外说明一下的是,关于 BCH 算法,往往是要从专门的做软件算法的厂家购买的。
2. 硬件特性
2.1 什么是 Flash
Flash 全名叫做 Flash Memory,是一种数据存储设备,存储设备有很多类,Flash 属于非易失性存储设备 (Non-volatile Memory Device),与此相对应的是易失性存储设备 (Volatile Memory Device)。关于什么是非易失性/易失性,从名字中就可以看出,非易失性就是不容易丢失,数据存储在这类设备中,即使断电了,也不会丢失,这类设备,除了 Flash,还有其他比较常见的入硬盘,ROM 等,与此相对的,易失性就是断电了,数据就丢失了,比如大家常用的内存,不论是以前的 SDRAM,DDR SDRAM,还是现在的 DDR2,DDR3 等,都是断电后,数据就没了。
2.2 Flash 的硬件实现机制
Flash 的内部存储是 MOSFET,里面有个悬浮门 (Floating Gate),是真正存储数据的单元。
在 Flash 之前,紫外线可擦除 (uv-erasable) 的 EPROM,就已经采用了 Floating Gate 存储数据这一技术了。
数据在 Flash 内存单元中是以电荷 (electrical charge) 形式存储的。存储电荷的多少,取决于图中的外部门(external gate)所被施加的电压,其控制了是向存储单元中冲入电荷还是使其释放电荷。而数据的表示,以所存储的电荷的电压是否超过一个特定的阈值 Vth 来表示,因此,Flash 的存储单元的默认值,不是0(其他常见的存储设备,比如硬盘灯,默认值为0),而是1,而如果将电荷释放掉,电压降低到一定程度,表述数字0。
2.3 什么是 Nand Flash
Flash 主要分两种,Nand Flash 和 nor flash。
NAND Flash和NOR Flash是两种常见的非易失性存储器,它们在结构、性能、应用和优缺点上有明显的区别。
以下是它们的主要区别:
2.3.1 结构和存储方式
-
NAND Flash:
- 结构:由多个单元组成的串联链,每个单元与下一个单元串联,形成一个块。
- 存储方式:数据以页(page)为单位进行读取和写入,以块(block)为单位进行擦除。页通常为512字节到16KB,块由多个页组成。
- 访问方式:串行访问,读取和写入速度较快。
-
NOR Flash:
- 结构:每个存储单元直接与位线相连,形成一个类似于传统内存的阵列。
- 存储方式:数据可以随机读取和写入,类似于RAM的访问方式。
- 访问方式:并行访问,具有较快的读取速度。
2.3.2 性能
-
NAND Flash:
- 读取速度:相对较慢,适用于顺序读取。
- 写入速度:较快,适合大容量数据写入。
- 擦除速度:较慢,以块为单位进行擦除。
-
NOR Flash:
- 读取速度:较快,适合随机读取。
- 写入速度:较慢,特别是对单个字节的写入。
- 擦除速度:较慢,以扇区(sector)为单位进行擦除。
2.3.3 存储密度和成本
-
NAND Flash:
- 存储密度:较高,适合大容量存储应用。
- 成本:较低,每单位存储容量的成本更低。
-
NOR Flash:
- 存储密度:较低,适合小容量存储应用。
- 成本:较高,每单位存储容量的成本更高。
2.3.4 应用场景
-
NAND Flash:
- 适用场景:大容量数据存储,如固态硬盘(SSD)、USB闪存盘、存储卡和嵌入式存储设备。
- 优点:适合顺序存储和大容量数据存储,成本较低。
-
NOR Flash:
- 适用场景:需要快速随机读取的小容量存储应用,如固件存储、代码执行存储器(如微控制器的程序存储)和嵌入式系统启动代码。
- 优点:适合快速随机读取,读取速度较快。
2.3.5 优缺点总结
-
NAND Flash:
- 优点:存储密度高、成本低、适合大容量数据存储和写入。
- 缺点:随机读取速度较慢,数据可靠性稍低,需要额外的ECC(错误校验码)来确保数据完整性。
-
NOR Flash:
- 优点:读取速度快、适合随机读取和小容量存储。
- 缺点:存储密度低、成本高、写入速度较慢,特别是对单个字节的写入。
所以,一个常见的应用组合就是,用小容量的 Nor Flash 存储启动代码,比如 uboot,用大容量的 Nand Flash 做整个系统和用户数据的存储。
而一般的嵌入式平台的启动流程也就是,系统从装有启动代码的 Nor Flash 启动后,初始化对应的硬件,包括 SDRAM等,然后将 Nand Flash 上的 Linux 内核读取到内存中,做好该做的事情后,就跳转到 SDRAM 中去执行内核了,然后内核解压(如果是压缩内核的话,否则就直接运行了)后,开始运行,在 Linux 内核启动最后,去 Nand Flash 上,挂载根文件,比如 jffs2,yaffs2 等,挂载完成,运行初始化脚本,启动 consle 交互,才允许你通过 console 和内核交互。至此完成整个系统启动过程。
而 Nor Flash 就分别存放的是 Uboot,Nand Flash 存放的是 Linux 的内核镜像和根文件系统,以及余下的空间分成一个数据区。
2.4 Nand Flash 的详细分类
Nand Flash,按照硬件类型,可以分为:
- Bare NAND chips: 裸片。单独的 Nand Flash 芯片。
- SmartMediaCards: 裸片+一层薄塑料。常用于数码相机和 MP3 播放器中。之所以称 smart,是由于其软件smart,而不是硬件本身有啥 smart 之处。
- DiskOnChip: 裸片+glue logic。glue logic = 硬件ECC产生器+用于静态的 nand 芯片控制的寄存器+直接访问一小片地址窗口,那块地址中包含了引导代码的 stub 桩,其可以从 Nand Flash 中拷贝真正的引导代码。