我的mtd-utils工具鏈編譯過程

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章