日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 在嵌入式Linux的開(kāi)發(fā)工作中,常用的存儲(chǔ)設(shè)備有NorFlash和NandFlash,其中價(jià)格低廉并適用于高密度和大容量存儲(chǔ)的NandFlash運(yùn)用更為廣泛[1]。YAFFS(Yet Another Flash File

 在嵌入式Linux的開(kāi)發(fā)工作中,常用的存儲(chǔ)設(shè)備有NorFlash和NandFlash,其中價(jià)格低廉并適用于高密度和大容量存儲(chǔ)的NandFlash運(yùn)用更為廣泛[1]。YAFFS(Yet Another Flash File System)文件系統(tǒng)是專(zhuān)門(mén)針對(duì)NandFlash的特殊構(gòu)造設(shè)計(jì)的,是一種日志結(jié)構(gòu)的文件系統(tǒng),性能超越了原有的JFFS系列文件系統(tǒng)。但隨著嵌入式技術(shù)的發(fā)展,在NandFlash介質(zhì)上的嵌入式Linux中構(gòu)造YAFFS時(shí),YAFFS存在掛載時(shí)間過(guò)長(zhǎng)和損耗均衡性不足兩方面的缺點(diǎn),需要進(jìn)一步改進(jìn)和優(yōu)化。

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所示。

老版本的MTD與NandFlash的兼容不是很好,需要安裝最新的MTD。實(shí)現(xiàn)Linux對(duì)MTD的支持,首先要在MTD子系統(tǒng)內(nèi)添加NandFlash的硬件設(shè)備驅(qū)動(dòng)。在arch/arm/plat-s3c2440目錄下的文件common-smdk.c中定義了Flash硬件平臺(tái)的驅(qū)動(dòng)信息,在文件中定義了結(jié)構(gòu)體static struct mtd-partition partition-info[],表示閃存的MTD分區(qū)信息,這里將NandFlash分為5個(gè)MTD分區(qū),分區(qū)內(nèi)容如下:

[0] = { .name = "Boot",

.size = 0x00100000,

.offset = 0

}, //mtd0分區(qū),大小為1 MB,相對(duì)偏移地址為0x0

[1] = { .name = "MyApp",

.size = 0x003c0000,

.offset = 0x00140000,

}, //mtd1分區(qū),存儲(chǔ)應(yīng)用程序

[2] = { .name = "Kernel",

.size = 0x00300000,

.offset = 0x00500000,

}, //mtd1分區(qū),用于存放內(nèi)核

[3] = { .name = "filesystem",

.size = 0x03c00000,

.offset = 0x00800000,

}, //mtd3分區(qū),大小為30 MB, 用于存放文件系統(tǒng)

[4]……

}

在該文件中,還定義了Flash的總線寬度、基本讀寫(xiě)操作以及硬件相關(guān)的控制引腳,可根據(jù)相應(yīng)的需求進(jìn)行修改。

(3)增加內(nèi)核對(duì)YAFFS的支持。首先將最新的YAFFS源碼包放入Linux內(nèi)核的/fs目錄中,執(zhí)行解壓操作,/fs目錄中添加了YAFFS文件系統(tǒng)的源碼;然后在內(nèi)核中對(duì)YAFFS進(jìn)行配置,相應(yīng)地修改為:在/fs/Makefile中增加obj-$(CONFIG_YAFFS_FS)+=yaffs/;在/fs/Kconfig中增加source“fs/yaffs/Kconfig”。

(4)編譯內(nèi)核。在Linux2.6.28內(nèi)核目錄下執(zhí)行make menuconfig操作,在內(nèi)核配置菜單中選中支持MTD、NandFlash和YAFFS文件系統(tǒng)的選項(xiàng)。注意一定要選擇選項(xiàng)Let yaffs do its own ECC,因?yàn)橹谱鞒鰜?lái)的YAFFS文件系統(tǒng)映像中附加區(qū)的數(shù)據(jù)包含了ECC校驗(yàn)算法。此算法與NandFlash的MTD中的校驗(yàn)算法不相同,會(huì)造成MTD認(rèn)為頁(yè)校驗(yàn)錯(cuò)誤;之后運(yùn)行make zImage,在/linux2.6.28/arch/arm/boot中形成壓縮的內(nèi)核鏡像zImage,通過(guò)S3C2440的專(zhuān)用串口工具DWN,將鏡像燒寫(xiě)到kernel分區(qū)。

