1.核心支援:
config_cramfs=y
2.製作檔案
1)獲取mkcramfs工具
如果是ubuntu的話: apt-get install mkcramfs
2)製作cramfs檔案映象
mkcramfs ./rootfs rootfs.cramfs
3.uboot燒寫cramfs檔案到nand的分割槽
tftp $loadaddr rootfs.cramfs
nand erase [addr] [size]
--- addr 為cramfs分割槽的起始位址
--- size 為cramfs分割槽的大小
nand write $loadaddr [addr] $filesize
--- 把檔案燒寫到nand裡面去
setenv bootargs console=ttys0,115200n8 init=/init rw root=1f04 rootfstype=cramfs
--- 1f04代表nand的第四個分割槽, 我這使用的是這個分割槽.
boot
如果運氣的好的話,cramfs能起來了。
4. 如果遇到如下錯誤:
1) cramfs: bad root offset 108
可能是uboot燒寫nand使用的ecc與核心使用的ecc不一致造成的。
2) cramfs: bad compressed blocksize 3822651956
cramfs: bad compressed blocksize 3822651956
failed to execute /init. attempting defaults...
cramfs: bad compressed blocksize 2447430638
cramfs: bad compressed blocksize 2447430638
error -3 while decompressing!
c05c7319(1969)->cfff0000(4096)
可能是由於nand有壞塊。 uboot燒寫時跳過壞塊,而cramfs卻沒有識別到這寫壞塊。
5) 解決cramfs不識別nand壞塊的patch:
本人使用的android的 2.6.32核心
# uname -a
linux (none) 2.6.32 #25 tue jul 12 19:03:04 cst 2011 armv7l gnu/linux
遵循盡量少該原則,我們只需改動修改 fs/cramfs/inode.c 檔案.
//------------------------------ 在檔案中新增以下內容 --------------------------------
#include
struct cramfs_nand_info ;
static unsigned int cramfs_nand_transfer_offset(struct super_block *sb, unsigned int offset)
static void cramfs_fill_nand(struct super_block *sb)
nandinfo->erasesize_shift = mtd->erasesize_shift;
nandinfo->block_map = block_map;
nandinfo->size = (uint32_t) mtd->size;}}
//------------------------------ 在檔案中修改以下內容 --------------------------------
/************** 修改function : cramfs_fill_super **************/
- sbi = kzalloc(sizeof(struct cramfs_sb_info), gfp_kernel);
+ sbi = kzalloc(sizeof(struct cramfs_sb_info) + sizeof(struct cramfs_nand_info), gfp_kernel);
if (!sbi)
return -enomem;
sb->s_fs_info = sbi;
+ /* add patch for skipping bad nand block */
+ cramfs_fill_nand(sb);
/* invalidate the read buffers on mount: think disk change.. */
mutex_lock(&read_mutex);
for (i = 0; i < read_buffers; i++)
buffer_blocknr[i] = -1;
/************** 修改function : cramfs_read **************/
if (!len)
return null;
+ /* calc the real offset in nand */
+ offset = cramfs_nand_transfer_offset(sb, offset);
blocknr = offset >> page_cache_shift;
offset &= page_cache_size - 1;
解決方法的原理是: 在nand沒有壞塊的情況下,cramfs是連續的放在nand的data區域,cramfs檔案系統中資料的offset == nand中資料區域的offset。我們暫且把cramfs系統 稱作fs(offset), 把nand中資料區域的offset稱作 nand(offset)。 如果說nand存在壞塊了,uboot燒寫cramfs映象就不是連續存放了,此時 fs(offset) != nand(offset)。因此,想要讓cramfs對nand的壞塊支援,就需要寫乙個對映函式f把fs(offset)對映到nand(offset) 該函式形式為: f(fs(offset)) = nand(offset)。 對映函式的演算法是: 建立乙個block的對映表,fs(offset)也以塊為單位坐落於block對映表中。 如果fs(offset)坐落的那個block是壞塊,則使其對映表及其後的所有block錶值都加上塊大小。 換算公式為: nand(offset) = fs(offset) + block_map[ fs(offset) / block_size ];
我們想要的對映函式使用c語言實現出來就是上面的 cramfs_nand_transfer_offset 這個函式。 cramfs_fill_nand只是為對映函式的實現做提前準備的。
參考檔案: -- 1 cramfs的特點 在嵌入式的環境之下,記憶體和外存資源都需要節約使用。如果使用ramdisk方式來使用檔案系統,那麼在系統執行之後,首先要把外存 flash 上的映像檔案解壓縮到記憶體中,構造起ramdisk環境,才可以開始執行程式。但是它也有很致命的弱點。在正常情況下,同樣的 不僅在外存中佔... 硬體平台 at91rm9200 64m sdram,8m intel flash,64m nandflash,16k iic.軟體平台 u boot 1.1.2 linux 2.6.19 所需檔案 9200loader.bin,bootflash.bin,u boot.bin,uimage,root... cramfs檔案系統簡介 cramfs檔案系統是由linuxtorvalds編寫的專門針對快閃儲存器設計的唯讀壓縮檔案系統。與ramdisk方式不同,cramfs檔案系統不需要一次性地將檔案系統中的所有內容都解壓到記憶體中,而只是在系統需要訪問某個資料時,馬上計算出該資料在cramfs中的位置,將其...cramfs檔案系統介紹
用u boot來引導Cramfs檔案系統
嵌入式檔案系統之 cramfs檔案系統的製作工具