flash名称由来
Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次性地将一个block,常见的块的大小是128KB/256KB。。,全部擦除为1,也就是里面的内容全部都是0xFF了,由于是一下子就擦除了,相对来说,擦除用的时间很短,可以用一闪而过来形容,所以,叫做Flash Memory。中文有的翻译为 (快速)闪存。
SPI NAND/nor flash
SPI,是英语serial peripheral interface的缩写,即串行外围设备接口。
NAND并不是缩写,它的名称来源于"NOT-AND”逻辑门。NAND闪存是一种非易失性(Non-Volatile Memory)存储器技术。
NORFlash中的Nor是Not OR(或非门)的缩写,其中的OR指逻辑中的或门。
或门是输入中只要有1,输入就为1;只有输入全部为0时,输出才为0;
或非门在或门的结果基础上取反,就是:输入中只要有1,输入就为0,只有输入全部为0时,输出才为1。
SPI NOR flash的优点:快速启动,适用于实时性要求高的应用;低功耗,适用于电池驱动和功耗敏感的设备。较长的寿命,适用于需要频繁读写的场景。缺点是:存储容量较小,性价比不如SPI NAND Flash
SPI NAND flash的优点:较大的存储容量,相对较低的成本。缺点是:速度较慢,不适合高速读取。
Nor闪存的读取操作是通过直接访问存储单元的地址来完成的,类似于访问传统的存储器。这使得Nor闪存可以实现快速的随机读取,适合于需要快速响应时间和执行代码的应用。然后Nor闪存的写入速度较慢,且擦除操作需要读整个块进行,导致写入和擦除的效率较低。
NAND闪存采用了更复杂的毒气和写入算法。这些技术能够在一定程度上提高数据的可靠性和存储效率。然后NAND闪存的读取速度较Nor闪存慢,尤其是随机读取的性能较差。但是NAND闪存的写入速度相对较快,且擦除操作可以针对单个块进行,使得写入和擦除的效率得到改善。
下面是一款flash的规格说明:
一个nand flash由很多个块(Block)组成,块的大小一般是128KB,256KB,512KB,此处是128KB。
每个块里面又包含了很多页(page)。每个页的大小,对于现在常见的nand flash多数是2KB,更新的nand flash是4KB,这类的,页大小大于2KB的nand flash,被称作big block,对应的发读写命令地址,一共5个周期(cycle),而老的nand flash,页大小是256B,512B,这类的nand flash被称作small block。
一片Nand flash为一个设备(device)
1 (Device) = xxxx (Blocks)
1 (Block) = xxxx (Pages)
1(Page) =528 (Bytes) = 数据块大小(512Bytes) + OOB 块大小
也就是说一个page由有效数据区+OOB(又称为spare区)组成。
关于OOB区,是每个Page都有的。Page大小是512字节的NAND每页分配16字节的OOB;如果NAND物理上是2K的Page,则每个Page分配64字节的OOB。
我们通常计算nand flash容量大小为:总共的block数 * 一个block中的page数 * 一个page中的有效数据区。oob区为特殊数据,用作硬件纠错和坏块管理的。
但是我们通常说的128M的flash,128M中是包含OOB数据区的,也就是说实际有效的数据存储区只有124M多。(128*2048/(2048+64) =124.12M)
OOB是用来干啥的?
坏块是指在nand flash中出现某些flash区域不能进行擦写操作,我们称这样的一个单位区域为一个坏块。而由于nand flash中的读和写操作是以page为单位,擦除是以block为单位,且写操作之前必须要先进行擦除操作,因此,一个最小的可操作单位即为一个block, 整个block中产生任何不可修复的位错误,我们就认为这个块是坏块。
坏块标志
spare area的第6个byte是否是0xff,如果是则表示是好块,否则为坏块。
NAND Flash出厂时在spare area中已经反映出了坏块信息,因此, 如果在擦除一个块之前,一定要先check一下第一页的spare area的第6个byte是否是0xff,如果是就证明这是一个好块,可以擦除;如果是非0xff,那么就不能擦除,以免将坏块标记擦掉。 当然,这样处理可能会犯一个错误―――“错杀伪坏块”,因为在芯片操作过程中可能由于 电压不稳定等偶然因素会造成NAND操作的错误。但是,为了数据的可靠性及软件设计的简单化,还是需要遵照这个标准。
为何Nand Flash不能从0变成1
对于nand Flash的数据的写入1,就是控制External Gate去充电,使得存储的电荷够多,超过阈值Vth,就表示1了。而对于写入0,就是将其放电,电荷减少到小于Vth,就表示0了。
我的理解是,物理上来说,是可以实现每一位的,从0变成1的,但是实际上,对于实际的物理实现,出于效率的考虑,如果对于,每一个存储单元都能单独控制,即,0变成1就是对每一个存储单元单独去充电,所需要的硬件实现就很复杂和昂贵,同时,所进行对块擦除的操作,也就无法实现之前的,一闪而过的速度了,也就失去了Flash的众多特性了。
flash的最小单位
块是Nand Flash的擦除操作的基本/最小单位。
页是Nand Flash的写入操作的基本/最小的单位。
每一个页,对应还有一块区域,叫做空闲区域(spare area)/冗余区域(redundant area),而Linux系统中,一般叫做OOB(Out Of Band),这个区域,是最初基于Nand Flash的硬件特性:数据在读写时候相对容易错误,所以为了保证数据的正确性,必须要有对应的检测和纠错机制,此机制被叫做EDC(Error Detection Code)/ECC(Error Code Correction, 或者 Error Checking and Correcting),所以设计了多余的区域,用于放置数据的校验值。
一般设备,比如硬盘/内存,读取和写入都是以bit位为单位,读取一个bit的值,将某个值写入对应的地址的位,都是可以按位操作的。
但是Flash由于物理特性,使得内部存储的数据,只能从1变成0,这点,可以从前面的内部实现机制了解到,只是方便统一充电,不方便单独的存储单元去放电,所以才说,只能从1变成0,也就是释放电荷。
所以,总结一下Flash的特殊性如下:
BBT
可以用BBT:bad block table (坏块表),即坏块表来进行管理。各家对nand的坏块管理方法都有差异。
比如专门用nand做存储的,会把bbt放到block0,因为第0块一定是好的块。
但是如果nand本身被用来boot,那么第0块就要存放程序,不能放bbt了。 有的把bbt放到最后一块,当然,这一块坚决不能为坏块。 bbt的大小跟nand大小有关,nand越大,需要的bbt也就越大。
OOB是每个页(512~2048字节不等)都有的数据,里面存的有ECC(当然不仅仅ECC,还有坏块标记);
针对每个BLOCK的坏块识别则是该块第一页spare area的第六个字节。
BBT(坏块表)是一个FLASH才有一个;
EMMC
嵌入式多媒体卡,集成度高,包含控制器和存储芯片,简化设计,较大的存储容量,适用于大型数据存储需求。缺点是相对较高的功耗和复杂性,有限的擦鞋寿命,不使用于高写入频率的应用。
SLC NAND Flash
SLC = Single-Level Cell,即1 bit per cell,1个存储器储存单元可存放1 bit的数据,只存在0和1两个充电值。以此类推,TLC = Triple-Level Cell,即3 bit per cell,1个存储器储存单元可存放3 bit的数据。