嵌入式学习笔记(一)——初识NAND FLASH

来源:互联网 发布:古典吉他民谣吉他 知乎 编辑:程序博客网 时间:2024/06/05 05:24

初识NAND FLASH

买了本二手书(《嵌入式系统原理及接口技术》)刚从目录扫到“NAND FLASH”这个概念,接着就得到了老师的任务,要我做NAND FLASH FTL,神马香港博士做好了接口,让改程序神码的,虽然不明白什么意思,但感觉像驱动开发,觉得很厉害!!!

差点起名字叫NAND FLASH学习笔记,一想也不对,我目前的目标是NAND FLASH,但是相关的整个体系都得学才明白,而我也是这样做的,那应该叫嵌入式学习。

说是让我先去搜索中文资料,随后发给我英文版的资料。好了,开始搜索吧,先百科“NAND FLASH”,再百度“NAND FLASH FTL” “NAND FLASH 驱动”等字眼,然后把我那二手书也扫两眼,就这么定了

百科篇

打开百科,映入眼帘的是NOR FLASH与NAND FLASH对比。NOR的特点是XIP,eXecute In Place——芯片内执行,技术角度就是,它可以在FLASH内运行程序,不用转到RAM,这就是所谓插入U盘可以扩充电脑内存的说法的来源吧,那这句话的错误之处肯定在于他没提出NAND不可以这样做。

NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除 速度大大影响了它的性能。
NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于flash的管理需要特殊的系统接口。


以前知道磁盘都是扇区的,FLASH的擦写单元是块。NOR的块大64KB~128KB,擦写一次慢,NAND块小8KB~32KB,擦写一次快。而且NOR擦前要写1,更繁琐更慢了。



关于FTL的主要作用:

FTL: FLASH传输层软件,有两个作用,一是对FLASH写入进行负载均衡,由此提升FLASH的寿命;二是提供类似传统磁盘大小的块(512 bytes)访问界面,以便可以在FLASH上使用为磁盘存储介质而设计的文件系统,如FAT。
NFTL:适合NAND FLASH的FTL。与NOR FLASH相比,增加了坏块管理,页管理,以及ECC等纠错措施。
为什么要FTL?
由于传统的文件系统不是为Flash而设计的,如果直接在Flash上运行会很快使Flash局部老化而丢失数据,或崩溃。另外由于FLASH的块比较大,如果直接映射成块设备的话,空间利用率低







ref:

性能比较