2.3 YAFFS根文件系統(tǒng)制作

(1)制作文件系統(tǒng)。首先,創(chuàng)建文件系統(tǒng)根目錄rootfs,并且在根目錄下創(chuàng)建子目錄bin和sbin(存放自帶命令)、etc(系統(tǒng)配置文件)、proc、lib(程序運(yùn)行的動(dòng)態(tài)鏈接庫(kù))、user、dev(系統(tǒng)支持的設(shè)備文件);然后,安裝Linux的常用命令集Busybox,安裝其源碼到Linux根目錄下,修改其中的makefile,實(shí)現(xiàn)交叉編譯:

ARCH = arm

CROSS_COMPILE = /usr/arm-linux-

在Busybox的目錄下執(zhí)行make menuconfig,進(jìn)入配置菜單,根據(jù)需求添加選項(xiàng)。編譯后將install目錄下的文件拷貝到/rootfs中;其次,安裝交互程序Bash,使系統(tǒng)可進(jìn)入交互界面,源碼包解壓后,同樣修改鏈接路徑為:export PATH =/usr/local/arm/3.4.1/bin;編譯后將得到的bash靜態(tài)鏈接程序拷貝到/rootfs/bin目錄中;最后,建立系統(tǒng)的配置文件及編寫(xiě)啟動(dòng)腳本,系統(tǒng)啟動(dòng)訪問(wèn)的第一個(gè)腳本etc/inittab,編輯etc/init.d/rcS腳本,執(zhí)行掛載文件系統(tǒng)Ramfs和sysfs的命令,還可以在etc/rc.local中配置系統(tǒng)IP地址。[!--empirenews.page--]

(2)制作YAFFS文件系統(tǒng)鏡像。在YAFFS源碼文件包中有util工具包,對(duì)工具包中makefile的交叉編譯路徑進(jìn)行修改,編譯后得到mkyaffsimage工具。根目錄下執(zhí)行:. /mkyaffsimage /rootfs rootfs.yaffs。

(3)YAFFS根文件系統(tǒng)燒寫(xiě)。修改內(nèi)核的配置參數(shù)rootsystem=YAFFS,通過(guò)DWN把rootfs.yaffs鏡像文件燒到filesystem分區(qū)。啟動(dòng)系統(tǒng)就會(huì)顯示啟動(dòng)信息:VFS: Mounted root (yaffs filesystem)。

3 YAFFS改進(jìn)策略

(1)針對(duì)掛載YAFFS時(shí)需要掃描Flash上所有被使用的塊從而減慢了啟動(dòng)速度的問(wèn)題,在文件系統(tǒng)的加載過(guò)程中采用空間換取時(shí)間的策略,加入索引區(qū),用于存儲(chǔ)文件屬性信息節(jié)點(diǎn)[3],但對(duì)于閃存較小的嵌入式系統(tǒng)則沒(méi)有太大意義。YAFFS在NandFlash的頁(yè)中定義和記錄數(shù)據(jù)Objectpoint_data和file_data,還增加了index_data數(shù)據(jù)類(lèi)型,其中記錄了掛載系統(tǒng)時(shí)所需要的數(shù)據(jù)和節(jié)點(diǎn)信息,并分配專(zhuān)門(mén)記錄這些數(shù)據(jù)的塊(即索引塊)。在YAFFS中創(chuàng)建index_data類(lèi)型的數(shù)據(jù)結(jié)構(gòu)yaffs_monut_index,組織文件屬性的初始化數(shù)據(jù)的結(jié)構(gòu),如yaffs_object及部分相關(guān)的yaffs_Device、yafffs_BlockInfo和yaffs_Tnode等,索引塊中每頁(yè)的存儲(chǔ)結(jié)構(gòu)如圖4所示。

