摘要:目前的嵌入式系統(tǒng)多使用FLASH作為主存,因此,如何有效管理FLASH上的數(shù)據(jù)非常重要。文章以SST39VF160芯片為例,討論了在Nor Flash上建立uClinux的JFFS2文件系統(tǒng)的一般步驟,從而為FLASH上的數(shù)據(jù)管理提供了理想的選擇方式。
嵌入式系統(tǒng)正隨著Internet的發(fā)展而在各個(gè)領(lǐng)域得到廣泛的應(yīng)用,作為嵌入式應(yīng)用的核心,嵌入式Linux以其自由軟件特性正日益被人們看好。Linux具有內(nèi)核小、效率高、源代碼開放等優(yōu)點(diǎn),還內(nèi)涵了完整的TCP/IP網(wǎng)絡(luò)協(xié)議,因此非常適于嵌入式系統(tǒng)的應(yīng)用。而作為專門運(yùn)行于沒有MMU的微處理器的嵌入式操作系統(tǒng),uClinux更是得到廣泛應(yīng)用。
當(dāng)前的嵌入式系統(tǒng)開發(fā),需要方便靈活的使用Flash。NOR和NAND是現(xiàn)在市場(chǎng)上兩種主要的非易失閃存技術(shù)。Intel于1988年首先開發(fā)出NOR flash技術(shù),徹底改變了原先由EPROM和EEPROM一統(tǒng)天下的局面。NOR的特點(diǎn)是芯片內(nèi)執(zhí)行?XIP? eXe-cute In Place?,這樣應(yīng)用程序可以直接在flash閃存內(nèi)運(yùn)行,不必再把代碼讀到系統(tǒng)RAM中。NOR的傳輸效率很高,在1~4MB的小容量時(shí)具有很高的成本效益,因此在嵌入式系統(tǒng)得到廣泛的應(yīng)用。
1 JFFS2文件系統(tǒng)簡(jiǎn)介
uClinux通常默認(rèn)ROMFS作為根文件系統(tǒng),它相對(duì)于一般的EXT2文件系統(tǒng)具有節(jié)約空間的優(yōu)點(diǎn)。但是ROMFS是一種只讀的文件系統(tǒng),不支持動(dòng)態(tài)擦寫保存。雖然對(duì)于需要?jiǎng)討B(tài)保存的數(shù)據(jù)可以采用虛擬ram盤的方法來保存,但當(dāng)系統(tǒng)掉電后,ram盤的內(nèi)容將全部丟失,而不能永久保存,因此需要實(shí)現(xiàn)一個(gè)可讀寫的文件系統(tǒng)。JFFS2文件系統(tǒng)便是一個(gè)很好的選擇。
JFFS文件系統(tǒng)是瑞典Axis通信公司開發(fā)的一種基于Flash的日志文件系統(tǒng),它在設(shè)計(jì)時(shí)充分考慮了Flash的讀寫特性和用電池供電的嵌入式系統(tǒng)的特點(diǎn),在這類系統(tǒng)中必需確保在讀取文件時(shí),如果系統(tǒng)突然掉電,其文件的可靠性不受到影響。對(duì)Red Hat的David Woodhouse進(jìn)行改進(jìn)后,形成了JFFS2。主要改善了存取策略以提高FLASH的抗疲勞性,同時(shí)也優(yōu)化了碎片整理性能,增加了數(shù)據(jù)壓縮功能。需要注意的是,當(dāng)文件系統(tǒng)已滿或接近滿時(shí),JFFS2會(huì)大大放慢運(yùn)行速度。這是因?yàn)槔占膯栴}。
JFFS2的底層驅(qū)動(dòng)主要完成文件系統(tǒng)對(duì)Flash芯片的訪問控制,如讀、寫、擦除操作。在Linux中這部分功能是通過調(diào)用MTD(memory technology device內(nèi)存技術(shù)設(shè)備)驅(qū)動(dòng)實(shí)現(xiàn)的。相對(duì)于常規(guī)塊設(shè)備驅(qū)動(dòng)程序,使用 MTD 驅(qū)動(dòng)程序的主要優(yōu)點(diǎn)在于 MTD 驅(qū)動(dòng)程序是專門為基于閃存的設(shè)備所設(shè)計(jì)的,所以它們通常有更好的支持、更好的管理和更好的基于扇區(qū)的擦除和讀寫操作的接口。MTD相當(dāng)于在硬件和上層之間提供了一個(gè)抽象的接口,可以把它理解為FLASH的設(shè)備驅(qū)動(dòng)程序,它主要向上提供兩個(gè)接口:MTD字符設(shè)備和MTD塊設(shè)備。通過這兩個(gè)接口,就可以象讀寫普通文件一樣對(duì)FLASH設(shè)備進(jìn)行讀寫操作。經(jīng)過簡(jiǎn)單的配置后,MTD在系統(tǒng)啟動(dòng)以后可以自動(dòng)識(shí)別支持CFI或JEDEC接口的FLASH芯片,并自動(dòng)采用適當(dāng)?shù)拿?a target="_blank">參數(shù)對(duì)FLASH進(jìn)行讀寫或擦除。
JFFS2在uClinux中有兩種使用方式,一種是作為根文件系統(tǒng),另一種是作為普通文件系統(tǒng)在系統(tǒng)啟動(dòng)后被掛載??紤]到實(shí)際應(yīng)用中需要?jiǎng)討B(tài)保存的數(shù)據(jù)并不多,且在Linux系統(tǒng)目錄樹中,根目錄和/usr等目錄主要是讀操作,只有少量的寫操作,但是大量的讀寫操作又發(fā)生在/var和/tmp目錄(這是因?yàn)樵谙到y(tǒng)運(yùn)行過程中產(chǎn)生大量log文件和臨時(shí)文件都放在這兩個(gè)目錄中),因此,通常選用后一種方式。根文件指的是Romfs、var和/tmp,目錄采用Ramfs,當(dāng)系統(tǒng)斷電后,該目錄所有的數(shù)據(jù)都會(huì)丟失。
綜上所述,通常在uClinux下采用的文件系統(tǒng)構(gòu)成如圖1所示。對(duì)于本文來說,圖中Romfs和Ramfs兩個(gè)文件系統(tǒng)的實(shí)現(xiàn)是很方便的,主要需要實(shí)現(xiàn)的是Nor Flash的底層MTD驅(qū)動(dòng),下面就以SST39VF160芯片為例來介紹MTD的驅(qū)動(dòng)設(shè)計(jì)方法。
2?。剩疲疲樱驳讓樱停裕尿?qū)動(dòng)設(shè)計(jì)
本文采用的系統(tǒng)以三星公司的SND-100為母板,CPU為ARM7TDMI芯片S3C4510B,16M的SDRAM,Nor Flash為SST39VF160,容量為1M×16bit,速度為70ns,通過16位數(shù)據(jù)總線與CPU交換數(shù)據(jù),擦寫次數(shù)典型值為10萬次。
在\linux-2.4.x\drivers\mtd\maps目錄下,每一個(gè)文件都是一個(gè)具體的MTD原始設(shè)備的相關(guān)信息,包括該MTD原始設(shè)備的起始物理地址、大小、分區(qū)情況、讀寫函數(shù)、初始化和清除程序。設(shè)計(jì)時(shí),需要對(duì)SST39VF160編寫相關(guān)的程序,假設(shè)為S3C4510B.C。則需要進(jìn)行以下幾點(diǎn)操作:
(1) 定義SST39VF160在系統(tǒng)中的起始地址、大小、總線寬度
#define WINDO DDR 0x1000000|0x04000000 //注意FLASH分區(qū)地址必須是non-cacheble
#define WINDOW SIZE 0x200000
#define BUSWIDTH 2
(2) 定義SST39VF160分區(qū)
典型的內(nèi)存分區(qū)應(yīng)包括:內(nèi)核引導(dǎo)區(qū)、Linux內(nèi)核區(qū)、應(yīng)用區(qū)。其中內(nèi)核引導(dǎo)區(qū)用來保存內(nèi)核加載程序,Linux內(nèi)核區(qū)存放的是經(jīng)過壓縮的uClinux內(nèi)核,應(yīng)用區(qū)則用來保存用戶的數(shù)據(jù)和應(yīng)用程序,該區(qū)設(shè)為我們要采用的JFFS2文件系統(tǒng)。具體如下:
static struct mtd_partition s3c4510_partitions[]={
{
name: ″bootloader(128K)″,
size: 0x20000,
offset: 0x0000,
mask_flags:MTD_WRITEABLE //設(shè)置成只讀區(qū)域
},
{
name: ″uClinux_kernel(832K)″,
size: 0xd0000,
offset: 0x20000,
},?
{
name: ″jffs2 (1088K)?″,
size: 0x110000,
offset: 0xf0000
}
};?
(3) 定義SST39VF160字節(jié)、半字、字的讀寫操作函數(shù)。
(4) 初始化SST39VF160函數(shù)int_init init_s3c4510b()。
該操作主要包括兩個(gè)方面:第一是調(diào)用do map probe()檢測(cè)搜索MTD設(shè)備。通常檢測(cè)方式有兩種:cfi probe和jedec probe,這里采用后一種,該方法在jedec_probe.c文件中定義。另外,jedec probe.c中定義了各種jedec probe類型芯片的信息,有些linux版本沒有包含SST39VF160,需要手動(dòng)添加;而操作的第二方面則是調(diào)用add_mtd_partitions()以將your_partiton的各個(gè)分區(qū)加入mtd_table。
3 內(nèi)核相關(guān)配置的設(shè)定
3.1 內(nèi)核配置文件設(shè)置
為使內(nèi)核支持JFFS2,需在內(nèi)核配置選項(xiàng)菜單里選擇相關(guān)選項(xiàng)。首先把SST39VF160的MTD驅(qū)動(dòng)加入配置菜單。并在mtd/maps/Config.in文件中加入如下程序:
if[″$CONFIG ARM″= ″y″]; then
dep_tristate′CFI Flash device mapped on Samsung S3C4510B′CONFIG_MTD_S3C4510B $CONFIG_MTD_CFI
相應(yīng)\mtd\maps\Makefile文件加入
obj_$(CONFIG_MTD_S3C4510B)+=s3c4510b.o
其次選擇Menuconfig下的配置選項(xiàng)。
在linux Kernel v2.4.20-uc0 Configuration下
Memory Technology Devices?MTD?下
CONFIG_MTD=Y
CONFIG_MTD_DEBUG=Y
CONFIG_MTD_DEBUG_VERBOSE=3
CONFIG_MTD_PARTITIONS=Y
CONFIG_MTD_CHAR=Y
CONFIG_MTD_BLOCK=Y
RAM/ROM/Flash chip drivers下
CONFIG_MTD_CFI=Y
CONFIG_MTD_JEDECPROBE=Y
CONFIG_MTD_CFI_AMDSTD=Y
Mapping drivers for chip access下
CONFIG_S3C4510B=Y
File systems下
CONFIG_JFFS2_FS=Y
CONFIG_JFFS2_FS_DEBUG=2
在uClinux v1.3.4 Configuration下
Flash Tools下
CONFIG_USER_MTDUTILS=Y
CONFIG_USER_MTDUTILS_ERASE=Y
CONFIG_USER_MTDUTILS_ERASEALL=Y
CONFIG_USER MTDUTILS_MKFSJFFS2=Y
BusyBox下選中cat,cp,dd, mount,umount,mkdir工具。
3.2 MTD塊設(shè)備配置
下面是修改系統(tǒng)塊設(shè)備的主設(shè)備號(hào)。默認(rèn)情況下,MTDBLOCK主設(shè)備號(hào)為31,與BLKMEM的主設(shè)備號(hào)沖突,因此 修改\mtd\mtd.h中 MTD BLOCK MAJOR的值為30。
接著應(yīng)添加MTD設(shè)備節(jié)點(diǎn)到/vender/--你所使用的目標(biāo)機(jī)類型--/Makefile文件中。其中字符設(shè)備的主設(shè)備號(hào)為90,次設(shè)備號(hào)為0、2、4、6...(奇數(shù)次設(shè)備號(hào)為只讀設(shè)備),塊設(shè)備的主設(shè)備號(hào)為31,次設(shè)備號(hào)為0、1、2、3??砂匆韵路绞皆黾樱模牛郑桑茫牛幽繕?biāo):
mtd0,c,90,0 mtd1,c,90,1 mtd2,c,90,2
mtdblock0,b,30,0 mtdblock1,b,30,1 mtd-block2,b,30,2
做完以上步驟,可以運(yùn)行內(nèi)核編譯命令make dep, make 以對(duì)內(nèi)核進(jìn)行編譯。
當(dāng)系統(tǒng)啟動(dòng)時(shí),可以看到以下信息:
s3c4510b flash device: 200000 at 5000000
Found: SST SST39VF160
number of JEDEC chips: 1
Creating 3 MTD partitions on ″S3C4510B flash de-vice″:
0x00000000-0x00020000: ″bootloader(128K)″
mtd:Giving out device 0 to bootloader(128K)
0x00020000-0x00f0000:″uClinux_kernel(832K)″
mtd: Giving out device 1 to uClinux_kernel(832K)
0x00f0000-0x00200000:″jffs2_usr(1088K)″
mtd: Giving out device 2 to jffs2_usr(1088K)
init_mtdchar: allocated major number 90.
init_mtdblock: allocated major number 31.
……
3.3 創(chuàng)建文件系統(tǒng)鏡像文件
系統(tǒng)會(huì)編譯生成JFFS2的輔助工具:mkfs.jffs2、eraseall、erase。其中mkfs.jffs2會(huì)產(chǎn)生JFFS2文件系統(tǒng)鏡像的工具,eraseall和erase用來對(duì)FLASH芯片的擦除。mkfs.jffs的使用方法如下:mkfs.jffs -d根目錄?-b| l??-e 擦除塊大小??-o 輸出文件??-v ?0-9???-q?。
另外,為了使系統(tǒng)在啟動(dòng)時(shí)自動(dòng)掛載建好的JFFS2文件系統(tǒng),在啟動(dòng)腳本里應(yīng)加入:
mount -t jffs2 /dev/mtdblock2 /mnt4 結(jié)束語
本文討論了在uClinux下建立基于Nor Flash的JFFS2的文件系統(tǒng)的一般步驟。Nor Flash的特性決定了它在對(duì)數(shù)據(jù)存儲(chǔ)要求不高的嵌入式系統(tǒng)中有著廣泛的應(yīng)用,因此JFFS2文件系統(tǒng)對(duì)Flash上的數(shù)據(jù)管理非常方便。對(duì)于一些高端的掌上設(shè)備來說,Nand Flash更為適合,其單元存儲(chǔ)密度比較高,成本較低,這樣系統(tǒng)可以在不增加成本的情況下擴(kuò)大存儲(chǔ)容量。目前有一種新型的文件系統(tǒng)YAFFS更適于Nand Flash,本文不再予以討論。
- 系統(tǒng)構(gòu)建(6793)
相關(guān)推薦
詳細(xì)講解嵌入式Linux支持的多種文件系統(tǒng)
 4612
