嵌入式文件系统
>>基本概念
一、文件
文件是一个抽象概念,它是存放数据和信息的仓库。
文件的载体通常是磁盘。
二、文件系统
文件系统是磁盘文件的管理系统,根据用户提供的逻辑地址(路径和文件名)查找文件的物理地址。
包括了所有磁盘分区、目录、存储设备和文件的一个集合体。
功能:1、用户通过文件系统可直接与操作系统交互,是操作系统的一部分,负责即时检索、读写、操作等。
2、文件的即时存储、访问数据和程序。
>>虚拟文件系统VFS
一、功能
为了在不同文件系统之间可以方便地交换数据和管理,支持任意地挂载不同现代操作系统,大多都在系统内核和文件系统之间提供一个叫做虚拟文件系统VFS的标准接口。
1、 Linux虚拟文件系统是各逻辑文件系统的管理者。
2、 Linux虚拟文件系统是一组内核函数,是用户程序的系统调用接口或操作界面。
二、基本概念
1、文件:是文件描述符,存放打开的文件与进程之间进程交互的有关信息的对象,此对象仅当进程访问文件期间存在于内存中。
2、索引节点:是文件系统中的基本对象,存放关于磁盘上具体存在的文件一般信息。每个文件都有此对象,每个对象对应一个索引节点号,此号唯一地标示着一个文件。
3、超级块:是存放系统中已安装的文件系统有关信息的对象,对于基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件系统控制块(FCB),也就是说,每个文件系统都对应一个超级块对象,此对象也称作文件系统是索引节点的集合,其中有一个节点被称作根节点。(root)
二、ext2文件系统
1、是Linux默认的文件系统类型。
普通文件是三级索引结构
目录文件是树型结构
设备是特殊文件。
3、 磁盘的空间结构
引导块 | 超级块 | 索引节点位图 | 索引节点表 | …… |
Linux文件系统用位图来管理磁盘和索引节点,位图分为块位图和索引节点位图,占用一个磁盘块,用“1,0”表示磁盘空闲、占用。
三、Linux支持的文件系统
除了安装Linux可选择ext3\reiserfs\ext2外,还支持苹果的HFS,也支持其它UNIX操作系统的文件系统,比如:XFS、JFS、minixfs、UFS,也支持windows文件系统NTFS和FAT,还支持网络文件系统NFS。
>>嵌入式文件系统
一、设计原则
使用便捷
安全性、可靠性高
及时响应
开放的体系结构:开放性、可移植性
二、嵌入式系统中的数据存储和管理
嵌入式系统的存储器是常用的FLASH
FLASH分为:
1、 NOR FLASH,一般小于16M,文件系统通常是JFFS(日志闪存文件系统)
2、 NAND FLASH,一般大于16M,文件系统通常是YAFFS文件系统。
三、YAFFS文件系统
类似于JFFS/JFFS2,是专门为NAND闪存设计的嵌入式文件系统,适用于大容量的存储设备,是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外掉电对文件系统一致性和完整性的影响。
YAFFS是按层次结构设计的,分为文件系统管理层接口、YAFFS内部实现层和NAND接口层,简化了其它系统的接口设计,可以方便地集成到系统中。
1、 YAFFS文件组织结构
将文件组织成固定大小(512B)的数据段,每个文件都有一个页面专门存放文件头。
2、 YAFFS物理数据组织
YAFFS利用NAND闪存提供的每个页面16B的备用空间,备用空间中6B被用作页面数据的ECC(Error Correction code)。2B用作块状态字和数据状态字,其余8B有来存放文件系统的组织信息,即元数据。
3、 YAFFS擦除块和页面分配
用数据结构来描述每个擦除块的状态。该数据结构记录了块状态,并用一个32b的位图来表示块内各个页面的使用情况。
4、 YAFFS垃圾收集机制
是一种多策略混合的算法来进行垃圾回收,将贪心策略和随机选择策略按一定比例混合使用:当满足特定的小概率条件时,垃圾回收器会试图随机选择一个可回收的页面,而在其它情况下,则使用贪心策略回收“赃”块。
>>构建Linux根文件系统
一、Linux根文件系统包含内容
内核启动的最后一步:挂载根文件系统
包含内容:init进程
Shell
文件系统、网络系统等等的工具集
系统配置文件
链接库
二、Linux根文件系统目录结构
Bin:必要的用户命令(二进制文件)
Sbin:必要的系统管理员命令
Dev:设备文件及其它特殊文件
Etc:系统配置文件
Lib:必要的系统链接库
Mnt:临时挂载的文件系统的挂载点
Proc:提供内核和进程信息
Tmp:临时文件目录
Usr:多数用户使用的应用程序和目录
Var:监控程序和工具程序存放的可变数据
*boot:引导加载程序的静态文件
*home:用户主目录
*opt:附加软件的安装目录
*root:root管理员主目录
*嵌入式Linux可选的目录
三、BusyBox工具集
Busy Box在嵌入式Linux中有“瑞士军刀”,是一个很小的应用软件,但提供完整的工具集。
BusyBox配置和交叉编译步骤:
1、 下载BusyBox,例busy-box.tar.bz2
2、 解压该压缩文件
Tar xvfj busy-box.tar.bz2
3、 进入解压目录
Cd busy-box
4、 进行配置,选择配置菜单
Make menuconfig
5、 选择BusyBox的编译方式
Build options
Build BusyBox as a static binary(no shared libs)缺省配置为使用链接库
6、 配置交叉编译器
Build Options
Do you want to build BusyBox with a cross compile?(/usr/local/arm/3.4.1/bin/arm-linux-)
7、 配置安装路径
(./_install)BusyBox installation prefix
8、 配置其他工具集
Init Utilities
[]init
[]support reading an inittab file
[]support runnig init from within an initrd?
9、 编译BosyBox
Make dep
Make
Make install
四、根文件系统的启动流程
内核启动之后,执行第一个进程init,实际上执行的就是BusyBox的/sbin/init
Init的工作是根据/etc/inittab脚本来进行系统的初始化
::sysinit:/etc/init.d/rc.S指定运行的第一个程序/脚本
::respawn:/bin/bash若该进程结束,init会启动下面脚本
:ctraltdel:/bin/umount –a –r 指定用户按下ctrl-alt-del后执行的命令
/etc/init.d/rc.S在rcS中挂载文件系统,并且执行脚本/usr/etc/rc.local
/usr/etc/rc.local继续设置,并运行用户的启动运行脚本init.sh
五、根文件系统烧写流程
一、下载根文件系统yaffs文件系统挂载目录/mnt/yaffs
二、设置vivi的启动参数
Root=/dev/mtdblock/1
实验:构建根文件系统映像
1、 进入BusyBox,make menuconfig
2、 Make
3、 Make install
生成./_install目录
4、 cp –af ./_instll root
5、 mkcramfs root root.cramfs