inode_num和check及其他有用的數(shù)據(jù)都是存儲(chǔ)在索引塊每頁(yè)的附加空間中的標(biāo)記位。inode_num用于記錄存儲(chǔ)啟動(dòng)控制信息所用的頁(yè)數(shù),掛載時(shí)系統(tǒng)只需要掃描索引塊已使用的頁(yè);check記錄了系統(tǒng)卸載時(shí),控制信息是否正常地寫(xiě)入閃存中,啟動(dòng)時(shí)如能檢查通過(guò)后,則采用改進(jìn)策略掛載系統(tǒng),否則運(yùn)行原有機(jī)制,掃描所有塊[4]。YAFFS掛載時(shí),系統(tǒng)掃描每一塊第一頁(yè)的附加區(qū),若不是索引塊就跳過(guò)檢查下一塊;如果是,則讀取該塊,獲取記錄了節(jié)點(diǎn)樹(shù)中的葉節(jié)點(diǎn)數(shù)據(jù)的信息,重建節(jié)點(diǎn)樹(shù)[5]。YAFFS文件系統(tǒng)成功掛載,即以一定的存儲(chǔ)空間換取了大量的掛載時(shí)間。采用了該策略后,第一次掛載時(shí)系統(tǒng)將運(yùn)行原有啟動(dòng)機(jī)制,卸載時(shí)將文件屬性數(shù)據(jù)寫(xiě)入索引塊,第二次掛載時(shí)則根據(jù)默認(rèn)設(shè)置直接讀取啟動(dòng)數(shù)據(jù)[6],而且還避免了隨著文件系統(tǒng)增大而啟動(dòng)變慢的問(wèn)題。采用空間換取時(shí)間的策略后與原YAFFS加載過(guò)程的區(qū)別如流程圖5所示。

(2)當(dāng)YAFFS系統(tǒng)進(jìn)行寫(xiě)操作且NandFlash中未分配空間小于預(yù)設(shè)的閾值時(shí),啟動(dòng)垃圾回收機(jī)制,選取最臟塊擦除。YAFFS文件系統(tǒng)的垃圾回收策略結(jié)合了隨機(jī)策略的平衡性和貪心策略的高效性,回收機(jī)制包括:回收不再使用的臟塊以及對(duì)存有有效數(shù)據(jù)的壞塊進(jìn)行處理。但回收算法具有隨機(jī)性,系統(tǒng)有可能總是選中同一個(gè)塊,認(rèn)定它是最臟的塊,并連續(xù)地擦除回收,造成惡性的使用,而NandFlash的擦除次數(shù)是有限的(大約在10次左右)。出現(xiàn)惡性的使用會(huì)造成閃存中的部分塊損壞,而其他塊使用次數(shù)卻極少,縮短了閃存的壽命。

(3)針對(duì)YAFFS的磨損平衡性差的情況,采用了擦除計(jì)數(shù)機(jī)制[7]:在yaffs.guts.h中定義了存儲(chǔ)在NandFlash的附加區(qū)中的數(shù)據(jù)結(jié)構(gòu)yaffs_tags,用來(lái)標(biāo)志每頁(yè)的狀態(tài);定義了chunkID、objectID和有效字?jǐn)?shù)等。其中有2 bit的空間是沒(méi)有使用的,并從chunkID和objectID分配7 bit,將這9 bit的空間定義為erase_count,用于記錄該頁(yè)被擦除的次數(shù)。初始值為零,當(dāng)被擦除時(shí)標(biāo)記為“1”,表示擦除過(guò)一次可達(dá)到的最大計(jì)數(shù)值為511。系統(tǒng)垃圾回收的流程圖如圖6所示。當(dāng)某一塊的擦除次數(shù)達(dá)到511時(shí),該塊與被擦除數(shù)最小的塊交換各自存儲(chǔ)的數(shù)據(jù),使頻繁擦寫(xiě)的塊存儲(chǔ)很少使用的數(shù)據(jù),而被擦除次數(shù)少的塊存儲(chǔ)頻繁地更新數(shù)據(jù)[8](如文件屬性信息數(shù)據(jù))。當(dāng)擦除計(jì)數(shù)達(dá)到最大的塊超過(guò)70%以上時(shí),將所有的擦除計(jì)數(shù)值歸零,循環(huán)以上的操作,從而實(shí)現(xiàn)NandFlash的損耗基本平衡、延長(zhǎng)使用壽命、提高文件系統(tǒng)可靠性。

