當數據寫得比較多時,例如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 <sys/xattr.h>
#i nclude <sys/acl.h>
#endif
#i nclude <byteswap.h>
#define crc32 __zlib_crc32
#i nclude <zlib.h>
#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/每秒