我的AT91SAM9G20系统,板上集成了256M字节的NAND FLASH ;原来是使用JFFs2的,使用一段时间后发现, 当数据写得比较多时,例如MTDBLOCK2的分区大小为220M,当写了164M字节的数据时,这时候每次上电,JFFS2的文件系统,jffs2_gcd_mtd2的线程需要花差不多40秒的 时间去做垃圾回收的工作,更要命的是在垃圾回收的这段时间,占的资源接近100%,也就是说差不多40秒内,其他的线程基本上,没有机会运行了
所以我们决定使用UBI文件系统,但是UBI文件系统需要个工具,这个工具叫mtd-utils
其实网上有几个关于UBI移植的文章。我也是参照他们来做的,但是走了一些不应该走的弯路;当然也学习了一些额外的知识
我的linux编译器为: arm-none-linux-gnueabi 编译器的位置为: /usr/local/arm-2007q1
编译mtd-utils ,除了需要mtd-utils的源码外,还需要lzo-2.03 和 zlib-1.2.3这2个库文件;
下载这文件到你的机器上,在那个位置都可以;
1.安装lzo-2.03 用 tar -xzvf 命令解压缩
输入如下命令: CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=/usr/local/arm-2007q1/arm-none-linux-gnueabi make make install
注意我的机器是使用arm-none-linux-gnueabi-gcc 这个工具链的; 还有就是前面的那个CC 是大写的;写出小写的话,编译出来的库文件是基于PC而不是ARM的 后面的是编译器的路径;路径中不要加什么BIN之类的文件夹,否则会报找不到头文件,需要修改Makefile,强行指定路径
2.安装zlib-1.2.3 用 tar -xzvf 命令解压缩 CC=arm-none-linux-gnueabi-gcc ./configure --shared --prefix=/usr/local/arm-2007q1/arm-none-linux-gnueabi make make install
安装事项同样参考1
编译mtd-utils 用 tar -xzvf 命令解压缩
make CROSS=arm-none-linux-gnueabi- WITHOUT_XATTR=1
CROSS=arm-none-linux-gnueabi- 指定ARM编译器的路径
WITHOUT_XATTR=1 是应为mtd-utils中有些源码使用了zlib.h中的库文件而不使用acl.h的库文件
如下面 (mkfs.jfFs2.c):
#ifndef WITHOUT_XATTR #i nclude #i nclude #endif #i nclude #define crc32 __zlib_crc32 #i nclude #undef crc32
编译后,在mtd-utils/arm-none-linux-gnueabi/ubi-utils的文件夹中
找到需要的工具: ubiattach、ubiformat、ubimkvol等
把这些工具复制到目标板上
在AT91SAM9G20上运行时,需要保证板子上的内核是否打开了UBI文件系统
进入内核的文件夹,输入make menucofig
1)Device Drivers --->Memory Technology Device (MTD) support --->UBI - Unsorted block images --->Enable UBI
在“Miscellaneous filesystems”菜单下, 选中“UBIFS file system support”, “Extended attributes support”, “Advanced compression options”, “LZO compression support”, “ZLIB compression support”五项, 以使内核支持 UBIFS。
下面把mtdblock2 作为ubifs文件系统挂载起来
在控制台中输入:
1. flash_eraseall /dev/mtd2
把MTD2的FLASH擦除
2. 格式化FLASH ./ubiformat /dev/mtd2 -s 512
mtd2 对应是FLASH分区 MTDBLOCK2 -s 512 是我的板子的海量存储器不支持子页功能,所以必须指定为 为512字节;否则使用默认的2048字节
在ubiatached 是会报错
执行了步骤1后,2不需要运行
3. 将第二分区附着至ubi0上 ./ubiattach /dev/ubi_ctrl -m 2
-m 2 指把mtdblock2 关联到ubi0
4. 建立卷标 ./ubimkvol /dev/ubi0 -N rootfs -s 200MiB
这一步并非单纯是给文件系统命名的意思,它还担负了指定分区大小、建立ubi0_0这个东东
不做这一步。下一步操作不能进行的
5. 最后1步,挂载ubi文件系统,上面N步工作都是为这步结果的
mount -t ubifs ubi0_0 /mnt
需要注意: ubi0_0 是使用ubimkvol建立的卷标,并不需要加上 /dev/ubi0_0 虽然/dev 下也存在ubi0_0这个设备
跟新了文件系统后,使用FTP下载文件到目标板上,速度比原来的JFFS2要快很多
达到3M字节/秒,以前使用JFFS2也就600多K/每秒
|