Linux系统移植(第2版):第5章 嵌入式文件系统制作_第1页
Linux系统移植(第2版):第5章 嵌入式文件系统制作_第2页
Linux系统移植(第2版):第5章 嵌入式文件系统制作_第3页
Linux系统移植(第2版):第5章 嵌入式文件系统制作_第4页
Linux系统移植(第2版):第5章 嵌入式文件系统制作_第5页
已阅读5页,还剩43页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章嵌入式文件系统制作5.1文件系统选择5.2基于Flash的文件系统5.3基于RAM的文件系统5.4文件系统的制作5.1文件系统选择5.1.1Flash硬件方案比较5.1.2嵌入式文件系统的分层结构5.1.1Flash硬件方案比较Flash(闪存)是嵌入式系统的主要存储介质,其特点为写入操作只能把对应位置的1修改为0,而不能把0修改为1。因此,对于Flash的擦除操作是把对应存储块的内容恢复为1。硬件方案的总体原则是:用于数据存储采用NANDFlash,用于代码存储采用NORFlash。用NORFlash存放引导程序和根文件系统,用NANDFlash存放用户文件系统。5.1.2嵌入式文件系统的分层结构在嵌入式Linux应用中,主要的存储设备为RAM(DRAM,SDRAM)和ROM(常采用Flash存储器),常见的基于存储设备的文件系统类型包括Ramdisk、JFFS2、YAFFS、Cramfs、Romfs和Ramfs/Tmpfs等。5.2基于Flash的文件系统5.2.1JFFS文件系统(JournallingFlashFileSystem)5.2.2YAFFS文件系统(YetAnotherFlashFileSystem)5.2.3Cramfs文件系统(CompressedROMFileSystem)5.2.4Romfs文件系统(ROMFileSystem)5.2.1JFFS文件系统(JournallingFlashFileSystem)JFFS系列日志文件系统包括JFFS1、JFFS2和JFFS3,JFFS3正在开发中,JFFS2比JFFS1有很多改进的地方,所以目前通常使用JFFS2。1.JFFS2的工作原理2.JFFS2的主要特点3.JFFS2的挂载过程4.JFFS2的优点和缺点1.JFFS2的工作原理当文件系统加载时扫描整个Flash的内容,将信息读入日志结点jffs2_raw_inode,然后根据该信息建立文件系统。修改操作是先分配新结点jffs2_raw_inode,将内容写入新结点,然后将原来的结点标记为脏数据。当系统接近满或者已满时就要进行垃圾收集,需要扫描整个Flash中的结点,将标记为脏的结点进行回收。2.JFFS2的主要特点JFFS2,日志闪存文件系统版本2(JournallingFlashFileSystemv2)。主要用于NORFlash,基于MTD驱动层。JFFS2的主要特点如下:可读写;使用基于哈希表的日志结点结构,大大提高了对结点的操作速度;支持数据压缩;提供了“写平衡”支持;支持多种结点类型(数据I结点、目录I结点等),JFFS只支持一种结点;提高了对闪存的利用率,降低了内存的消耗。3.JFFS2的挂载过程JFFS2的挂载过程主要分为4个过程:(1)JFFS2扫描闪存介质,检查每个结点jffs2_raw_inode的CRC校验码是否合法,同时分配structjffs2_inode_cache和structjffs2_raw_node_ref。(2)扫描每个结点的物理结点链表,标识出过时的物理结点;将每个合法的dentry结点相应的jffs2_inode_cache中的字段nlink加1。(3)找到nlink为0的jffs2_inode_cache,释放对应的结点。(4)释放扫描过程中的临时信息。4.JFFS2的优点和缺点JFFS2的优点有:删除操作的时间短。遇到坏扇区时进行标记而使用可用扇区,延长了设备的写生命周期。JFFS系列文件系统存在下面的缺点:文件系统已满或者接近满时,系统无法分配新的结点就必须进行垃圾收集;垃圾收集就是从头开始扫描日志结点(jffs2_raw_inode)标记脏数据结点,这样使文件系统变得非常缓慢。5.2.2YAFFS文件系统(YetAnotherFlashFileSystem)YAFFS文件系统包括YAFFS和YAFFS2。YAFFS/YAFFS2是专门为嵌入式系统使用NANDFlash而设计的一种日志型文件系统,适用于大容量的存储设备。与JFFS相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间较短,对内存的占用较小。1.YAFFS文件系统的特点YAFFS/YAFFS2自带NAND芯片驱动,提供了嵌入式系统直接访问文件系统的API,这样用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,用户也可以通过MTD驱动程序来访问文件系统。2.YAFFS与YAFFS2的区别YAFFS与YAFFS2的主要区别在于,YAFFS仅支持小页(512Bytes)NANDFlash,而YAFFS2能够支持大页(2KB)NANDFlash。另外,YAFFS2在内存空间占用、垃圾回收速度、读/写速度等方面都有较大改进。3.YAFFS/YAFFS2的工作原理将文件组织成固定大小(512Bytes/2KB)的数据段对文件系统上的所有内容都统一当作文件来处理。NANDFlash上的每一页数据都留有额外的空间用于存储附加信息,YAFFS文件系统正是利用了这部分空间中剩余的部分来存储文件系统相关的内容。4.YAFFS与JFFS的比较YAFFS和JFFS都提供了写均衡,垃圾收集等操作。同时在稳定性、垃圾收集速度、储存容量等特性方面具有以下区别:JFFS是一种日志文件系统。YAFFS仅仅借鉴了日志系统的思想,不提供日志机制。JFFS中使用多级链表管理需要回收的脏块。YAFFS是从头到尾对块进行扫描,所以在垃圾收集上JFFS的速度较慢,但是能延长NAND器件的寿命。JFFS支持文件压缩;YAFFS不支持压缩。5.2.3

