zoukankan      html  css  js  c++  java
  • 一步一步制作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

  • 相关阅读:
    CodeForces 734F Anton and School
    CodeForces 733F Drivers Dissatisfaction
    CodeForces 733C Epidemic in Monstropolis
    ZOJ 3498 Javabeans
    ZOJ 3497 Mistwald
    ZOJ 3495 Lego Bricks
    CodeForces 732F Tourist Reform
    CodeForces 732E Sockets
    CodeForces 731E Funny Game
    CodeForces 731D 80-th Level Archeology
  • 原文地址:https://www.cnblogs.com/james1207/p/3265463.html
Copyright © 2011-2022 走看看