4 性能測(cè)試

按照以上介紹的策略修改YAFFS文件系統(tǒng)相關(guān)部分的源代碼,并且根據(jù)YAFFS根文件系統(tǒng)構(gòu)建的基本步驟,將改進(jìn)后的文件系統(tǒng)作為根文件系統(tǒng)燒寫(xiě)入目標(biāo)板。在實(shí)驗(yàn)平臺(tái)上,分別對(duì)YAFFS和改進(jìn)后的文件系統(tǒng)進(jìn)行性能測(cè)試和研究。性能測(cè)試的主要內(nèi)容有:各塊的擦除次數(shù)和文件系統(tǒng)掛載的時(shí)間。在實(shí)驗(yàn)平臺(tái)上大量地進(jìn)行讀寫(xiě)和刪除操作,在源代碼中也添加擦除計(jì)數(shù)(只用于計(jì)數(shù)),兩個(gè)文件系統(tǒng)經(jīng)過(guò)相同數(shù)量的讀寫(xiě)和刪除操作后,讀取每塊的擦除次數(shù),分析數(shù)據(jù)得出:原YAFFS中存在擦除次數(shù)為零的塊,而改進(jìn)后則沒(méi)有;原YAFFS的最大擦除次數(shù)與最小擦除次數(shù)的比值是無(wú)窮大,而改進(jìn)后都在平均值附近波動(dòng),起伏不大。文件系統(tǒng)加載測(cè)試的主要方法是在內(nèi)核源碼和文件系統(tǒng)源碼中添加中斷機(jī)制和時(shí)鐘,安裝評(píng)估系統(tǒng)時(shí)間的工具PrintkTimes補(bǔ)丁,運(yùn)用printk輸出所需數(shù)據(jù)。測(cè)試結(jié)果如表1所示。由表1可看出,由于第一次啟動(dòng)時(shí)文件屬性信息還未寫(xiě)入索引區(qū),系統(tǒng)啟動(dòng)時(shí)間與改進(jìn)前大致相同,但第二次啟動(dòng)時(shí)索引區(qū)機(jī)制開(kāi)始工作,直接從索引塊中讀取文件信息,修改后的YAFFS啟動(dòng)時(shí)間已有明顯的改善,表明改進(jìn)策略達(dá)到縮短加載時(shí)間的目的。

在以NandFlash為介質(zhì)的嵌入式Linux平臺(tái)上構(gòu)建了YAFFS文件系統(tǒng),并在原有YAFFS文件系統(tǒng)的基礎(chǔ)上,對(duì)YAFFS的啟動(dòng)時(shí)間和損耗平衡進(jìn)行優(yōu)化。通過(guò)測(cè)試證明,啟動(dòng)時(shí)間相比原文件系統(tǒng)縮短了一半以上,且實(shí)現(xiàn)了NandFlash的摩擦損耗基本保持平衡,優(yōu)于改進(jìn)前的文件系統(tǒng)。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

剛?cè)腴T(mén)嵌入式,選入門(mén)級(jí)RZ/G2L開(kāi)發(fā)板,采用郵票孔形式封裝了RZ/G2L核心板。

關(guān)鍵字: 開(kāi)發(fā)板 嵌入式LINUX 嵌入式系統(tǒng)

