我的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 <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/每秒