嵌入式Linux下JFFS2文件系統的實現

admin @ 2014-03-25 , reply:0

1 文件系統
    文件系統是一個操作系統中最重要的部分之一,它為操作系統提供了一種結構化存儲和管理數據的方式。文件系統的主要功能是對數據的物理存儲進行管理,並向用戶提供對數據的訪問介面。用戶程序建立在文件系統上,通過文件系統訪問數據,而不需要直接對物理存儲設備進行操作。
    最初的操作系統一般都只支持單一的一種文件系統,並且文件系統和操作系統內核緊密關聯在一起,而Linux操作系統的文件系統結構是樹狀的,在根目錄“/’下有許多子目錄,每個目錄都可以採用各自不同的文件系統類型。Linux中的文件不僅指的是普通的文件和目錄,而且將設備也當作一種特殊的文件,因此,每種不同的設備,從邏輯上都可以看成是一種不同的文件系統。
    在Linux操作系統中,為了支持多種不同的文件系統,採用了虛擬文件系統(VFS,Visual Filesystem Switch)技術,虛擬文件系統是對多種實際文件系統的共有功能的抽象,它屏蔽了各種不同文件系統在實現細節上的差異,為用戶程序提供了統一的、抽象的、標準的介面對文件系統進行訪問,如open(),read(),write()等。這樣,用戶程序就不需要關心所操作的具體文件是屬於哪種文件系統,以及這種文件系統是如何設計與實現的,對所有文件的訪問方式都是完全相同的。VFS與實際文件系統的關係如圖1所示。
 

2 Flash存儲器
    由於具有高可靠性、高存儲密度、低價格、非易失、擦寫方便等優點,Flash存儲器取代了傳統的EPROM 和EEPROM,在嵌入式系統中得到了廣泛的應用。Flash存儲器可以分為若干塊,每塊義由若干頁組成,對Flash的擦除操作以塊為單位進行,而讀和寫操作以頁為單位進行。Flash存儲器在進行寫入操作之前必須先擦除目標塊。根據所採用的製造技術不同,Flash存儲器主要分為Nor Flash和Nand Flash兩種。
1)Nor Flash。
    Nor Flash通常容量較小,其主要特點是 片內執行(XIP,eXecute In Place),就是指程序代碼可以直接在Flash內運行,而不需要將代碼讀取到RAM中再執行。Nor Flash具有RAM介面,易於訪問,它的缺點是擦除電路複雜,寫速度和擦除速度都比較慢,最大擦寫次數約10萬次,典型的塊大小是128kB。

2)Nand Flash。
    Nand Flash通常容量較大,具有很高的存儲密度,從而降低了單位價格。Nand Flash的塊尺寸較小,典型大小為8kB,擦除速度快,使用壽命也更長,最大擦寫次數可以達到100萬次,但是其訪問介面是複雜的I/O口。並且壞塊和位反轉現象較多,對驅動程序的要求較高。由於Nor Flash和Nand FIash各具特色,因此它們的用途也各不相同,Nor Flash一般用來存儲體積較小的代碼,而Nand Flash則用來存放大體積的數據。

3 Flash文件系統
    在嵌入式系統中,也可以在Flash上運行傳統的文件系統,如ext2等,但是這類文件系統沒有考慮Flash存儲器的物理特性和使用特點,例如:Flash存儲器中各個塊的最大擦除次數是有限的,如果能夠均勻地使用各個塊,就能延長Flash的整體壽命,這就需要磨損均衡的功能;為了提高Flash存儲器的利用率,還應該有對存儲空間的碎片收集功能;在嵌入式系統中,要考慮出現系統意外掉電的情況,所以文件系統應該有掉電保護的功能,保證系統在出現意外掉電時也不會丟失數據。因此在Flash存儲設備上,採用專門針對Flash存儲器的要求而設計的JFFS2(Journaling Flash File System Version 2)文件系統更為合適。

3.1 日誌文件系統
    JFFS2是一種日誌文件系統。在日誌文件系統中,所有文件系統的內容變化,如寫文件操作等,都被記錄到一個日誌中,每隔一段時間,文件系統會對文件的實際內容進行更新,然後刪除這部分日誌,重新開始記錄。如果對文件內容的變更操作由於系統出現意外而中斷,如系統掉電等,則系統重新啟動時,會根據日誌恢復中斷以前的操作,這樣系統的數據就更加安全,文件內容將不會因為系統出現意外而丟失。

3.2 MTD驅動程序
    JFFS2 建立在MTD(Memory Technology Devices)技術的基礎上,MTD是專門為訪問Flash存儲設備而設計的Linux子系統,提供了對Flash操作的一系列標準介面,能更好地支持對Flash的擦除和讀寫操作。通過MTD技術,可以將硬體驅動設計和系統程序設計分開。為了使用JFFS2文件系統,需要把MTD子系統編譯到內核中,MTD子系統提供MTD_CHAR和MTD_BLOCK這兩個模塊用於對Flash的訪問,MTD_CHAR將Flash表現為字元設備,與其關聯的設備文件是/dev/mtd0等,MTD_BLOCK將Flash表現為塊設備,與其關聯的設備文件是/dev/mtdblock0等;JFFS2文件系統就建立在MTD_BLOCK模塊的基礎之上。