Cramfs文件系统(CompressedROMFileSystem)Cramfs是一个压缩式的文件系统。Cramfs中的解压缩及解压缩之后的内存中数据存放位置,都是由Cramfs文件系统本身进行维护的。1.Cramfs文件系统的特点2.Cramfs文件系统的优点和缺点1.Cramfs文件系统的特点系统访问数据时采用实时解压缩方式,其解压缩算法复杂,因此解压缩过程有延迟。Cramfs的数据都是经过处理、打包的,对数据进行写操作比较困难。在Cramfs中文件最大不能超过16MB。支持组标识(gid)。支持硬链接,但是Cramfs不能处理多条链接。Cramfs的目录中,没有“.”和“..”这两项。Cramfs中不保存文件的时间戳(timestamps)信息。当前版本的Cramfs只支持PAGE_CACHE_SIZE为4096的内核2.Cramfs文件系统的优点和缺点Cramfs文件系统的优点有:压缩比较高,占用内存空间少;其缺点就是只能进行读操作,不支持写操作。5.2.4

Romfs文件系统(ROMFileSystem)Romfs是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存功能,采用顺序存储方式,所有的数据包括目录、链接等都按照目录树的顺序进行存放。Romfs有两个结构,代码比较简单,在romfs_fs.h中定义如下:structromfs_super_block{__be32word0;__be32word1;__be32size;__be32checksum;charname[0];

/*

volumename*/};5.3基于RAM的文件系统基于RAM文件系统的优点就是读写速度非常快,而缺点就是当系统复位后会丢失所有数据。1.Ramdisk2.Ramfs/Tmpfs1.RamdiskRamdisk是划分一块固定大小的内存作分区来使用,它不是一个实际的文件系统,而是将实际的文件系统装入内存的一种策略,并且可以作为根文件系统。在Linux的启动阶段,initrd提供了一套机制,将内核映像和根文件系统一起加载到内存中。2.Ramfs/TmpfsRamfs/Tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用Ramfs/Tmpfs来存储一些临时性或经常要修改的数据。Ramfs/Tmpfs相对于传统的Ramdisk的不同之处主要在于其不能被格式化,文件系统大小可随所含文件内容大小变化。5.4文件系统的制作5.4.1制作Ramdisk文件系统5.4.2制作YAFFS2文件系统5.4.3制作JFFS2文件系统5.4.4其他文件系统制作5.4.1制作Ramdisk文件系统制作根文件系统需要有如下目录:/dev、/bin、/usr、/sbin、/lib、/etc、/proc和/sys。下面分别简单介绍各个目录中存放的文件。(1)/dev目录下存放的是设备文件,用于访问系统资源或设备。(2)/bin、/usr/bin、/usr/sbin、/sbin存放的是二进制可执行文件。(3)/lib用于存放动态链接库。(4)/etc是用来存放初始化脚本和其他配置文件的。(5)/proc是用来挂载存放系统信息虚拟文件的系统。(6)/sys该目录下安装了2.6内核中新出现的sysfs文件系统。1.建立根文件目录前面提到过根文件目录主要包括/dev、/bin、/usr、/sbin、/lib、/etc、/proc、/sys、/var和/tmp。下面给出建立根文件目录的命令:#cd/usr/local#mkdirrootfs#cdrootfs#mkdirbindevetclibprocsbintmpusrvarsys#chmod777tmp#mkdirusr/binusr/libusr/sbin#mkdirvar/libvar/lockvar/logvar/runvar/tmp#chmod777var/tmp2.编译Busybox编译Busybox前先必须对需要的工具进行配置,通过图形界面选择工具,选择的原则是尽量选择必要的工具。下面是解压和进入配置界面命令:#tarjxvfbusybox-1.21.1.tar.bz2#cdbusybox-1.21.1#makemenuconfig3.将交叉编译器库复制到rootfs/lib下(1)将交叉编译器目录下库文件复制到rootfs/lib中时。(2)执行库文件的复制过程。4.建立所需设备文件需要的设备文件结点包括控制台console、内存mem等。建立各个设备结点的参数包括设备类型、主设备号和次设备号。5.建立文件系统映像文件准备目标系统启动所需要的文件rcS、inittab和fstab。这3个文件是制作文件系统最重要的文件。下面给出各个文件的内容。(1)/etc/init.d/rcS:挂载/etc/fstab指定的文件系统。(2)/etc/inittab:init进程的配置文件。(3)/etc/fstab:指定需要挂载的文件系统。6.建立文件系统映像文件建立根文件系统挂载点#mkdir/mnt/ramdisk建立大小为8192的根文件系统#mke2fs-vm0/dev/ram

