MTD(1)---nand flash的基本知识

这是我准备的一个讲解MTD子系统的一个文档,我是以DM368 EVM板子的kernel 2.6.32.17为样本代码来讲述的,各位最好准备3样东西再开始阅读我的文档。

1DM368的芯片手册 sprufg5_TMS320DM36xDMSoC ARM Subsystem Reference Guide.pdf

2kernel 2.6.32.17的源码

3、一份nand flash的硬件手册,最好是2KB page的,如K9K8G08U0A.pdf

如果没有我选用的芯片类型和kernel版本,也没有关系,大的架构是一样的,各位可以举一反三。

 

MTD是一个很大的子系统,我的思路是从下向上,理出一条线来,让大家理解Linux kernel是如果管理flash设备的,上层的文件系统和应用程序是如何操作flash的。

 

首先概述下flash吧。

在10年前的历史上,嵌入式设备上常用的flash有2种NOR flash和NAND flash,工作原理请自行参考网络资料,他们各有特点,有些设备甚至同时使用nor和nand 两种flash。

http://www2.electronicproducts.com/NAND_vs_NOR_flash_technology-article-FEBMSY1-feb2002-html.aspx

http://www.cnblogs.com/lidp/archive/2010/02/25/1696458.html

 

NOR-NAND comparison

 

PARAMETER

NOR

NAND

Capacity

1 to 16 Mbytes

8 to 128 Mbytes

XIP (code execution)

Yes

No

Performance Erase
  Write
  Read

Very Slow (5 s)
  Slow
  Fast

Fast (3 ms)
  Fast
  Fast

Strengths

Addressable to every byte

More than 10% higher life  expectancy

Erase cycle range

10,000 to 100,000

100,000 to1,000,000

Interface

SRAM-like, memory mapped

Accessed in bursts of 512  bytes; I/O mapped

Access method

Random

Sequential

Price

High

Very  low

简单来说,可以总结为上表。

 

从历史的发展情况来看,目前大多数运行Linux的嵌入式系统都选用了nand flash,因为nand flash容量很大,性价比高。当然nor flash在某些产品领域中仍然有应用,这是题外话。

 

Nand flash这些年制造工艺上有了很大的进步,容量飞速增加,性价比进一步提高。

我们只需要知道U盘、SD卡、MP3、固态硬盘SSD都使用了nand flash作为存储介质,再对比下这些年这些产品的价格和容量的走势,就很容易理解nandflash的飞速发展了。

话说几年前我们常用的SD卡才512MB,到现在8GB已经标配了,真是飞跃啊,甚至有种趋势越来越明显了,nandflash会取代机械硬盘!

 

现在再介绍下nand flash的几个基本特性:

1、  数据区的逻辑组织关系Page、Block、OOB

 

K9K8G08U0A为例,看下图;

Page是最小的读写单位,Block由多个相邻Page组成,Block是最小的擦除单位,OOB也叫空闲区,用于存放每个Page的额外数据。

历史上早期容量小的nand flash,1 Page = (512+16)Bytes,1 Block = 32 Page = 16KB;

现在容量大的flash,Page都加大了,如上图,1 Page是2KB,还有4KB的Page,具体参数看flash的硬件手册。

 

1、  Nand flash的读写擦操作特性

 

Nand flash在写之前必须先进行擦除操作;

擦除是以Block为单位的,擦除后,该Block内的所有Page数据区bit均为1;

如擦除失败,需要在该Block的第一个Page的OOB中标记坏块;

 

写操作只能把Pagebit1修改为0,反之则不行;

有人可能会想,那我能不能一次只写一个Page的某些bit呢?

答案是不行,如果你非要这么做,后果自负!

 

为什么这么说?因为ECC。

如果不理会ECC,单独写某些bit,程序上是允许的,而且会激发很多的奇思妙想,也许已经有人这么干了,正在为自己的创意沾沾自喜。

但是,我希望你们能够仔细认真的阅读nand flash的硬件手册,看看手册上有没有说明可以关闭ECC。只要硬件厂家没有说明可以关闭ECC,你们就要为自己的程序提心吊胆一天。

 

为什么要用ECC?因为位反转。

http://againinput4.blog.163.com/blog/static/1727994912011885152491/

Nand Flash的位反转位翻转现象
Bit Flip/Bit Flipping/Bit-Flip/Bit twiddling of Nand Flash

Nand Flash由于本身硬件的内在特性,会导致(极其)偶尔的出现位反转的现象。
所谓的位反转,bit flip,指的是原先Nand Flash中的某个位,变化了,即要么从1变成0了,要么从0变成1了。

 

ECC的原理,可以在网上搜索,比如http://blog.cechina.cn/dAsh/93427/message.aspx

 

