Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1257550
  • 博文数量: 254
  • 博客积分: 1586
  • 博客等级: 上尉
  • 技术积分: 2295
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-15 16:38
个人简介

linux学习中

文章分类

全部博文(254)

文章存档

2016年(6)

2015年(2)

2014年(74)

2013年(93)

2012年(12)

2011年(2)

2010年(51)

2009年(14)

分类: 嵌入式

2014-08-20 13:48:18

基于Flash的存储卡,USB存储,还有SSD都是最典型的基于NAND的电子系统。
    几种典型的存储卡由于应用于不同的应用设备,所有有着不同的接口和标准。例如:手机需要非常小的尺寸
的存储设备比如micro SD;另外一些如数码相机等设备对尺寸要求不高,但是对容量要求更高,所有在这些设备
上用的是CF卡,SD卡,MMC卡。图2.31展示了不同类型的Flash卡。

[NAND]基于NAND的系统介绍


    Flash 卡的接口支持很多种协议:并行/串行、同步/异步。另外,Flash卡也支持热拔插,但是要支持这个
功能就必须要求主控端能够有能力去对突然掉电引起的数据异常进行处理的能力。
    另外一些需要注意的因素,比如存储卡必须是完整的,一个小的系统他的每一个部分都会被焊接在PCB上并
独立封装,比如NAND芯片一般都是TSOP的封装格式。除此之外,需要考虑的因素还有:例如为了内部电压的驱动
或者是为了让内部晶振能够有更准确的精度(一些Flash卡可以工作在5V或者3.3V的工作电压),通常需要一个
外部的DC-DC转换器。
    通常我们会用一个滤波电容来对供电进行稳定。处于同样的考虑我们在SSD上也会这样用到,指示和Flash卡
最大的区别就在于系统的容量问题(见图2.32),多块NAND通过不同的通道工作以此来提高效能。
    对于像Micro SD这样较小的设备,卡的大小基本就和NAND flash本身的大小差不多了。因此,存储芯片基本
就是直接加载到最底面;除此之外,由于一个存储卡可能含有多个芯片,而芯片的空间摆放架构又是通过堆叠
起来的,所以芯片的厚度也会被严格要求以满足micro SD卡的厚度要求。

[NAND]基于NAND的系统介绍

[NAND]基于NAND的系统介绍


    所有的这些问题就导致了对存储卡的容量有一个很严格的限制。除了外部因素,还有一些内部因素:比如
电压管理和晶振也不能放在存储卡里面;换句话说就是存储卡的控制器必须要有这些方面的能力。
    由于有这么多东西都要集中在较小的尺寸里面,所以就对整个资源的集合有一个相当高的要求,因此,在
产品生产的最后阶段有一个系统测试,这个测试会对这些功能进行测试,并且这个测试的成本也会较高。
    对于存储卡的更详细的描述,以后在介绍SSD的时候会更详细的介绍到。
    图2.33展示了一个典型的存储卡或者是SSD的结构图:两个主要的部分-存储器控制器和存储介质。或许真
正实际上各个厂家的存储器的结构可能又和这个图有一些区别,但是一些功能基本是一致的。下面就来介绍一下
这些功能。

 

存储器控制器
    存储器的控制器的作用主要有两个:
 1、在主控端和存储介质之间提供最合适的接口及协议。
 2、为了更有效地处理数据、提供更快的传输速度、数据和资源的整合和保存。
    为了能够完成上面说的这些任务,特定设备在设计的时候会嵌入一个标准的处理器(通常是8-16位的)这样
就可以和硬件配合及时地处理任务。
    为了更方便地介绍一下控制器,我们在这里会把他分为四个部分,这四个部分要么是硬件要么是软件。从主控
到NAND我们看见的第一部分是主控接口:这个接口要以一种工业标准接口协议(MMC、SD、CF等等)来进行操作,
因此用以来保证存储卡和主控端之间的逻辑和工作的协同。这一部分是一个硬件的集合:缓存、驱动等等;另外
软件方面处理器可以做命令解码,解码从主控端发过来的命令并处理传入或是传出NAND的数据流。
    第二部分是Flash文件系统(FFS):这个文件系统是用来开启对存储卡、SSD、U盘等设备的使用。例如,
进行顺序读写操作的时候需要对大量的子块进行寻址,而这些子块就组成了一个文件,这些子块是被一个连接表
(链接表本身也存放在Flash当中)来进行链接对应的,主控端就是通过链接表来建立了File Allocation Table
(FAT)。
    FFS通常是以在控制器中的软件的形式来进行操作的,每一个子层所能完成的功能是不一样的。最主要的有
以下这些: Wear leveling Management,Garbage Collection和Bad Block Management。对于所有的这些功能,
连接表是被大量运用的,以此来将逻辑页和物理页的对应(Flash Translation Layer[FTL]),如图2.34
    block的高位行序列可以被看做是存储器的逻辑序列,低位行序列则是物理序列。从主控端的角度来看,
数据是明显地被写在一个给定的逻辑单元上,由于Flash的限制,在同一个页上面要多写内容是不可能的,因此
一个新的页必须被分配给一个物理的块并将之前的那个标记为无效。这样就比较清楚了:在同一个地方如果当前
的物理块满了那么就会有另外一个块(缓存)被分配给同一个逻辑块。
    这个必须的逻辑与物理的转换对照表是被存储在Flash本身里面,因此这也会降低整个Flash给客户的总的
