yaffs2物理存儲


了解一個文件系統,除了了解運行機制(RAM結構)外,還需了解文件系統怎樣物理存儲的。RAM數據結構是為文件系統更好運行,而物理存儲是文件系統載體。文件系統出問題后,最終要從物理存儲尋找數據。
參考“How Yaffs Works”,文件數據都以順序日志形式寫到flash中,日志的每個entry都是一個chunk大小,所存的數據類型有兩種:
>>Data chunk: A chunk holding regular data file contents.
>>Object Header: A descriptor for an object(directory, regular data file, hard link, soft link, special descriptor, …). This holds details such as the identifier for the parent directory, object name, etc.
每個chunk都含有tags(默認存儲在oob中),yaffs1的tags和yaffs2 tags不同,下以yaffs2為例進行說明。
即yaffs數據都以chunk(one page)為單位存儲,每個chunk包含數據和標簽(tags),chunk數據為文件系統實際數據;tags為yaffs文件系統需要,根據chunk數據屬性而得。Chunk數據分為兩類:一類為Data chunk,存儲普通文件的內容(直接一字節一字節拷貝到flash,頁未滿時補0xFF,實為memset 0xFF而得),yaffs未分配具體數據結構(直接拷貝內容即可);另一類為所有文件(目錄、普通文件、硬連接、軟連接、字符設備、塊設備、FIFO、Socket)的頭,存儲相關文件屬性,yaffs提供struct yaffs_obj_hdr數據結構,該數據結構直接存儲到一個chunk(一頁page)上。根據utils/mkyaffs2image.c可知上述描述的詳細過程。
根據上面描述,實際存儲到flash上的數據結構有兩種:struct yaffs_obj_hdr和struct yaffs_packed_tags2。(若包含其他特性,checkpoint、inband tags、Block summaries、extended tags,即flash存儲其他信息提高flash性能,則flash上存儲的數據結構更多。)utils/mkyaffs2image.c通過掃描整個yaffs文件系統,根據文件提取struct yaffs_obj_hdr和struct yaffs_packed_tags2,直接寫到yaffs鏡像中。
sizeof(struct yaffs_packed_tags2) = 28;
sizeof(struct yaffs_obj_hdr) = 512;
//yaffs_packedtags2.h
struct yaffs_packed_tags2_tags_only {
unsigned seq_number; //塊序列號,每寫一次加1,初始0x10000
unsigned obj_id; //對象id,每個對象唯一,初始0x101
unsigned chunk_id; //0,對象頭;>0,該chunk在文件中位置
unsigned n_bytes; //chunk數據字節數,若為對象頭則為0xFFFF
};
struct yaffs_packed_tags2 {
struct yaffs_packed_tags2_tags_only t;
struct yaffs_ecc_other ecc; //tags ECC校驗,非chunk數據
};
//yaffs_ecc.h
struct yaffs_ecc_other {
unsigned char col_parity;
unsigned line_parity;
unsigned line_parity_prime;
};

//yaffs_guts.h
enum yaffs_obj_type {
YAFFS_OBJECT_TYPE_UNKNOWN,
YAFFS_OBJECT_TYPE_FILE,
YAFFS_OBJECT_TYPE_SYMLINK,
YAFFS_OBJECT_TYPE_DIRECTORY,
YAFFS_OBJECT_TYPE_HARDLINK,
YAFFS_OBJECT_TYPE_SPECIAL
};
struct yaffs_obj_hdr {
u32 type; /* enum yaffs_obj_type */

/* Apply to everything */
u32 parent_obj_id;
u16 sum_no_longer_used; /* checksum of name. No longer used */
YCHAR name[YAFFS_MAX_NAME_LENGTH + 1];

/* The following apply to all object types except for hard links */
u32 yst_mode; /* protection */

u32 yst_uid;
u32 yst_gid;
u32 yst_atime;
u32 yst_mtime;
u32 yst_ctime;

/* File size applies to files only */
u32 file_size_low;

/* Equivalent object id applies to hard links only. */
int equiv_id;
/* Alias is for symlinks only. */
YCHAR alias[YAFFS_MAX_ALIAS_LENGTH + 1];

u32 yst_rdev; /* stuff for block and char devices (major/min) */

u32 win_ctime[2];
u32 win_atime[2];
u32 win_mtime[2];

u32 inband_shadowed_obj_id;
u32 inband_is_shrink;

u32 file_size_high;
u32 reserved[1];
int shadows_obj; /* This object header shadows the
specified object if > 0 */

/* is_shrink applies to object headers written when wemake a hole. */
u32 is_shrink;

};

附注yaffs2鏡像首頁內容:
~$hexdump -C wang_yaffs2 | more
00000000 03 00 00 00 01 00 00 00 ff ff 74 6d 70 00 00 00 |..........tmp...|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000100 00 00 00 00 00 00 00 00 00 00 ff ff ed 41 00 00 |.............A..|
00000110 00 00 00 00 00 00 00 00 29 c4 e8 57 32 68 fa 56 |........)..W2h.V|
00000120 41 bb e4 57 ff ff ff ff ff ff ff ff ff ff ff ff |A..W............|
00000130 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
000001c0 ff ff ff ff ff ff ff ff ff ff ff ff 00 00 00 00 |................|
000001d0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000800 ff ff 00 10 00 00 01 01 00 00 00 00 00 00 ff ff |................|
00000810 00 00 25 00 00 00 00 00 00 00 ff ff ff ff ff ff |..%.............|
00000820 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000840 03 00 00 00 01 00 00 00 ff ff 73 62 69 6e 00 00 |..........sbin..|
說明:上圖表示的紅色部分為yaffs2 tags數據,前面兩個字符用作壞塊標記(后面具體說明)。該鏡像文件有默認源碼mkyaffs2image基礎上oob部分頭兩字節空置為0xFF所得。實際測試nandflash燒寫該鏡像后,文件系統僅啟動一部分,之后停止不再顯示信息。
后注:程序停止的原因為mkyaffs2image.c(即制作鏡像工具)問題,其在打包鏡像時,對於普通文件大小設置錯誤。在文件頭中設置文件大小有file_size_low和file_size_high兩部分組成(對普通文件有效),而對於普通文件,c中都通過stat.st_size>>32設置,而stat.st_size本身為32位,右移32位實際值仍為原值,導致文件設置大小過大。導致運行第一個文件時即停止不再運行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM