<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 解析在U-Boot中實現(xiàn)對Yaffs鏡像的支持設(shè)計

          解析在U-Boot中實現(xiàn)對Yaffs鏡像的支持設(shè)計

          作者: 時間:2012-01-05 來源:網(wǎng)絡(luò) 收藏

          0 引 言

          本文引用地址:http://www.ex-cimer.com/article/149865.htm

          是目前廣泛使用的嵌入式操作系統(tǒng)通用引導(dǎo)程序,具有功能豐富強大,多種操作系統(tǒng)和CPU體系,易于功能擴展和移植,源碼開放等多種優(yōu)點。,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目。從FADSROM、8xxROM、PPCBOOT逐步發(fā)展演化而來。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實上,不少源碼就是相應(yīng)的Linux內(nèi)核源程序的簡化,尤其是一些設(shè)備的驅(qū)動程序,這從U-Boot源碼的注釋中能體現(xiàn)這一點。U-Boot不僅僅嵌入式Linux系統(tǒng)的引導(dǎo),當(dāng)前,它還NetBSD, VxWorks, QNX, RteMS, ARTOS, LynxOS嵌入式操作系統(tǒng)。其目前要支持的目標(biāo)操作系統(tǒng)是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS.文件系統(tǒng)是專門針對NAND FLASH的可讀寫型文件系統(tǒng),在NAND Flash上性能穩(wěn)定優(yōu)異。U-Boot自身沒有文件系統(tǒng)鏡像讀寫的直接支持。由于文件系統(tǒng)的特殊結(jié)構(gòu),需要對nand命令做一定的修改,從而其在NANDFLASH上對Yaffs鏡像的讀寫。

          1 相關(guān)工作簡介

          1.1 Yaffs文件系統(tǒng)結(jié)構(gòu)簡述

          目前,嵌入式系統(tǒng)中常用的FLASH文件系統(tǒng)有Cramfs,Jffs 2,Yaffs,exfat等。Cramfs是一種壓縮型只讀型文件系統(tǒng),其在系統(tǒng)啟動時解壓至內(nèi)存中運行。Jffs 2,Yaffs,Exfat等是可讀寫型文件系統(tǒng),Jffs 2一般應(yīng)用于NOR型FLASH;Exfat不是開源的文件系統(tǒng),一般應(yīng)用于Windows CE操作系統(tǒng)中。

          通常一個NAND FLASH存儲設(shè)備由若干塊組成;1個塊由若干頁組成。一般128 MB以下容量的NAND FLASH芯片,一頁大小為528 B,依次分為2個256 B的主數(shù)據(jù)區(qū)和16 B的額外空間;128 MB以上容量的NAND FLASH芯片,一頁大小通常為2 KB.由于NAND FLASH出現(xiàn)位反轉(zhuǎn)的概率較大,一般在讀寫時需要使用ECC進(jìn)行錯誤檢驗和恢復(fù)。

          Yaffs(Yet Another Flash File System)文件系統(tǒng)是專門針對NAND閃存的嵌入式文件系統(tǒng),目前有YAFFS和YAFFS2兩個版本,兩個版本的主要區(qū)別之一在于YAFFS2能夠更好的支持大容量的NAND FLASH芯片。

          Yaffs文件系統(tǒng)有些類似于JFFS/JFFS2文件系統(tǒng),與之不同的是JFFS1/2文件系統(tǒng)最初是針對NOR FLASH的應(yīng)用場合的,而NOR FLASH和NAND FLASH本質(zhì)上有較大的區(qū)別,所以盡管JFFS1/2 文件系統(tǒng)也能應(yīng)用于NAND FLASH,但由于它在內(nèi)存占用和啟動時間方面針對NOR的特性做了一些取舍,所以對NAND來說通常并不是最優(yōu)的方案。

          Yaffs文件系統(tǒng)的設(shè)計充分考慮到NAND FLASH以頁為存取單位等的特點,將文件組織成固定大小的段(Chunk)。以528 B的頁為例,Yaffs文件系統(tǒng)使用前512 B存儲數(shù)據(jù)、16 B的額外空間,用以存放數(shù)據(jù)的ECC和文件系統(tǒng)的組織信息等(稱為OOB數(shù)據(jù))。通過OOB數(shù)據(jù),不但能實現(xiàn)錯誤檢測和壞塊處理;同時可以避免加載時對整個存儲介質(zhì)的掃描,加快了文件系統(tǒng)的加載速度。一個頁面的具體結(jié)構(gòu)如表1所示。

          由此可知,與其他文件系統(tǒng)相比,在生成Yaffs鏡像時就包含了OOB數(shù)據(jù),所以在燒寫Yaffs鏡像時,不需要計算ECC,僅依次寫入512 B的數(shù)據(jù)和16 B的OOB數(shù)據(jù)即可。同時,Yaffs鏡像要使用分區(qū)上的第一個塊來存儲一個名為Yaffs_ObjectHeader的結(jié)構(gòu)體。該結(jié)構(gòu)體記錄了該分區(qū)中的文件、路徑以及相關(guān)的鏈接,所以在燒寫時還需要跳過第一個可用的塊。Yaffs文件系統(tǒng)目前常用的版本為Yaffs 2,性能在許多方面都有了很大的提高。

          1.2 U-Boot對常見文件系統(tǒng)的支持

          U-Boot可支持的主要功能列表 系統(tǒng)引導(dǎo);支持NFS掛載、RAMDISK(壓縮或非壓縮)形式的根文件系統(tǒng);支持NFS掛載、從FLASH中引導(dǎo)壓縮或非壓縮系統(tǒng)內(nèi)核;基本輔助功能 強大的操作系統(tǒng)接口功能;可靈活設(shè)置、傳遞多個關(guān)鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在不同開發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,尤對Linux支持最為強勁; 在實際開發(fā)過程中,一般使用引導(dǎo)程序,比如U-Boot,完成文件向FLASH中的燒寫和啟動引導(dǎo)等工作。U-Boot能夠支持Cramfs,Jffs 2文件系統(tǒng)的燒寫。這些文件系統(tǒng)是針對NOR型FLASH設(shè)計的,所有文件數(shù)據(jù)就是簡單的線性表組織形式。對于目前大量使用的NAND型FLASH,由于帶有用于數(shù)據(jù)校驗等功能的OOB區(qū),所以Yaffs文件系統(tǒng)的數(shù)據(jù)組織形式不再是線性表的形式。

          U-Boot沒有提供對Yaffs文件系統(tǒng)的讀寫支持。但由于該文件系統(tǒng)的讀寫過程與其他文件系統(tǒng)的讀寫類似,因此可以通過修改U-Boot的FLASH讀寫命令,增加處理00B區(qū)域數(shù)據(jù)的功能,即可以實現(xiàn)對Yaffs文件系統(tǒng)的讀寫支持。

          2 具體實現(xiàn)

          在此,采用U-Boot 1.1.6版,NAND FLASH使用三星公司的K9F1208UOM.該NAND FLASH每頁為512 B,外加16 B額外空間,整個芯片容量為64 MB.在此之前,已經(jīng)正確配置了相關(guān)的宏定義,并移植了相關(guān)NAND FLASH的驅(qū)動程序,使U-Boot能夠正確操作該芯片。

          2.1 為U-Boot添加新的命令

          實際上,U-Boot中已經(jīng)實現(xiàn)了所需的nand命令,只要編寫好正確的NAND FLASH驅(qū)動程序,并定義相應(yīng)的宏,就可實現(xiàn)對NAND FLASH的基本讀寫操作。欲添加對Yaffs鏡像的支持,只要實現(xiàn)一個新的參數(shù)即可。為了給下述工作一個清晰的步驟,在此先簡述如何向U-Boot中添加一個新命令。以下所述的路徑均在U-Boot源碼目錄下。

          (1)在include/CMD_cONfdefs.h文件中定義相應(yīng)命令的宏,不能與已有的宏值重復(fù)。

          (2)在common/CMd_name.c中實現(xiàn)命令操作的具體代碼,文件名中的nAME即為相應(yīng)命令的名稱。在這個文件中,首先要編寫命令的實現(xiàn)函數(shù);此外還要使用一個U_BOOT_CMD()的宏函數(shù)來填寫該命令的cmd_tbl_t結(jié)構(gòu)體。該結(jié)構(gòu)體的原型是在includecommand.h 中定義的,包含相應(yīng)命令的名稱、參數(shù)個數(shù)、實現(xiàn)函數(shù)、用法說明、幫助等信息。

          (3)在相應(yīng)的開發(fā)板頭文件(位于include/con-figs/下)中的CONFIG_COMMANDS宏中添加(1)所定義的宏即可使用該命令。

          在實現(xiàn)以上步驟時,參照已有命令的相應(yīng)代碼作適當(dāng)修改即可。

          2.2 為nand命令添加新參數(shù)

          根據(jù)以上分析,下面給nand命令添加write.yaffs參數(shù),從而實現(xiàn)對Yaffs鏡像的支持。按照第2.1節(jié)中的步驟,由于nand命令已經(jīng)實現(xiàn),僅需要修改com-mon/cmd_nand.c文件即可。

          (1)在common/cmd_nand.c文件的U_BOOT_CMD()宏函數(shù)中仿照其他參數(shù),添加該參數(shù)的使用說明

          定義讀寫操作的結(jié)構(gòu)體原型中一部分參數(shù)沒有使用,這些參數(shù)與選擇ECC的方式有關(guān),由于Yaffs文件系統(tǒng)已包含了OOB數(shù)據(jù),故不使用這些參數(shù)。另外, opts.skipfirSTblk是向nand_write_options_t結(jié)構(gòu)體中新添加的變量,因此需要修改該結(jié)構(gòu)體。在 include/nand.h中,向struct nand_write_options結(jié)構(gòu)體添加如下變量定義:

          int skipfirstblk;

          此外,需要再修改nand_write_opts函數(shù),以增加對此變量的支持。

          2.3 修改nand_write_opts函數(shù)

          在drivers/nand/nand_util.c中,根據(jù)其代碼,在while(blockstart!=(mtdoffset(~erasesize_blockalign+1)))循環(huán)體之后添加如下代碼:

          通過以上步驟,U-Boot已經(jīng)可以支持Yaffs文件系統(tǒng)鏡像的讀寫。一般地,在進(jìn)行NAND FLASH寫操作時,可以先通過串口或網(wǎng)絡(luò)等接口將數(shù)據(jù)下載到內(nèi)存中,進(jìn)而按照命令格式將其燒寫到NAND FLASH中。例如:

          在U-Boot中使用以上三條命令,將名為test.yaffs的Yaffs文件系統(tǒng)鏡像下載到內(nèi)存中,然后擦除一塊FLASH空間,最后用Nand Write.yaffs命令將其寫入NAND FLASH.燒寫完畢后會提示:

          Writing data at 0xd67200-100%complete.

          3663264 bytes written:OK

          另外,由于沒有使用ECC,燒寫過程中會有大量如下提示:

          Writing data without ECC to NAND_FLASH is not recom-mended

          事實上,ECC數(shù)據(jù)在生成Yaffs鏡像時已經(jīng)包含在鏡像里,因此這里的提示并沒有關(guān)系。在drivers/nand/nand_basec.c文件中,將nand_write_page函數(shù)中case NAND_ECC_NONE:語句分支中的printk函數(shù)注釋掉即可消除此提示。

          3 Yaffs文件系統(tǒng)的性能

          在實際使用中,一般CPU的運行速度遠(yuǎn)大于FLASH的讀寫速度,所以yaffs文件系統(tǒng)的讀寫速度主要由具體FLASH芯片的讀寫時間延遲來決定。

          對于常使用的Yaffs 2,寫操作的速度為1.5~4.5 MB/S,讀操作的速度為7.6~16.7 MB/S,刪除操作為7.8~62.5 MB/s,垃圾回收為2.1~7.7 MB/s.由于一般嵌入式系統(tǒng)數(shù)據(jù)交換量不大,所以該文件系統(tǒng)完全能夠滿足一般實時性操作的要求。

          此外,作為日志型文件系統(tǒng),Yaffs文件系統(tǒng)能夠有效地保護數(shù)據(jù)完整性,避免系統(tǒng)掉電等情況對數(shù)據(jù)產(chǎn)生的破壞。同時,與其他FLASH文件系統(tǒng)相比,Yaffs文件系統(tǒng)的實現(xiàn)給NAND型FLASH帶來了很多優(yōu)化,在速度、內(nèi)存占用以及能耗等方面都有更好的表現(xiàn)。

          4 結(jié) 語

          這里在分析Yaffs文件系統(tǒng)基本結(jié)構(gòu)的基礎(chǔ)上,通過為U-Boot已有命令添加新的參數(shù),實現(xiàn)了U- Boot讀寫Yaffs文件系統(tǒng)鏡像的支持。最后通過一個簡單試驗進(jìn)行了驗證。結(jié)果表明,燒寫入FLASH中的文件系統(tǒng)鏡像可以被嵌入式Linux等操作系統(tǒng)的內(nèi)核掛載使用。方便了嵌入式系統(tǒng)的Yaffs根文件系統(tǒng)鏡像的創(chuàng)建和調(diào)試。YAFFS是專門為NAND閃存設(shè)計的,它的出現(xiàn)使得價格低廉的NAND閃存芯片具有了高效性和健壯性。YAFFS文件系統(tǒng)性能優(yōu)越且易于移植,已經(jīng)成功應(yīng)用于Linux、mClinux和Windows CE等嵌入式操作系統(tǒng)上?,F(xiàn)在,每頁大小為2Kb的新型超大容量NAND閃存已經(jīng)出現(xiàn),針對這種Flash的文件系統(tǒng)YAFFS2正處于研究和應(yīng)用當(dāng)中??梢灶A(yù)見,基于NAND閃存的文件系統(tǒng)YAFFS/ YAFFS2將會應(yīng)用于更多的嵌入式系統(tǒng)。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          linux相關(guān)文章:linux教程




          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();