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


初识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 文件系统如下:

嵌入式学习笔记(一)——初识NAND FLASH_第1张图片


下面主要讨论基于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内核和驱动的相关文章,快速入门一下。

你可能感兴趣的:(嵌入式,学习note)