使用容量。

[NAND]基于NAND的系统介绍

 

Wear Leveling
    通常情况下,不是所有的存储在Flash中的信息都会随着时钟脉冲取进行改变:一些数据会需要经常更新
而另外一些数据则需要保留非常长的一段时间。所以说那些存储着经常需要更新的数据的块肯定是要进行大量的
写/擦除操作;而那些存储着很少需要更新的数据的块则很少进行写/擦除这样的操作。
    为了减少干扰,保持每一个页/块的寿命尽可能一致并长久是很重要的:所以对每个页进行读和写的次数一
定要对应调整。另外,一个块能允许 进行写/擦除的操作也是有限制的:以SLC NAND为例,可进行写/擦除的
次数就是最多10万次,而MLC则最多只能是1万次。
    Wear Leveling技术依赖于物理地址和逻辑地址的对应:每一次主控端需要去升级同一个逻辑单元,存储器
的控制器就会动态地区将这个要进行更新的单元对应到一个个不同的物理单元上去,同时还要保证对特定链接
表或是指针的跟踪。对于以前旧式的单元拷贝是会被标记为能和不能进行擦除。用这样的方式,所有的物理单元
就会被渐渐地用到,这样就可以将各单元的寿命保持在一个合理的值。
    有两种可能的方式:一种是动态Wear levevling,他是被正常地使用来执行用户对于更新一个单元的请求。
另一种就是静态Wear Leveling,一旦他的寿命和平均值不同,他就能够被执行合适的重新进行的链接,不管是哪
一个单元,即使是最近才更新过的。
   
Garbage Collection
    两种wear leveling技术(动态,静态)都依赖于能够进行数据更新的存储单元的可用性:一旦可用的存储
单元数量降低到一个阀值以下,存储单元就会被重新整理,比如数据压缩,删除复制文件等等。这些操作都是由
Garbage Collection模块来执行的,如图2.35所示,他会去挑选一些block,这些block包含了无效的存储单元,
将最近的有效数据进行拷贝并且放入到可用的存储单元中去,然后再擦除这个block。
    为了将对效能的影响降到最低,garbage collection能够进行后台运行。由wear leveling对各个存储单元
进行平衡化配置以免由于对某些单元使用过多而造成损坏。因此,容量越大的存储器,每一个存储单元损耗的
概率就越低。
[NAND]基于NAND的系统介绍


Bad block management
    不管wear leveling的算法有多智能,由于NAND本身的材质的一些限制,NAND的存储单元会出现一些叫做
坏块的block:例如有些block包含了一个或者多个稳定性已经不能得到保证的存储单元。
    坏块管理(BBM)模块会去建立并一直维持一张坏块表,如图2.36所示:这个坏块表是在工厂对存储器进行
初始化的时候生成的,因此这个表会包含在工厂测试中已经产生的坏块的列表。然后在存储器之后的整个生命
周期只要产生了坏块都会在这个表进行标示。

[NAND]基于NAND的系统介绍

ECC
    ECC是一个典型的由存储器控制器中的特定硬件来执行的任务。大多数现在流行的ECC代码(Reed-Solomon和
BCH[12])可以纠正多个错误。编码会占据控制器的多个时钟周期,而解码则会占据更多的时钟周期。所以可以
很明显地看到读数据的效能有降低,同时随机寻址的的反应时间也有所降低。
    有如下几个原因可能导致读操作失败(一定的概率):
 1、噪音(例如供电噪音)
 2、Vth混乱(如相邻的存储单元的读写)
 3、数据保持力(渗透问题)
    在修正之后的允许的读失败的概率依赖于对整个设备的使用情况。一些价格敏感并且在整个生命周期中都
很少去进行读操作的电子消费品就可以接受一个高概率的读失败操作,而一些高端产品或是一些需要经常进行
读操作的产品则要求这个概率要较低。其实真正对这个要求较高的设备会是CPU的缓存模块。
    一个存储器能够提供的可靠性是它的材质固有的出错概率。这个出错概率不可能如用户所想要的那样。通过
ECC我们就可以尽量地来降低这个概率以满足用户需要。
    这个错误校正理论的目的是对传输的东西增加一些多余项;比如读的时候可能会检测到错误并去修复那些
最有可能进行传输的信息。
    在读的过程中,用作数据存储目的的错误校验有多种方式。块代码的错误校验是被用在“子块”中存储的
数据。依赖于已经使用过的错误校验,由于不同多余项有不同的位数,所以不同的多余项就需要不同的平衡位。
    在长度为n的代码字与信息位数的k值还有校验错误的t值之间有一个公式存在,如下所示:我们可以用下面
这个公式来计算平衡位的最小的数目。

[NAND]基于NAND的系统介绍

    平衡位的数目并不会经常达到最小值,一个好的代码的平衡为必须尽可能地去接近这个值。另一个方面,
“子块”的大小越大,相对应的spare area就会越小。因此,也就会影响到Flash整个的die的大小。
    BCH和Reed-Solomon代码有着类似的结构,但是BCH代码要求更少的平衡位;这也是我们在为NAND选择结构的
时候更倾向于BCH.

阅读(1143) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~