uClinux下Nor Flash的JFFS2文件体系构建
发布日期:2011-05-03
择要:如今的嵌入式体系多利用FLASH作为主存,因此,怎样有效办理FLASH上的数据非常告急。文章以SST39VF160芯片为例,讨论了在Nor Flash上创建uClinux的JFFS2文件体系的一样通常步调,从而为FLASH上的数据办理提供了抱负的选择要领。
嵌入式体系正随着Internet的生长而在各个范畴得到广泛的应用,作为嵌入式应用的内核,嵌入式Linux以其自由软件特性正日益被人们看好。Linux具有内核小、屈从高、源代码开放等长处,还内涵了完备的TCP/IP网络协议,因此非常适于嵌入式体系的应用。而作为专门运行于没有MMU的微处理惩罚处罚器的嵌入式利用体系,uClinux更是得到广泛应用。
当前的嵌入式体系开辟,须要方便机动的利用Flash。NOR和NAND是如今市场上两种紧张的非易失闪存技能。Intel于1988年起首开辟出NOR flash技能,彻底变革了原先由EPROM和EEPROM金瓯无缺的场合场合场面。NOR的特点是芯片内实行?XIP? eXe-cute In Place ,如许应用步调可以直接在flash闪存内运行,不必再把代码读到体系RAM中。NOR的传输屈从很高,在1~4MB的小容量时具有很高的资源效益,因此在嵌入式体系得到广泛的应用。
1 JFFS2文件体系简介
uClinux通常默认ROMFS作为根文件体系,它相敷衍一样通常的EXT2文件体系具有节流空间的长处。但是ROMFS是一种只读的文件体系,不支持动态擦写生存。固然敷衍须要动态生存的数据可以采取假造ram盘的要领来生存,但当体系失电后,ram盘的内容将全部丢失,而不克不及永世生存,因此须要实现一个可读写的文件体系。JFFS2文件体系便是一个很好的选择。
JFFS文件体系是瑞典Axis通讯公司开辟的一种基于Flash的日记文件体系,它在筹划时充分思量了Flash的读写特性和用电池供电的嵌入式体系的特点,在这类体系中必须确保在读取文件时,要是体系忽然失电,其文件的可靠性不受到影响。对Red Hat的David Woodhouse举行改革后,形成了JFFS2。紧张改造了存取战略以进步FLASH的抗委顿性,同时也优化了碎片整理性能,增长了数据压缩结果。须要过细的是,当文件体系已满或靠近满时,JFFS2会大大放慢运行速率。这是由于垃圾网络的标题。
JFFS2的底层驱动紧张完成文件体系对Flash芯片的访问控制,如读、写、擦除利用。在Linux中这部分结果是通过调用MTD(memory technology device内存技能配置)驱动实现的。相敷衍惯例块配置驱动步调,利用 MTD 驱动步调的紧张长处在于 MTD 驱动步调是专门为基于闪存的配置所筹划的,以是它们通常有更好的支持、更好的办理和更好的基于扇区的擦除和读写利用的接口。MTD相称于在硬件和上层之间提供了一个抽象的接口,可以把它明白为FLASH的配置驱动步调,它紧张向上提供两个接口:MTD字符配置和MTD块配置。通过这两个接口,就可以象读写平常文件一样对FLASH配置举行读写利用。颠末大抵的配置后,MTD在体系启动以后可以主动辨认支持CFI或JEDEC接口的FLASH芯片,并主动采获取当的下令参数对FLASH举行读写或擦除。
JFFS2在uClinux中有两种利用要领,一种是作为根文件体系,另一种是作为平常文件体系在体系启动后被挂载。思量到实际应用中须要动态生存的数据并未几,且在Linux体系目次树中,根目次和/usr等目次紧张是读利用,只有少量的写利用,但是大量的读写利用又孕育产生在/var和/tmp目次(这是由于在体系运行进程中孕育孕育产生大量log文件和临时文件都放在这两个目次中),因此,通常选用后一种要领。根文件指的是Romfs、var和/tmp,目次采取Ramfs,当体系断电后,该目次全部的数据都市丢失。
综上所述,通常在uClinux下采取的文件体系构成如图1所示。敷衍本文来说,图中Romfs和Ramfs两个文件体系的实现是很方便的,紧张须要实现的是Nor Flash的底层MTD驱动,下面就以SST39VF160芯片为例来先容MTD的驱动筹划要领。
2 JFFS2底层MTD驱动筹划
本文采取的体系以三星公司的SND-100为母板,CPU为ARM7TDMI芯片S3C4510B,16M的SDRAM,Nor Flash为SST39VF160,容量为1M×16bit,速率为70ns,通过16位数据总线与CPU互换数据,擦写次数典范值为10万次。
在\linux-2.4.x\drivers\mtd\maps目次下,每一个文件都是一个细致的MTD原始配置的干系信息,包括该MTD原始配置的肇始物理地点、大小、分区环境、读写函数、初始化和打扫步调。筹划时,须要对SST39VF160编写干系的步调,假设为S3C4510B.C。则须要举行以下几点利用:
(1) 定义SST39VF160在体系中的肇始地点、大小、总线宽度
#define WINDO DDR 0x1000000|0x04000000 //过细FLASH分区地点必须是non-cacheble
#define WINDOW SIZE 0x200000
#define BUSWIDTH 2
(2) 定义SST39VF160分区
典范的内存分区应包括:内核引导区、Linux内核区、应用区。此中内核引导区用来生存内核加载步调,Linux内核区存放的是颠末压缩的uClinux内核,应用区则用来生存用户的数据和应用步调,该区设为我们要采取的JFFS2文件体系。细致如下:
static struct mtd_partition s3c4510_partitions[]={
{
name: ″bootloader(128K)″,
size: 0x20000,
offset: 0x0000,
mask_flags:MTD_WRITEABLE //设置成只读地区
},
{
name: ″uClinux_kernel(832K)″,
size: 0xd0000,
offset: 0x20000,
},?
{
name: ″jffs2 (1088K) ″,
size: 0x110000,
offset: 0xf0000
}
};?
(3) 定义SST39VF160字节、半字、字的读写利用函数。
(4) 初始化SST39VF160函数int_init init_s3c4510b()。
该利用紧张包括两个方面:第一是调用do map probe()检测搜刮MTD配置。通常检测要领有两种:cfi probe和jedec probe,这里采取后一种,该要领在jedec_probe.c文件中定义。别的,jedec probe.c中定义了种种jedec probe典范芯片的信息,有些linux版本没有包括SST39VF160,须要手动添加;而利用的第二方面则是调用add_mtd_partitions()以将your_partiton的各个分区参加mtd_table。
3 内核干系配置的设置
3.1 内核配置文件设置
为使内核支持JFFS2,需在内核配置选项菜单里选择干系选项。起首把SST39VF160的MTD驱动参加配置菜单。并在mtd/maps/Config.in文件中参加如下步调:
if[″$CONFIG ARM″= ″y″]; then
dep_tristate′CFI Flash device mapped on Samsung S3C4510B′CONFIG_MTD_S3C4510B $CONFIG_MTD_CFI
相应\mtd\maps\Makefile文件参加
obj_$(CONFIG_MTD_S3C4510B)+=s3c4510b.o
其次选择Menuconfig下的配置选项。
在linux Kernel v2.4.20-uc0 Configuration下
Memory Technology Devices?MTD 下
CONFIG_MTD=Y
CONFIG_MTD_DEBUG=Y
CONFIG_MTD_DEBUG_VERBOSE=3
CONFIG_MTD_PARTITIONS=Y
CONFIG_MTD_CHAR=Y
CONFIG_MTD_BLOCK=Y
RAM/ROM/Flash chip drivers下
CONFIG_MTD_CFI=Y
CONFIG_MTD_JEDECPROBE=Y
CONFIG_MTD_CFI_AMDSTD=Y
Mapping drivers for chip access下
CONFIG_S3C4510B=Y
File systems下
CONFIG_JFFS2_FS=Y
CONFIG_JFFS2_FS_DEBUG=2
在uClinux v1.3.4 Configuration下
Flash Tools下
CONFIG_USER_MTDUTILS=Y
CONFIG_USER_MTDUTILS_ERASE=Y
CONFIG_USER_MTDUTILS_ERASEALL=Y
CONFIG_USER MTDUTILS_MKFSJFFS2=Y
BusyBox下选中cat,cp,dd, mount,umount,mkdir东西。
3.2 MTD块配置配置
下面是修改体系块配置的主配置号。默认环境下,MTDBLOCK主配置号为31,与BLKMEM的主配置号辩论,因此 修改\mtd\mtd.h中 MTD BLOCK MAJOR的值为30。
接着应添加MTD配置节点到/vender/--你所利用的目标机典范--/Makefile文件中。此中字符配置的主配置号为90,次配置号为0、2、4、6...(奇数次配置号为只读配置),块配置的主配置号为31,次配置号为0、1、2、3。可按以下要领增长DEVICES目标:
mtd0,c,90,0 mtd1,c,90,1 mtd2,c,90,2
mtdblock0,b,30,0 mtdblock1,b,30,1 mtd-block2,b,30,2
做完以上步调,可以运行内核编译下令make dep, make 以对内核举行编译。
当体系启动时,可以看到以下信息:
s3c4510b flash device: 200000 at 5000000
Found: SST SST39VF160
number of JEDEC chips: 1
Creating 3 MTD partitions on ″S3C4510B flash de-vice″:
0x00000000-0x00020000: ″bootloader(128K)″
mtd:Giving out device 0 to bootloader(128K)
0x00020000-0x00f0000:″uClinux_kernel(832K)″
mtd: Giving out device 1 to uClinux_kernel(832K)
0x00f0000-0x00200000:″jffs2_usr(1088K)″
mtd: Giving out device 2 to jffs2_usr(1088K)
init_mtdchar: allocated major number 90.
init_mtdblock: allocated major number 31.
……
3.3 创建文件体系镜像文件
体系会编译天生JFFS2的资助东西:mkfs.jffs2、eraseall、erase。此中mkfs.jffs2会孕育孕育产生JFFS2文件体系镜像的东西,eraseall和erase用来对FLASH芯片的擦除。mkfs.jffs的利用要领如下:mkfs.jffs -d根目次?-b| l??-e 擦除块大小??-o 输出文件??-v ?0-9???-q?。
别的,为了使体系在启动时主动挂载建好的JFFS2文件体系,在启动脚本里应参加:
mount -t jffs2 /dev/mtdblock2 /mnt4 结束语
本文讨论了在uClinux下创建基于Nor Flash的JFFS2的文件体系的一样通常步调。Nor Flash的特性决定了它在对数据存储恳求不高的嵌入式体系中有着广泛的应用,因此JFFS2文件体系对Flash上的数据办理非常方便。敷衍一些高真个掌上配置来说,Nand Flash更为得当,其单位存储密度比较高,资源较低,如许体系可以在不增长资源的环境下扩大存储容量。如今有一种新型的文件体系YAFFS更适于Nand Flash,本文不再予以讨论。