初识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的小容量时具有很高的成本效益,但是很低的写入和擦除 速度大大影响了它的性能。以前知道磁盘都是扇区的,FLASH的擦写单元是块。NOR的块大64KB~128KB,擦写一次慢,NAND块小8KB~32KB,擦写一次快。而且NOR擦前要写1,更繁琐更慢了。
关于FTL的主要作用:
ref:
性能比较
目前我的大脑获得的有用信息就是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。
在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常 需要驱动程序,也就是内存技术驱动程序(MTD ),NAND和NOR器件在进行写入和擦除操作时都需要MTD。
坏块:NAND的坏块是分布的,也不好有效处理,因此存储一直需要虚拟映射。
ref:
NOR FLASH的主要供应商是INTEL ,MICRO等厂商,曾经是FLASH的主流产品,但现在被 NAND FLASH挤的比较难受。它的优点是可以直接从FLASH中运行程序,但是工艺复杂,价格比 较贵。
另外还有数码产品中,有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在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。
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内核和驱动的相关文章,快速入门一下。