4612基于ARM技術(shù)的uClinux系統(tǒng)設(shè)計(jì)和應(yīng)用分析
 2725
2725
什么是串行Nor Flash?串行Nor Flash的結(jié)構(gòu)和參數(shù)特性
 1669
1669
NAND Flash和NOR Flash的差別
 1905
1905
NAND FLASH與NOR FLASH的技術(shù)對(duì)比
 471
471
NOR Flash主要廠商及產(chǎn)品
 24454
24454Flash的類型
jffs2 制作出現(xiàn)問題
uClinux平臺(tái)下的Flash存儲(chǔ)技術(shù)
uClinux平臺(tái)下的Flash存儲(chǔ)技術(shù)
uClinux平臺(tái)下的Flash存儲(chǔ)技術(shù)的系統(tǒng)設(shè)計(jì)
uClinux的塊驅(qū)動(dòng)器
AM335X Bootloader from NOR FLASH
Davinci DM6446開發(fā)方案
IAR開發(fā)環(huán)境下i.MXRT的串行NOR Flash下載算法設(shè)計(jì)
NXP-I.MX6UL開發(fā)板inux根文件系統(tǒng)定制資料分享(三)
NorFlash與NandFlash對(duì)比分析哪個(gè)好?
U-boot NAND讀取文件系統(tǒng)出錯(cuò),ECC: uncorrectable.請(qǐng)問這個(gè)問題該怎么解決?
YAFFS在NAND閃存芯片有什么用處?
[公告]嵌入式Linux內(nèi)核設(shè)計(jì)高級(jí)研修班
[分享]FAT32文件系統(tǒng)論文
dm365如何優(yōu)化jffs2的掛載時(shí)間?
protel99文件轉(zhuǎn)換成PADS2007文件的視頻教程
u-boot引導(dǎo)啟動(dòng)Linux 2.6的內(nèi)核
uboot常用命令匯總
【Z-turn Board試用體驗(yàn)】+Linux中的“瑞士軍刀”--busybox制作根文件系統(tǒng)
【轉(zhuǎn)】基于嵌入式LINUX開發(fā)流程和步驟
專門針對(duì)FLASH的文件系統(tǒng)有哪些?
為什么linux下燒寫fs_qtopia.jffs2時(shí)出錯(cuò)?
關(guān)于NUC972 SPI NOR flash驅(qū)動(dòng)問題
關(guān)于yaffs2文件系統(tǒng)
君正X1830平臺(tái),出現(xiàn)kernel程序跑飛,偶爾報(bào)jffs2 CRC錯(cuò)誤是怎么回事?
君正x1830開發(fā)板kernel啟動(dòng)之后,跑NOR flash出現(xiàn)錯(cuò)誤
啟動(dòng)u-boot后停留在Freeing init memory: 140K
嵌入式Linux 開發(fā)流程
嵌入式Linux的文件系統(tǒng)及其存儲(chǔ)機(jī)制分析
嵌入式linux系統(tǒng)中常用的文件系統(tǒng)有哪些
怎么在linux下制作ext3、ext4文件系統(tǒng)?
教你用JLINK燒NOR/NAND FLASH
根文件系統(tǒng)
用藍(lán)牙spp接收mp3文件存到flash中播放,但是不能播放怎么解決?
目前RT-Thread主流的SPI FLASH主要用什么文件系統(tǒng)?
移植yaffs2的問題!??!求助
請(qǐng)教大神,我的jffs2鏡像燒進(jìn)開發(fā)板,還要連著pc,脫離電腦開發(fā)板的lcd一直是黑屏
請(qǐng)問AM1808 nand的文件系統(tǒng)分區(qū)信息有誰知道嗎?求分享
請(qǐng)問uboot2012掛載yaffs2根文件失敗該怎么辦?
請(qǐng)問使用TFTP燒寫內(nèi)核時(shí)".jffs2"文件是文件系統(tǒng)嗎?
請(qǐng)問怎么從掛載jffs2系統(tǒng)改為掛載yaffs2系統(tǒng)?
基于S3C44B0X微處理器的JFFS2件系統(tǒng)的實(shí)現(xiàn)
 16