8192挂载根文件系统#mount-text2/dev/ram/mnt/ramdisk对文件系统进行操作,将制作的文件系统拷贝到挂载点#cp-af

/usr/local/rootfs/*

/mnt/ramdisk退出/mnt/ramdisk目录才能进行卸载#cd/卸载文件#umount/mnt/ramdisk文件系统生成#ddif=/dev/ramof=ramdiskbs=1kcount=8192制作文件系统映像#gzip-v9ramdisk生成的映像文件为ramdisk,压缩后为ramdisk.gz。7.内核中支持RAM文件系统的初始化在编译内核时,在Generalsetup窗口中选择[*]InitialRAMfilesystemandRAMdisk(initramfs/initrd)support,同时在Initramfssource中传递初始化参数:initrd=0x21100000,8000000root=/dev/ramrwinit=linuxrcconsole=ttyS0,115200,mem=32M5.4.2制作YAFFS2文件系统如果开发板只有NandFlash,那么选择最合适的文件系统为YAFFS文件系统。mini2440只有NandFlash没有NorFlash,因此选择的文件系统为YAFFS2文件系统。1.制作文件系统时准备的源代码内核源代码和交叉编译器读者可以根据自己的实际情况选择具体的对应版本,yaffs2.tar.gz源码是必须的。linux-2.6.32.tar.bz2:内核源代码;yaffs2.tar.gz:YAFFS2文件系统源代码;arm-linux-gcc-4.4.3.tar.gz:交叉编译工具;mkyaffs2image.tar:制作YAFFS2文件系统工具。2.解压源码解压内核源码和交叉编译器的源码,并将yaffs2.tar.gz复制到内核源码的fs目录下进行解压。3.修改内核顶层Makefile在Makefile中设置目标平台为arm,交叉编译器为arm-linux。#vi

MakefileARCH?=$(SUBARCH)CROSS_COMPILE?=修改为ARCH?=armCROSS_COMPILE?=arm-linux-4.修改机器码在vivi启动时如果机器码与设置的不一致会出现提示,在文件arch/arm/

tools/mach-types中进行下面的修改。#vi

arch/arm/tools/mach-typess3c2440ARCH_S3C2440S3C2440362修改为s3c2440ARCH_S3C2440S3C24407825.修改时钟频率修改arch/arm/mach-s3c2440/mach-smdk2440.c中的时钟为12MHz,具体修改如下。staticvoid__initsmdk2440_map_io(void){s3c24xx_init_io(smdk2440_iodesc,ARRAY_SIZE(smdk2440_iodesc));//s3c24xx_init_clocks(16934400);s3c24xx_init_clocks(12000000);//将频率设置为12MHzs3c24xx_init_uarts(smdk2440_uartcfgs,ARRAY_SIZE(smdk2440_uartcfgs));}6.使内核支持YAFFS2解压yaffs2.tar.gz后进入YAFFS2目录,在YAFFS2目录下有可执行文件patch-ker.sh,执行如下命令:#./patch-ker.shc/usr/local/arm/linux-2.6.29.6执行该命令后,就会在fs的Kconfig和Makefile中增加对YAFFS2的编译选项的支持。在fs/Kconfig会自动添加:#PatchedbyYAFFSsource"fs/yaffs2/Kconfig"在fs/Makefile中会自动添加:#PatchedbyYAFFSobj-$(CONFIG_YAFFS_FS)+=yaffs2/7.使内核支持Mini2440在内核的SystemType-->ARMsystemtype选项下,选择SamsungS3C24xx系列。8.编译内核映像文件执行makezImage生成内核的映像文件,如果遇到下面的错误可以执行makedistclean进行清理,然后重新生成映像文件。ERROR:thesymlinkinclude/asmpointstoasm-x86butasm-armwasexpected

setARCHorsave.configandrun'makemrproper'tofixit#makedistclean#makezImage9.编译Busybox编译Busybox的配置细节可以参考5.2.1节。这里可以将Busybox交叉编译安装在_install文件中。10.为YAFFS文件系统准备lib库将交叉编译器目录下的库文件全部复制到lib库目录下,-d表示复制的时候包括链接文件一起复制过来。#cp-d/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib/*so*

./lib11.制作etc目录下必要的文件etc目录是文件系统中最重要的目录,系统配置的启动信息都在该目录下,下面分别给出必要的几个文件。(1)/etc/inittab文件。(2)etc/init.d/rcS文

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论