摘要:闡述了NANDFLASH的工作原理和訪問(wèn)方式,提出了一種基于51內(nèi)核單片機(jī)存儲(chǔ)、讀取NANDFLASH的實(shí)現(xiàn)方法,給出了K9F2G08UXA與單片機(jī)的接口電路,同時(shí)給出了對(duì)K9F2GO8UXA芯片進(jìn)行讀操作、頁(yè)編程...

關(guān)鍵字: 51內(nèi)核 NANDFLASH 塊擦除 頁(yè)編程

很多客戶網(wǎng)站服務(wù)器被入侵,被攻擊,找到我們SINE安全公司尋求技術(shù)支持與幫助,有些網(wǎng)站被篡改,被跳轉(zhuǎn),首頁(yè)內(nèi)容被替換,服務(wù)器植入木馬后門(mén),服務(wù)器卡頓,服務(wù)器異常網(wǎng)絡(luò)連接,有的客戶使用的是阿里云服

關(guān)鍵字: Linux LINUX系統(tǒng) IP PID

工業(yè)主機(jī),也稱(chēng)為工業(yè)控制式主要機(jī)器,是工業(yè)控制計(jì)算機(jī)的簡(jiǎn)稱(chēng)。也是我們常常聽(tīng)別人說(shuō)的工業(yè)電腦,工控電腦等。工業(yè)主機(jī)的硬件組成有哪一些?工業(yè)主機(jī)擁有計(jì)算機(jī)的基本特征,其組成是由工業(yè)主板,中央處理器,

關(guān)鍵字: LINUX系統(tǒng) 硬件 WINDOWS系統(tǒng) 進(jìn)程

整理自網(wǎng)絡(luò),排版:付斌 對(duì)嵌入式系統(tǒng)工程師及嵌入式硬件工程師而言,2020年將是振奮人心的一年。隨著物聯(lián)網(wǎng)應(yīng)用的普及,MCU市場(chǎng)將再次繁榮。因此,市場(chǎng)上對(duì)嵌入式系統(tǒng)工程師人才的需求也將出現(xiàn)新高。這些都是底層編程領(lǐng)域中即將...

關(guān)鍵字: 嵌入式 軟硬件 BSP 嵌入式LINUX

[導(dǎo)讀] 前文分析了Linux設(shè)備驅(qū)動(dòng)的驅(qū)動(dòng)模型,本文來(lái)聊聊Platform_driver/Platform_device這個(gè)類(lèi)。做嵌入式Linux的驅(qū)動(dòng),這個(gè)也是繞不開(kāi)的,所以來(lái)學(xué)習(xí)分析總結(jié)一下。 閱讀本文,建議先讀:...

關(guān)鍵字: DEVICE PLATFORM 嵌入式LINUX LINUX驅(qū)動(dòng)

近日,華為Matebook 13 Linux版開(kāi)啟預(yù)約。預(yù)約頁(yè)面顯示,華為Matebook 13?Linux版有五個(gè)型號(hào)版本,分別為i5獨(dú)顯版兩個(gè)配色、i7獨(dú)顯版兩個(gè)配色以及一個(gè)R5銳龍版。其中

關(guān)鍵字: 華為 LINUX系統(tǒng) MATEBOOK 銳龍版

作者:CloudDeveloper 鏈接:https://cizixs.com/2018/01/13/linux-udp-packet-drop-debug/ 最近工作中遇到某個(gè)服務(wù)器應(yīng)用程序 UDP 丟包,在排查過(guò)程中...

關(guān)鍵字: UDP LINUX系統(tǒng) BSP BUFFER

推薦語(yǔ) 最近在充電,沒(méi)來(lái)得及輸出筆記。本次先給大家?guī)?lái)一位前輩的嵌入式Linux學(xué)習(xí)經(jīng)驗(yàn)及一些學(xué)習(xí)資料清單,跟著大佬走不迷路。這份資料清單有點(diǎn)長(zhǎng)。。。 下轉(zhuǎn)原文: 嵌入式 Arm Linux 入門(mén)必讀書(shū)籍推薦 前段時(shí)間有...

關(guān)鍵字: 嵌入式LINUX 內(nèi)核 KERNEL 命令行
關(guān)閉