3.3 JFFS2文件系統
    JFFS(Journaling Flash File System)是瑞典的Axis Communications公司專門針對嵌入式系統中的Flash存儲器的特性而設計的一種日誌文件系統。Redhat公司的David Woodhouse在JFFS的基礎上進行了改進,從而發布了JFFS2(Journaling Flash File System Version 2)。和JFFS相比,JFFS2支持更多節點類型,提高了磨損均衡和碎片收集的能力,增加了對硬鏈接的支持。JFFS2還增加了數據壓縮功能,這更利於在容量較小的Flash中使用。和傳統的Linux文件系統如ext2相比,JFFS2處理擦除和讀寫操作的效率更高,並且具有完善的掉電保護功能,使存儲的數據更加安全。在嵌入式系統中使用JFFS2文件系統的缺點很少,只是當文件系統快要滿時,JFFS2會放慢運行速度,這是由於碎片收集的原因。

4 JFFS2文件系統的實現
    文中所用的目標板CPU是韓國Samsung公司的S3C2410X,這是一種基於ARM920T核的嵌入式微處理器,所用的Flash存儲器是Intel公司Strata Flash系列中的E28F128,這是一種典型的Nor Flash晶元,容量為16MB。文中所採用的操作系統內核版本是Linux-2.4.18-rmk7-pxal,這個版本在嵌入式系統中有著廣泛的應用。
4.1 裁減內核
    首先進入drivers/mtd/maps/目錄下,編寫Flash晶元的map文件,例如文件名為s3c2410-strata.c。在map文件中需要定義Flash的基地址、大小、寬度、分區表、讀寫函數、初始化和釋放函數等。其中分區表的一個例子如下:
static struct mtd_partition s3c2410_partitions[]=
{
 {
  name:"bootloader",
  size:0x00030000,
  offer:0x0,
  mask_flags:MTD_WRITEABLE,
 },
 {
  name:"kernel",
  size:0x000d0000,
  offset:MTDPART_OFS_APPEND,
  mask_flags:MTD_WRITEABLE,
 },
 {
  name:"rootfs",
  size:MTDPART_SIZ_FULL,
  offset:MTDPART_OFS_APPEND,
 }
};
    這裡將Flash分成3個分區,分別存放引導裝載程序(Bootloader)、內核和根文件系統。mask_flags:MTD_WRITEABIE表示分區是只讀的;MTDPART_OFS_APPEND表示分區位置緊挨著上一個分區;MTDPART_SIZ_FULL表示佔用剩餘的全部空間。文中將JFFS2文件系統的映像存放在第3個分區上,作為系統的根文件系統。
    然後修改Makefile文件,在其中加入以下語句:
obj -$(CONFIG_MID_S3C2410) + = s3c2410-strata.O
再修改Config.in文件,在適當位置加入以下語句:
dep_tristate 'Intel Strata Flash device mapped On S3C2410' CONFIG_MTD_S3C2410 CONFIG_MTD_CFI
然後回到Linux源碼目錄下,運行make menuconfig對操作系統內核進行配置與裁減,要在Intel E28F128 Flash上使用JFFS2文件系統,要特別注意以下兩個選項:
1)在“Memory Technology Devices(MTD)”選項中選擇:
<*>Memory Technology Device(MTD)support
<*>MTD partitioning support
<*>Cashing block device access to MTD devices RAM/ROM/Flash chip drivers--->
<*> Detect flash chips by Common Flash Interface(CFI) probe
<*> Support for Intel/Sharp flash chips Mapping drivers for chip access--->
<*> CFI Flash device in physical memory map(0)physical start address of flash mapping (1000000)Physical length of flash mapping(2)Buswidthin octets
<*> Intel StrataFlash device mapped On S3C2410
    這裡設置了Flash晶元的起始地址、大小以及寬度,比如:起始地址為“0”,大小為“1000000”,即16MB,寬度為“2”,即16位元組。然後選中自己加入的“Intel Strata Flash device mapped on S3C2410”這一項。
2)在“File systems”選項中選擇:
<*>Joumalling Flash File System v2(JFFS2)support
    對於其他功能,可根據自己的實際情況,進行裁減,然後保存退出,接下來編譯出操作系統內核映像。

4.2 製作根文件系統映像
    要製作根文件系統的映像,可以藉助於BusyBox生成所需的大部分文件,然後自己再補充建立/dev,/proc,/etc等目錄,在dev目錄下建立設備文件,例如:
$mknod dev/console C 5 1
目錄和文件建立完成後,使用mkfs.jffs2工具產生文件系統映像:
$ ./mkfs.jffs2 -e0x20000 -d./rootfsdir -ojffs2.img
其中-e 0x20000表示擦除塊的大小為128kB;-d表示文件系統所在的目錄;-o表示文件系統映像名。

4.3 燒寫並運行
    根據分配的分區表信息,將Bootloader、內核映像和根文件系統映像分別寫入Flash中的指定區域,在Bootloader中設置內核命令行,例如“noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttyS0”,然後引導系統。

5 結束語
    JFFS2文件系統是專門針對嵌入式系統中的Flash存儲晶元設計的,由於JFFS2自身的特點,適合於在Nor Flash系列晶元上使用,本文以Intel Strata Flash E28F128為例,介紹了在Nor Flash上實現JFFS2文件系統的過程,為嵌入式Linux下的應用程序開發奠定了基礎。




[admin via 研發互助社區 ] 嵌入式Linux下JFFS2文件系統的實現已經有1564次圍觀

http://cocdig.com/docs/show-post-42262.html