来自:http://blog.sina.com.cn/s/blog_6b489d5e0102xm62.html

一、NAND和NOR Flash

一般来说,快闪记忆体可分为两大规格,一个是NAND, 一个是NOR。简单来说,NAND一般以存储数据为主,晶片容量大,容量可以达到2Gb甚至更大,NAND的读取是以一次读取一块的形式来进行的,通常一次读取512个字节,采用这种技术的Flash比较廉价;NOR一般以存储程序代码为主,又称为Code Flash,所以可让微处理器直接读取,但晶片容量较低,主流容量512Mb,NOR采用内存的随机读取技术。如果利用闪存只是用来存储少量的代码,这是NOR Flash更合适一些。用户不能直接运行NAND Flash上的代码,因此很多使用NAND Flash的Demo Board除了使用NAND Flash以外,还加上一块小的NOR Flash来运行启动代码。通过下表我比较了几乎所有关于NAND FLASH以及NOR FLASH的全部重要特性。

NAND NOR Flash   和MTD-LMLPHP

二 、 MTD

Memory Technology Device即内存技术设备,在Linux内核中,引入MTD层为NOR FLASH和NAND FLASH设备提供统一接口。MTD将文件系统与底层FLASH存储器进行了隔离。

NAND NOR Flash   和MTD-LMLPHP

如上图所示,MTD设备通常可分为四层,从上到下依次是:设备节点、MTD设备层、MTD原始设备层、硬件驱动层。

Flash硬件驱动层:Flash硬件驱动层负责对Flash硬件的读、写和擦除操作。MTD设备的Nand Flash芯片的驱动则drivers/mtd/nand/子目录下,Nor Flash芯片驱动位于drivers/mtd/chips/子目录下。

MTD原始设备层:用于描述MTD原始设备的数据结构是mtd_info,它定义了大量的关于MTD的数据和操作函数。其中mtdcore.c:  MTD原始设备接口相关实现,mtdpart.c :  MTD分区接口相关实现。

MTD设备层:基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)和字符设备(设备号90)。其中mtdchar.c :  MTD字符设备接口相关实现,mtdblock.c : MTD块设备接口相关实现。块设备模拟:MTD提供一个称谓mtdblock的块驱动程序,它在闪存上模拟一块硬盘,你可以将任何文件系统(如:ext2)放在模拟的闪存磁盘上,mtdblock隐藏了复杂的闪存访问过程(比如写之前先删除相关扇区的内容),被mtdblock创建的设备节点命名为/dev/mtdblock/X,其中X是分区号。字符设备模拟:mtdchar是底层闪存设备呈现出线性特点,与文件系统的块设备特性不同,mtdchar建立的设备节点命名为/dev/mtd/X,其中X为分区号,例如,写入引导程序: dd if=bootloader.bin of=/dev/mtd/0 ;一个原始mtdchar分区的使用示例是POST错误日志,另外一个嵌入式系统使用字符闪存分区的例子是保存类似于PC的CMOS、EEPROM信息。

设备节点:通过mknod在/dev子目录下建立MTD块设备节点(主设备号为31)和MTD字符设备节点(主设备号为90)。通过访问此设备节点即可访问MTD字符设备和块设备

 
三、mtd-utils 工具的使用

3.1 用来把flash镜像写入mtd分区,flashcp -v rootfs.image /dev/mtd1,该命令把erase,write,校验一块完成了;

四、内存读写

dd if=/dev/block/mmcblk0 of=/cache/nvram bs=1024 count=10240

05-11 22:23