16uClinux 下JFFS2 文件系統(tǒng)的實(shí)現(xiàn)
 9
9在嵌入式Linux上實(shí)現(xiàn)JFFS文件系統(tǒng)
 23
23JFFS2文件系統(tǒng)超級(jí)塊管理改進(jìn)
 31
31JFFS2文件系統(tǒng)存儲(chǔ)策略研究
 17
17基于s3c2410的CramFS根文件系統(tǒng)的移植
 31
31旺宏并行串行NOR Flash對(duì)比參考指南
 49
49旺宏串行NOR Flash簡(jiǎn)介
 30
30嵌入式操作系統(tǒng)VxWorks中TFFS文件系統(tǒng)的構(gòu)建
 599
599
nand nor flash區(qū)別
 1163
1163基于NAND閃存的文件系統(tǒng)YAFFS在嵌入式系統(tǒng)中的應(yīng)用
 1079
1079
NOR FLASH的原理及應(yīng)用
 23
23JFFS2文件系統(tǒng)及新特性簡(jiǎn)析
 0
0CramFS根文件系統(tǒng)的移植解析
 0
0JFFS2文件系統(tǒng)在天熠操作系統(tǒng)中的實(shí)現(xiàn)
 0
0spi nor flash應(yīng)用匯總 淺談spi flash應(yīng)用原理
 17953