Nand flash的原理和制造工艺决定了位反转是不可避免的出错现象,也许工艺越来越先进,发生的几率会越来越小,但只要厂家没有公开保证已经消除了位反转,我们就必须使用ECC校验,否则程序崩溃死都不知道是怎么死的。

 

上面说了这么大一堆,就是要让我们知道,写操作必须一次写一个Page,并且将ECC校验码同步写入该Page的OOB区域。

为什么不能在已经保存了数据的page上再次写入数据?即使是把其中某些bit从1改写成0也不可以?因为ECC!你在初次写page数据的时候,就已经将对应的ECC写入OOB了,你再次修改page数据内容,它的ECC码也要重新计算,而你想再次写入新的ECC码到OOB时,它可能需要将某些bit从0改写成1,而这是flash不允许的!

 

所以,正常的读写流程是,如果要写入的page是干净的(刚擦除过,bit都为1),那么就写入完整page的数据,然后计算ECC,将ECC写入OOB;如果要写入的page已经充满了数据,那么要么重新寻找一个干净的page写新数据,要么擦除对应的block,再写入数据。

 

读取数据的流程,按规范也应该是读取完整的一个page,然后计算ECC,再跟OOB中的写时ECC码做校验,如果校验成功,读取数据成功,否则失败。

尽管flash提供了随机读取page内的任意数据的功能,但我们不应该这么做,这么做就无法使用ECC校验,一旦出现数据错误,就会引发程序崩溃等严重问题。

 

1、  Nand flash的坏块管理

 

目前nand flash还不敢承诺出厂无坏块,只能保证芯片的第一个block是好的,否则良率太低,必然导致成本大幅上升。而且随着不断擦除,使用过程中也会不断出现坏块。因此,我们必须面对坏块这个问题。

 

坏块的产生有三种情况,出厂时就有的坏块,擦除操作失败产生的坏块,写操作失败产生的坏块。

 

Nand flash每个单元的擦写次数是有限制的,一般是10万次(具体看硬件手册),但这个10万次是最大寿命呢,还是至少保证10万次擦写?没有官方的答复,总之我们要做好每次擦写动作的错误处理就好了。

 

另外一个话题就是“伪坏块”,为什么会产生伪坏块?我们在开发过程中,经常会对开发板进行一些修改调试,可能会导致擦写flash的电压不够,这时候程序上读取擦写操作的返回状态,就会得到失败的状态字,于是程序就将改块标记为坏块了。而正常的程序流程,在读到坏块标记后就会将改块跳过,不再使用,也不再去擦除它。这样就导致了伪坏块的产生,这样的伪坏块如果在正常的工作电压下进行擦除操作,通常是可以擦除成功,作为干净块使用的。

 

Kernel里面的nandflash驱动程序,为了提高效率,是不会再对标记坏块做擦除动作的,因此在linux下无法清除伪坏块,但是我们可以在uboot中彻底擦除flash,这样是可以清除伪坏块的。

 

那么如何管理flash中的坏块?

Kernel里面的MTD会管理一个BBT,就是坏块表。

 

一个高级话题,如何提高nand flash的使用寿命?

既然flash的每个单元的擦写次数是有限的,那么如果我们总是频繁的擦写flash上的某些块,而另外一些块很少被擦写,那么这些擦写频繁的块就会很快达到使用寿命成为坏块,这样的坏块多了,如果设计上没有考虑好这个问题,就会影响整个设备的使用寿命。

举个例子,我们将flash上的某个分区格式化为FAT文件系统,作为U盘来使用。FAT文件系统最大的特点就是使用2FAT表来保存整个文件系统分区的扇区使用情况,我们在U盘上进行文件的复制删除动作,文件系统读写最频繁的就是FAT表;根据前面讲述的flash的读写特性,FAT表所在的Block就会很频繁的被擦写,时间长了该块就会变成坏块,如果2FAT表所在的Block都成坏块了,FAT文件系统就无法使用了,U盘也就坏了。

当然,上面举的例子,只是为了说明坏块导致的问题,我相信任何一个生产U盘的厂家都发现了这个问题,也采取了一些措施来解决这个问题。

如何解决这个问题?均匀擦写!简单来讲,就是建立逻辑块和物理块的一个映射关系,根据某种算法,动态的将某些擦写频繁的逻辑块重新映射到不同的物理块,在这个映射过程中,会将擦写频繁的物理块与其他不常擦写的物理块做交换,比如我们对FAT表擦写了10000次,但这个过程中我们将映射表做了修改,与其他块做了10次交换,就相当于每个物理块只擦写了1000次,这样就相当于提高了10倍的使用寿命。

具体的策略如何实现,八仙过海,各有奇招。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值