一步一步制作yaffs/yaffs2根文件系统(一)---储备好基础知识再打
开发环境:Ubuntu 12.04
开发板:mini2440 256M NandFlash 64M SDRAM
交叉编译器:arm-linux-gcc 4.4.3 点此可下载
BusyBox版本:busybox-1.13.3 点此可下载
yaffs制作工具:mkyaffsimage
yaffs2制作工具:mkyaffs2image(适合64M)、mkyaffs2image-128(适合128M以上)
写之前的罗嗦
这几天制作根文件系统整得我够呛,毕竟是初学制作,各种不会,各种谷歌百度,害的我过情人节都在想着根文件系统!之所以写下来,主要是想把自己的制作过程记下来,防止以后工作了忘记了,二也是和大家分享,希望能对你有所帮助!本节先讲理论知识,我倒是建议本节内容你可以大致浏览,做到“知道是这么回事”的程度就可以了,在后续的制作过程中再结合实际来理解本节内容。要感谢一位DpLife的大哥啊,耐心的在QQ上给我启示,排除问题原因,好人呐。
不管是想要制作yaffs文件,还是yaffs2,本文章都适合,只是最后使用不同的工具生成罢了。现在,开始吧!
主要参考书籍
《嵌入式Linux应用程序开发完全手册》
《国嵌内核驱动进阶教材》
文件系统简介
理论上说一个嵌入式设备如果内核能运行起来,且不需要用户进程的话(估计这种情况很少),是不需要文件系统的。文件系统简单的说就是一种目录结构,由于linux操作系统的设备在系统中是以文件的形式存在(这个很关键奥!和win7的不同之处就在于linux的Everything is a File!),将这些文件分类管理以及提供和内核交互的接口,就形成了一定的目录结构也就是文件系统。文件系统是为用户反映系统的一种形式,为用户提供一个检测控制系统的接口。
而根文件系统,就是一种特殊的文件系统。那么根文件系统和普通的文件系统有什么区别呢?借用书上的话说就是,根文件系统就是内核启动时挂载的第一个(第一个的意思就是不止一个吧,你看,区别出来了啊)文件系统。由于根文件系统是启动时挂载的第一个文件系统,那么根文件系统就要包括Linux启动时所必须的目录和关键性的文件,例如Linux 启动时都需要有用户进程 init 对应的文件,在Linux挂载分区时一定要会找 /etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序,如 /bin目录下的命令等。任何Linux启动时所必须的文件的文件系统都可以称为根文件系统。
Linux支持多种文件系统,如包括 ext2、ext3、vfat、jffs、ramfs、yaffs 和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统 VFS(可别小看这个VFS,它可是解决了linux启动时的“鸡生蛋,蛋生鸡”的问题呢),为各类文件系统提供一个统一的操作界面和应用程序接口。下图为Linux文件系统层次关系图
Yaffs 文件系统
YAFFS(Yet Another Flash File System)文件系统是专门为Nand Flash设计的文件系统,与JFFS/JFFS2文件系统有些类似,不同之处是 JFFS/JFFS2 文件系统是专门为Nor Flash的应用场合设计的,而Nor Flash和Nand Flash本质上有较大的区别(坏块、备用区、容量),所以尽管 JFFS/JFFS2文件系统也能用与Nand Flash,但对于Nand Flash来说,通常不是最优方案(性能较低,启动速度稍慢)。而YAFFS利用 NandFlash提供的每个页面16字节或64字节的Spare区(OOB备用区)空间来存放ECC和文件系统的组织信息,能够实现错误检测和坏块处理。这样的设计充分考虑了NandFlash以页面为存取单元的特点,将文件组织成固定大小的数据段,能够提高文件系统的加载速度。
YAFFS目前有yaffs、yaffs2两个版本,一般来说,yaffs对小页面(512B+16B/页)的NandFlash(68M)有很好的支持,yaffs2对更大的页面(2K+64B/页)的NandFlash(128M、256M或者更大)支持更好。不得不说说这个yaffs和yaffs2,前几天学习yaffs制作的时候,我一直以为它们两个的区别蛮大的(确实有区别),但是后来才发现基本的制作过程是一样的,不一样的只是最后生成这两个版本的工具不一样!!!!yafffs由mkyaffsimage生成,而yaffs2由mkyaffs2image生成!
BusyBox简介
BusyBox是一个遵循 GPLv2协议(这是依照书上打的,我可不知道这什么协议)的开源项目。有人将BusyBox比喻成Linux工具的瑞士军刀,简单的说就是Linux的一个大的工具集,包括了Linux中的大部分命令和工具。BusyBox中各种命令与相应的 GNU工具相比,所能提供的选项较少,但是能够满足一般应用。因此,BusyBox主要是为各种小型设备或者嵌入式系统提供。你看,下图就是利用BusyBox安装在根文件系统内的bin目录下的命令。
嵌入式根目录下的bin,sbin和usr目录中的命令以及启动程序linuxrc通常就是通过BusyBox产生的。BusyBox产生的。BusyBox会根据配置的不同自动生成一些文件,但是有些根文件系统下的文件还是需要用户自己建立。
Linux 根文件系统目录结构
为了在安装软件时能够预知文件、目录的位置,为了让用户方便地找到不同类型的文件,在构造文件系统时,建议遵循FHS标准(File Hierarchy Standard,文件系统层次标准)。它定义了文件系统中目录、文件分类存放的原则,定义了系统运行时所需的最小文件、目录的集合,并列举了不遵循这些原则的例外情况及其原因。FHS并不是一个强制的标准,但是大多的Linux、Unix发行版本都遵循FHS。
Linux根文件系统中一般有如图2所示的几个目录,如下图
下面依次讲述这几个目录的作用(很可能你会看烦,但是我保证,它真的需要你静下心去理解,可以在制作的过程中再返回来看)
1、/bin 目录
该目录下存放所有用户(包括系统管理员和一般用户)都可以使用的、基本的命令。
/bin 目录下常用的命令有:cat、chgrp、chmod、cp、ls、sh、kill、mount、umount、mkdir等。
2、/sbin目录
该目录下存放系统命令,即只有管理员能够使用的命令、系统命令还可以存放在/usr/sbin、/usr/local/sbin目录下。/sbin 目录中存放的是基本的系统命令,它们用于启动系统、修复系统等,与/bin目录相似,在挂接其他文件系统之前就可以使用 /sbin。
/sbin目录下常用的命令有:shutdown、reboot、fdisk、fsck等。
不是急迫需要使用的命令存放在/usr/sbin目录下。本地安装的(Locally-installed)的系统命令存放在/usr/local/sbin目录下。
3、/dev 目录
该目录下存放的是设备文件。设备文件是Linux中特有的文件类型,在Linux系统下,以文件的方式访问各种外设,即通过读写某个设备文件操作某个具体硬件。比如通过“/dev/ttySAC0”文件可以操作串口0,通过“/dev/mtdblock1”可以访问MTD设备(NAND Flash、Nor Flash等)的第2个分区。在接下来利用uboot启动的时候要设置入口参数 setenv bootargs "noinitrd root=/dev/mtdblock3 rootfsyle=yaffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M",其中的就是mtdblock3,有的人可能会问为什么是mtdblock3,而不是mtdblock2呢?这和你的nand flash分区有关,咱们在内核移植的时候将nandflash分成了4个区,如下
其中的root分区就是用来存放yaffs文件系统的,对应的为/dev/mtdblock3!
设备文件有两种:字符设备和块设备。设备文件可以使用mknod命令创建,详细的就不讲述了。
/dev 的创建有3中方法:
① 手动创建
在制作根文件系统的时候,就在/dev 目录下使用mknod命令创建好要使用的设备文件,比如ttySAC0等。系统挂接根文件系统后,就可以使用/dev目录下的设备文件了。但是这种方法只能使用已经创建好的设备文件,万一我以后再插上优盘的时候,优盘这样的设备文件岂不是不能用了?佛说:不好....不好....
② 使用devfs文件系统。韦老师的书上说已经过时,我直接略过了。
③ udev
udev 是个用户程序(u是指user space,dev是指device),它能够根据系统中硬件设备的状态更新设备文件,包括设备文件的创建、删除等。使用udev机制也不需要在/dev 目录下创建设备节点,它需要一些用户程序的支持,并且内核要支持sysfs文件系统。它的操作相对复杂,但是灵活性很高。
在 BusyBox中有一个mdev命令(注意,是命令奥),它是udev命令的简化版本。适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox为基础构建嵌入式linux的根文件系统时,使用它是最优的选择。我接下来的创建根文件系统会用这种方法。
下一节:http://blog.csdn.net/mybelief321/article/details/9995199