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

来源:互联网 发布:滨州行知中学 听风 编辑:程序博客网 时间:2024/06/07 19:46

这是我准备的一个讲解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倍的使用寿命。

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在酒店如果遇到客人偷东西怎么办 梦见家里有不好的东西怎么办 被小孩要破了怎么办啊 租一个房子小孩一进房就哭怎么办 墙缝里有蝙蝠窝怎么办 小蝙蝠在墙缝里怎么办 小孩一进屋就哭怎么办 屋门对着厕所门怎么办 入室门对厨房门怎么办 厕所正对入户门怎么办 小区楼交错冲路怎么办 床的位置在五鬼上怎么办 被甩了很痛苦怎么办 和对象想分手了怎么办 对象想跟你啪啪怎么办 相亲对象好像不太想理我怎么办 想跟对象分手了怎么办 异地恋分手后该怎么办 面膜敷了一晚上怎么办 梦见被刺猬咬了怎么办 梦见死人叫我名字答应怎么办 香瓜苗叶子长斑怎么办 奶油打出来很稀怎么办 寄的水果压坏了怎么办 吃了一个烂水果怎么办 孕期吃了烂水果怎么办 邮快递水果坏了怎么办 快递寄水果坏了怎么办 闲鱼买家拒收水果怎么办 洗澡桶里有很多老鼠屎怎么办? 塑料和金属断了怎么办 孕妇吃了沙拉酱怎么办 孕妇淀粉吃多了怎么办 怀孕初期吃了杏怎么办 如果睡觉吃梨了怎么办 怀孕6个月有点贫血怎么办 怀孕八个多月有点贫血怎么办 生完小孩身体虚怎么办 孩子咳嗽厉害怎么办吃什么药 新生儿三天不拉大便怎么办 胃吃的变大了怎么办