碧波液压网 欢迎你,游客。 登录 注册

嵌入式Linux下NAND存储系统的设计与实现

版权信息:站内文章仅供学习与参考,如触及到您的版权信息,请与本站联系。

  引言

  NAND和NOR是现在市场上两种主要的非易失闪存技术。相对于NOR 而言,NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除速度很快,同时,NAND闪存的成本要低于NOR 闪存。因此尽管NAND的接口特殊,管理复杂,读取速度不及NOR,但是从性价比出发,NAND闪存逐渐成为嵌入式系统的首选存储设备。

  NAND闪存具有以下特点:NAND器件是基于I/O接口的(NOR闪存是基于Bus的RAM接口),以页为单位读写,以块为单位擦除。NAND芯片通过多个引脚传送命令、地址和数据,使用较复杂的I/O接口来控制,同时,根据NAND规范,NAND闪存中允许存在坏块。NAND闪存的每一页都有8B(页长度256B)或者16B(页长度为512B)的OOB(Out Of Band)数据区,用来存放ECC(Error Checking &Correction)、ECC有效标志、坏块标志等。所有这些决定了基于NAND的存储系统设计需要处理不同于其它类型闪存的特有问题。

  MTD 结构和NAND驱动接口

  Linux上设计了MTD子系统为闪存类型的设备向上层提供统一接口。MTD的主要目的是实现子系统公用部分,使新的存储设备的驱动设计更加简单。一个MTD设备按照用户访问的顺序可以得到图1 所示的层次结构。图1中NAND特定硬件驱动层为具体NAND设备的驱动,实现特定硬件的具体操作;NAND通用驱动层是所有NAND设备的公用部分,实现了NAND设备发现、通用NAND读写等操作;MTD 原始设备层是MTD原始设备的通用代码,此外还包括各个特定的闪存设备所注册的数据,例如NAND分区等。MTD向上提供块设备和字符设备两种接口。文件系统通过MTD 块设备接口访问NAND闪存驱动。  

  图1 Linux MTD 的层次结构

  具体的NAND闪存驱动是和NAND通用驱动相关联的,要实现一个NAND闪存硬件驱动,需要实现以下部分:初始化函数,硬件相关的设备就绪函数和控制函数,为了灵活起见,还可以实现硬件相关的命令函数、硬件相关的等待函数和硬件ECC函数。

  NAND设备驱动初始化时分配必要的内存,设置IO地址,然后利用NAND通用驱动提供的设施,调用nand_scan来完成通用部分的设置,最后定义闪存分区并在MTD中注册来完成初始化。可以通过Linux 内核中的实例了解NAND驱动的结构和NAND特性相关的问题

  NAND闪存具有其它类型的闪存所不具有的特性,因此基于NAND的存储设计需要考虑这些问题。NAND闪存的正确、高效使用取决于以下问题的正确解决。

  坏块问题

  NAND闪存定位为一种低成本存储介质,从成本和技术上综合考虑,NAND闪存允许存在一定比例的坏块。坏块的产生有多种原因,如解码失败,地址线错误,存储单元错误等,出品前厂商经过测试,将确认的坏块标记出来。同时,因为NAND闪存的擦写寿命有限(一般在105-106次),当使用到一定时限后也会产生坏块, 这些坏块通过擦除和写入后的状态来判断,产生擦除或写入失败的块应该认为已经损坏,并由文件系统或者其它管理程序标记出来。

你没有登陆,无法阅读全文内容

您需要 登录 才可以查看,没有帐号? 立即注册

标签:
点赞   收藏

相关文章

发表评论

请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。

用户名: 验证码:

最新评论