17953NOR flash和flash有什么不一樣?
 10675
10675嵌入式 NAND flash文件系統(tǒng)JFFS2和YAFFS比較
 3248
3248
需要了解的混合文件系統(tǒng)(ramdisk+jffs)
 1630
1630
Linux最新UBI文件系統(tǒng)介紹
 6175
6175基于Linux2.6的YAFFS文件系統(tǒng)移植
 607
607NAND flash文件系統(tǒng)JFFS和YAFFS比較
 3605
3605學(xué)會(huì)用mkfs.jffs2命令制作jffs2鏡像文件
 2854
2854
JFFS文件系統(tǒng)和YAFFS文件系統(tǒng)的比較
 2551
2551基于ARM技術(shù)的uClinux系統(tǒng)設(shè)計(jì)與應(yīng)用分析
 263
263NAND Flash與NOR Flash的區(qū)別
 1624
1624嵌入式linux系統(tǒng)中常用的文件系統(tǒng)
 12
12NOR falsh、NAND flash、SDEMMC、QSPI flash、SPI flash
 30
30NOR Flash和NAND FLASH的區(qū)別是什么
 59808
59808
NAND Flash和NOR Flash的區(qū)別
 13
13為什么Nor Flash可以實(shí)現(xiàn)XIP,而Nand flash就不行呢?
 646
646如何配置只讀屬性的文件系統(tǒng)(Colibri iMX7為例)
 503
503
 電子發(fā)燒友App
                        電子發(fā)燒友App
                     
                 
                 
           
        
 
        


 
            
             
             
                 
             工商網(wǎng)監(jiān)
工商網(wǎng)監(jiān)
        
評(píng)論