● NOR的读速度比NAND稍快一些。 (因为说了NOR传输快嘛)
● NAND的写入速度比NOR快很多。(写入也要先擦出嘛)
● NAND的擦除速度远比NOR快。(块的大小不宜样)
● NAND的擦除单元更小,相应的擦除电路更加简单。(估计是不用额外写下1)
● NAND的实际应用方式要比NOR复杂的多。(不明觉厉)
● NOR可以直接使用,并在上面直接运行代码,而NAND需要I/O接口,因此使用时需要驱动。(前边提到NOR或许能扩充内存的问题,还有关键的,我要了解的驱动内容来了
====================================================================================================================================

目前我的大脑获得的有用信息就是NAND期间使用复杂的I/O口来串行地存取数据,8个引脚用来传送控制/地址和数据信息。总之,它需要驱动。


ref:

构成

NAND Flash 的数据是以bit的方式保存在memory cell,一般来说,一个cell 中只能存储一个bit。这些cell 以8个或者16个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device的位宽。这些Line会再组成Page,(NAND Flash 有多种结构,我使用的NAND Flash 是K9F1208,下面内容针对三星的K9F1208U0M),每页528Bytes(512byte(Main Area)+16byte(Spare Area)),每32个page形成一个Block(32*528B)。具体一片flash上有多少个Block视需要所定。我所使用的三星k9f1208U0M具有4096个block,故总容量为4096*(32*528B)=66MB,但是其中的2MB是用来保存ECC校验码等额外数据的,故实际中可使用的为64MB。

NAND flash以页为单位读写数据,而以块为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址:
Column Address:Starting Address of the Register. 翻成中文为列地址,地址的低8位
Page Address :页地址
Block Address :块地址
对于NAND Flash来讲,地址和命令只能在I/O[7:0]上传递,数据宽度是8位。


在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常 需要驱动程序,也就是内存技术驱动程序(MTD ),NAND和NOR器件在进行写入和擦除操作时都需要MTD。



坏块:NAND的坏块是分布的,也不好有效处理,因此存储一直需要虚拟映射

ref:

NOR FLASH的主要供应商是INTEL ,MICRO等厂商,曾经是FLASH的主流产品,但现在被 NAND FLASH挤的比较难受。它的优点是可以直接从FLASH中运行程序,但是工艺复杂,价格比 较贵。

NAND FLASH的主要供应商是SAMSUNG和东芝,在U盘、各种存储卡、MP3播放器里面的都是这种 FLASH,由于工艺上的不同,它比NOR FLASH拥有更大存储容量,而且便宜。但也有缺点,就是
无法寻址直接运行程序,只能存储数据。另外NAND FLASH 非常容易出现坏区,所以需要有校验
的算法。
在掌上电脑里要使用NAND FLASH 存储数据和程序,但是必须有NOR FLASH来启动。除了
SAMSUNG处理器,其他用在掌上电脑的主流处理器还不支持直接由NAND FLASH 启动程序。因此,
必须先用一片小的NOR FLASH 启动机器,在把OS等软件从NAND FLASH 载入SDRAM中运行才行,
挺麻烦的。
(引导相关 bootloader还没学)

另外还有数码产品中,有SLC和MLC两种NAND,品牌,制作工艺等,封装技术BGA、COB、TSOP。等等。。。我的重点是linux和驱动,掠过



课本篇(Day 2):


把我的二手书《嵌入式系统原理及接口技术》看了下,和NAND FLASH有关的标题有两个,一个是寻址(Addressing),一个是接口(interface)

NAND FLASH接口引脚有三类:数据、控制、状态。

数据引脚高度复用:地址总线、数据总线、命令输入信号线。

此外还有命令锁存使能CLE、地址锁存使能ALE、读写使能nRE、nWE、片选nCE等,还有R/nB(高电平表示芯片忙),I/O 0~7。


有个问题,NAND FLASH(eg.K9F6408) 8MB可用空间,除以块数1024,除以页数16,一可用512B,可是实际确实528B,还有16B的辅助数据存储器,存放ECC代码,坏块信息和文件系统代码等。而且:芯片内部还有一个528B的静态寄存器,名为页寄存器,听起来像一个索引,但是却是用来做数据存取的缓冲区。

那这里就有个悖论了,怎么设计要制作的存储芯片大小,按8MB生产的话,不够,还要给出一堆零头,专门计算此特例。难道按528那个算,这样生产太不统一标准了吧,又或者都是大概多大一块,然后用了多少,所以都不整齐,只是大概容量差不多,从里边格式化来这么多就行了。实际生产到底怎样呢(至少知道组成原理课中一般都简化了,一个芯片就是个很规整的数字比如8MB).

NAND FLASH的特点使它可以当bootloader,貌似是这个意思。

(前文提过NAND FLASH需要接口设计,而且没有统一标准,只是说各家可能大概套路会些共同点,这本N年前的书说ONFI(Open NAND Flash Interface),说Intel发起的要统一标准,既然现在老师还让我做,估计是没统一,查一下吧,貌似2011年就ONFI3.0了。。。。那统一不统一,估计也有工作要做,因为是嵌入式嘛。。。)


====================================================================================================================================


小结:

Linux 文件系统如下:



下面主要讨论基于Flash的文件系统


在嵌入式Linux应用中,主要的存储设备为RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。

FLASH重要特性:写操作只能把对应位置1变0,而删除才能0变1,并且是整块(block)的删。(期待进一步分析工作原理)。

闪存主要就是NAND和NOR。FLASH擦写次数有限,NAND闪存还有特殊的硬件接口和读写时序,所以要针对FLASH的硬件特性进行文件系统的设计,传统的ext2等用在Flash会有诸多弊端(具体是?。。)

如图,MTD是一主要设备,为上下提供抽象接口。So:Flash文件系统基于MTD驱动层。使用MTD驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有更好的支持、管理和基于扇区的擦除、读/写操作接口。

有意思的特性:FLASH芯片既可以一分多(分区),分别用不同的文件系统;也可以多合一(分区),采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。


JFFS2:Journalling Flash File System v2 ,第二版的JFFS,也可能有JFFS3,blabla....主要是给NOR FLASH。jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffsx文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间

YAFFS/YAFFS2:Yet Another Flash File System。专为NAND设计的日志型文件系统

 yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。

  yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。

  yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。


 Cramfs:Compressed RAM File System

Linus参与开发,也基于MTD

Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。

  另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。

  由于以上特性,Cramfs在嵌入式系统中应用广泛。

  但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。

  Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback 设备可以把它安装别的文件系统里。


Romfs

  传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以XIP(eXecute In Place,片内运行)方式运行,在系统运行时,节省RAM空间。uClinux系统通常采用Romfs文件系统。

  其他文件系统:fat/fat32也可用于实际嵌入式系统的扩展存储器(例如PDA, Smartphone, 数码相机等的SD卡),这主要是为了更好的与最流行的Windows桌面操作系统相兼容。ext2也可以作为嵌入式Linux的文件系统,不过将它用于FLASH闪存会有诸多弊端。



Other(Flash以外):

基于RAM的文件系统

  (1) Ramdisk

  Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。

  在Linux的启动阶段,initrd提供了一套机制,可以将内核映像根文件系统一起载入内存。

  (2)ramfs/tmpfs

  Ramfs是Linus Torvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。)

  Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度。

  Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:不能格式化,文件系统大小可随所含文件内容大小变化。

  Tmpfs的一个缺点是当系统重新引导时会丢失所有数据。


网络文件系统NFS (Network File System)

  NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。

  以上讨论的都是基于存储设备的文件系统(memory-based file system),它们都可用作Linux的根文件系统。实际上,Linux还支持逻辑的或伪文件系统(logical or pseudo file system),例如procfs(proc文件系统),用于获取系统信息,以及devfs(设备文件系统)和sysfs,用于维护设备文件





Q:PFTL.ko属于内核模块,在图中处于什么位置合适呢?记得是编译到MTD下了。


====================================================================================================================================

其他嵌入式基础知识(持续更新。。。。):


日志型文件系统:



NAND FLASH到此告一小段,先继续看两页《Understanding the Linux Kernel(3rd Edition)》(《深入理解Linux内核》,我看是渗入)

上次上课老师说的“两种模式”原来是对的,我们说用户态核心态,其实原文就是是模式(mode)

非特权用户模式unprivileged User Mode和特权内核模式privileged Kernel Mode

前者进入后者的唯一两种途径就是中断(Interrupts)和异常(Exceptions)_看来计算机组成原理要被复习一遍。


然后,一些小常识和细节——各种专业名词,各种英语,此书主要用80*86芯片,linux2.6.11,“因为代码太多,我们不可能都列出来,我们只选择有代表性的”。


各种ARM系列,还有THUMB指令集与ARM指令集,在这空中楼阁太枯燥了,等需要接触的时候查询吧。


初期只能零散学了,先积累点基础知识,对什么都有点印象,后边免得硬啃太慢太枯燥。




接下来的计划是找一找linux内核和驱动的相关文章,快速入门一下。