NAND从物理角度看,就是一个连续存储空间,它由一系列的块(block)组成,而每个块是由一系列的页(Page)组成。
不同的NAND其页的大小可能是不一样的,例如对于SLC NAND,每页的大小为1024字节;而对于MLC
NAND,每页的大小为2048字节。(SLC : Single Level Cell 每个单元存储一位;MLC : Multi
Level Cell, 每个单元存储多位,因此其容量一般很大)。
每页的后面还有一段OOB(Out of
Bound),OOB不存放实际的数据,也就是说,用户层看到的那些文件绝对不会存放在OOB中,只会存在OOB之前的空间中;OOB的作用有两个:
(1) 存放ECC。
读取NAND时,可能会发生位反转(bit flip),即1变为0或0变为1,尤其是MLC
NAND,这种情况更明显。NAND在存放数据的同时会生成ECC代码,一方面可以检测到位反转的发生;另一方面,如果位反转的位数在一定范围内,可以纠正这种错误。
(2) 存放文件系统相关的标志。例如JFFS2系统在格式化时,需要写入将一些CLEAN-Maker
标志写入OOB。
一般对于NAND的读写操作都是基于MTD接口,基本操作有三种:
(1)
读, 对应的MTD的接口是mtd->read
(2)
写, 对应的MTD的接口是mtd->write
(3)
擦除,对应的MTD的接口是mtd->erase。擦除是NAND特有的操作,对于写操作,NAND只能将1变为0,而不能将0变为1,具体参考一片网上的文章:http://blog.163.com/qiu_zhi2008/blog/static/60140977200911374933539/
在Linux
kernel 中有一套基于MTD的测试程序,下载地址是,
存放的目录是drivers/mtd/tests/*, 从中可以看出基于mtd接口的使用方法。
阅读(1191) | 评论(0) | 转发(0) |