OOB linux 2 6 22下檔案系統的移植

2021-06-22 01:31:53 字數 2151 閱讀 7494

nand flash中的oob區

nand flash由nand flash控制器和nand flash晶元(例如k 9f1208u0a)兩大部分組成。當要訪問nand flash晶元中的資料時,必須通過nand flash控制器傳送命令才能完成。所以, nand flash相當於mcu的乙個外設,並不位於mcu的記憶體位址區。

一片nand flash就是乙個裝置(device), 其資料儲存分層為:

1裝置(device) = 4096 塊(blocks);

1塊(block) = 32頁 (pages) ;

1塊(page) = 528位元組(bytes) = 資料塊大小(512bytes) + oob區大小(16bytes)

現在也有資料塊大小為1024位元組或2048位元組的nand flash。在nand flash中每一頁中,最後16個位元組(又稱oob)存放ecc(error correction code)檢驗碼和檔案系統的組織資訊,用於錯誤檢測和壞塊處理。當檔案系統被掛載時,只須掃瞄儲存器的oob區就能將檔案系統資訊讀入記憶體,並且駐留在記憶體中,這樣不僅加快了檔案系統的載入速度,也提高了檔案的訪問速度,但是增加了記憶體的消耗。前面的512個資料位元組又分為前半部分和後半部分。可以通過nand flash的命令對前半部、後半部、oob區進行定位,使nand flash內建的指標指向各自的首位址。

yaffs檔案系統的**修改

通過以上的對oob區的結構的分析,可以得出我們需要修改yaffs檔案系統**的兩處:一是ecc校驗碼的位置,把校驗碼從oob區中第8、9、10、13、14和15移到第0、1、2、3、6、和7位元組。二是可用空間的資料結構的定義,上文提到新的資料結構的定義已經包含在yaffs_packedtags1.h中了,所以可以直接利用這段**,而不需要重新去定義了。

下面將具體的講述如何去修改這些**,以使makeyaffsimage工具能夠生成新格式的yaffs檔案系統。

(1)  增加標頭檔案;

修改makeyaffsimage.c,增加上這一行。

#include 「yaffs_packedtags1.h」

在yaffs_packedtags1.h檔案中定義了新格式的yaffs可用空間的資料結構。

(2)  修改makeyaffsimage.c檔案中的write_chunk函式。

修改makeyaffsimage.c檔案中的write_chunk函式為:

static int write_chunk(__u8 *data, __u32 objid, __u32 chunkid, __u32 nbytes)

在新的**中,設定新tag結構中增加了chunkdeleted成員,並將計算出來的ecc校驗碼填入新的ecc的位置,它正是nand_oob_16結構中的eccpos陣列定義的位置。其中nand_calculate_ecc函式是從核心檔案drivers/mtd/nand/nand_ecc.c修改而來的。在本文中,核心和檔案系統採用的ecc校驗為mtd裝置層的nand_ecc_soft。在原來的**中,yaffs檔案系統使用的是yaffs2/yaffs_ecc.c檔案中的yaffs_ecc_calculate函式來計算ecc校驗碼,但是在本文中配置核心時使用的是ecc校驗為mtd裝置層的nand_ecc_soft,為了使映像檔案和核心保持一致,我們修改了mkyafsimage**,使用了nand_calculate_ecc函式。

(3) 新增檔案,修改makefile.

在上面的write_chunk函式中的yaffs_packtags1是在yaffs_packedtags1.h中定義的,所以需要將這個檔案複製到當前的目錄。

$ cp  ../yaffs_packedtags1.c 

./另外nand_calculate_ecc函式是新加的nand_ecc.c中定義的,所以要修改makefile,把yaffs_packedtags1.c和nand_ecc.c也編譯進mkyaffsimage工具中。

找到makefile中的這樣一行:

mkyaffssources = mkyaffsimage.c

修改為:

mkyaffssources = mkyaffsimage.c  yaffs__packedtags1.c  nand_ecc.c

現在,在yaffs的**yaffs2/utils目錄下執行「make」命令生成的mkyaffsimage工具,就可以製作出支援linux-2.6.22.6版本的檔案系統了。

刪除MacOS 系統下檔案下所有SVN檔案

cd到資料夾,給了我乙個命令,就可以刪除乙個目錄包括子目錄的所有.svn檔案,很強大很經典 命令如下 find type d name svn xargs rm rf 相關引數說明 find 就不說了,你懂得 就是包含的目錄,一般泛指當前 type 英文會認識abc的 基本上就懂了 d 這個標示di...

Linux下根目錄下檔案掛載機制

假設當前系統中存在四個目錄 usr,var,tmp 根據檔案命名方式來看,我們會預設為他們的儲存方式應該是上圖中的包含關係,如下所示 但是事實上這種命名方式只是乙個假象,目錄和 var,usr 目錄並不存在包含的關係,他們分別儲存在不同的磁碟塊上,並行儲存,然後掛載到 目錄下實現使用者訪問 並行儲存...

解釋一下檔案 etc fstab的內容

etc fstab 內容解釋 偷個懶,把別人的話拷貝過來,做個標記,然後下班走人.dev hda1 mnt c ntfs ro,users,gid users,umask 0002,nls utf8 0 0 dev hda9 mnt d ntfs 3g silent,umask 0,locale z...