YAFFS文件系統(tǒng)在嵌入式Linux系統(tǒng)中的構(gòu)建與改進(jìn)
1 YAFFS文件系統(tǒng)
在嵌入式所用的NandFlash中,基本的讀寫(xiě)單位是頁(yè)(page),YAFFS的存儲(chǔ)位也是頁(yè)(一般稱(chēng)為Chunk),分為附加區(qū)(OOB)和數(shù)據(jù)區(qū)。32頁(yè)組成塊(block)是基本的擦除單位[2]。由于YAFFS的文件偏移地址和閃存的物理地址不一致而建立了一張文件與物理頁(yè)的映射表。閃存的頁(yè)序號(hào)作為表內(nèi)容,以每頁(yè)描述的文件偏移量作為表索引,再把這張大的映射表分為若干小表,組織成樹(shù)結(jié)構(gòu),以提高文件數(shù)據(jù)塊的查找速度。這種在內(nèi)存中建立的層次索引目錄稱(chēng)之為節(jié)點(diǎn)樹(shù)(TnodeTree),是YAFFS的核心模型,如圖1所示。在節(jié)點(diǎn)樹(shù)中按照邏輯索引(Logical chunk index)找到物理地址索引(Physical chunk index)。當(dāng)文件變大時(shí),所需的葉子節(jié)點(diǎn)也會(huì)增加,此時(shí)節(jié)點(diǎn)樹(shù)就會(huì)“拔高”和“增肥”。當(dāng)文件進(jìn)行刪除操作時(shí),用遞歸的方法從葉節(jié)點(diǎn)向上收縮,釋放已被刪除節(jié)點(diǎn)對(duì)應(yīng)的物理頁(yè)。
2 構(gòu)建YAFFS文件系統(tǒng)
2.1 實(shí)驗(yàn)平臺(tái)
開(kāi)發(fā)過(guò)程中運(yùn)用的是目標(biāo)板與宿主機(jī)的交叉編譯模式。宿主機(jī)即PC機(jī),采用的是虛擬機(jī)+Linux RedHat9.0系統(tǒng);目標(biāo)板的硬件是ARM板,采用的是一塊S3C2440的ARM9微處理器,帶有一塊256 MB的NandFlash、64 MB的SDRAM內(nèi)存。目標(biāo)板采用的開(kāi)發(fā)軟件是嵌入式Linux2.6.28+交叉編譯工具arm-Linux-gcc4.3.1。YAFFS文件系統(tǒng)的開(kāi)發(fā)流程如圖2所示,引導(dǎo)程序Boot-Loader一般是固定在開(kāi)板的Flash中(這里不做詳解)。
2.2 內(nèi)核移植
(1)修改交叉編譯環(huán)境,使其適用于本實(shí)驗(yàn)平臺(tái)。修改頂級(jí)Makefile中定義的ARM編譯器,使之與所采用的平臺(tái)處理器相對(duì)應(yīng)。修改如下:
ARCH = arm
CROSS_COMPILE = /usr/local/3.4.1/arm-linux-
同時(shí),為了支持實(shí)驗(yàn)平臺(tái)處理器12 MHz的晶振頻率,修改Linux提供的輸入時(shí)鐘,在文件arch/arm/mach-
s3c2440/mach-smdk2440.c中定義s3c24xx_init_clocks
(12 000 000);并且在該文件中將Linux支持的machine名稱(chēng)改為MACHINE_START(S3C2440,“Study-S3C2440”);最后,修改Linux中默認(rèn)的機(jī)器號(hào),使之與BootLoarder傳遞的機(jī)器參數(shù)782一致。在arch/arm/tools/math-types中,機(jī)器型號(hào)語(yǔ)句修改為:
S3C2440 ARCH_S3C2440 S3C2440 782
(2)內(nèi)核支持MTD。MTD是閃存與文件系統(tǒng)的接口,NandFlash、YAFFS文件系統(tǒng)與MTD的聯(lián)系如圖3所示。
linux相關(guān)文章:linux教程
評(píng)論