开发环境: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

一步一步制作yaffs/yaffs2根文件系统(一)---储备好基础知识再打的更多相关文章

  1. 一步一步制作yaffs/yaffs2根文件系统(七)---真挚地道歉以及纠正前边出现的错误!

    接上一节http://blog.csdn.net/mybelief321/article/details/10040939 说实话,我当时写这个系列的博文的时候,感觉对BusyBox算是有点了解,直到 ...

  2. 一步一步制作yaffs/yaffs2根文件系统(四)---构建etc、dev等剩余目录

    开发环境:Ubuntu 12.04 开发板:mini2440  256M NandFlash   64M SDRAM 交叉编译器:arm-linux-gcc 4.4.3点此可下载 BusyBox版本: ...

  3. 一步一步制作yaffs/yaffs2根文件系统(二)---安装BusyBox,构造/bin、/sbin、/usr、linuxr

    开发环境:Ubuntu 12.04 开发板:mini2440  256M NandFlash   64M SDRAM 交叉编译器:arm-linux-gcc 4.4.3点此可下载 BusyBox版本: ...

  4. 一步一步制作yaffs/yaffs2根文件系统(三)---使用glibc库构造 /lib

    开发环境:Ubuntu 12.04 开发板:mini2440  256M NandFlash   64M SDRAM glibc库:点此下载 交叉编译器:arm-linux-gcc 4.4.3点此可下 ...

  5. Yaffs2根文件系统制作

    Yaffs2根文件系统制作 环境: 交叉编译环境:4.4.6 开发平台:s3c2416 1,编译busybox 获取busybox源码busybox-1.17.2.tar (http://www.bu ...

  6. 制作ramdisk-u.img根文件系统

    具体步骤如下:1.解压内核源码树解压linux-2.6.29-mini2440-20090708.tgz到自己的工作目录,会生成一个友善之臂修改过的并且有几个mini2440默认配置文件的内核源码目录 ...

  7. 使用BusyBox制作嵌入式Linux根文件系统

    STEP 1:构建目录结构  创建根文件系统目录,主要包括以下目录/dev  /etc /lib  /usr  /var /proc /tmp /home /root /mnt /bin  /sbin ...

  8. yaffs2根文件系统的构建过程

    基于BusyBox-1.19.2  (以其它作者的作为参考) 1. 下载BusyBox的源码 http://busybox.net/ 2. 解压#tar xvzf busybox-1.19.2.tgz ...

  9. Busybox制作ARM(iTOP4412) 根文件系统

    本记录来源与自身操作过程. 1.制作环境 PC环境:外部Winows8.1 内部则为vmware11+ubuntu12.04 嵌入式设备:iTOP4412 交叉工具:arm-none-linux-gn ...

随机推荐

  1. 使用UDP进行数据发送的实例一

    首先如果TCP学过以后,再看UDP进行数据传输也是大同小异的,只是用到的类不同 UDP进行传输需要DataSocket和Datapacket类,Datapacket叫数据报,每一个数据报不能大于64k ...

  2. JS滑动门,JQuery滑动门

    <a href="#" id="one1" onmouseover="setTab('one',1,2)" class="h ...

  3. checkBox控件的CheckedChanged与CheckedStateChanged区别

    Checked属性为bool类型,CheckState属性为枚举类型(CheckState.Checked.CheckState.Unchecked和CheckState.Indeterminate) ...

  4. 解决 Chrome 浏览器自动调整小于11px字体的问题

    不知道说是 Chrome 智能呢?还是说它多此一举?Chrome 浏览器中存在默认会自动将小于11px大小的字体调整为12px.我在写 BlueNight 主题的最新评论时候就设置了评论发布时间为11 ...

  5. ARM-Linux S5PV210 UART驱动(6)----platform device的添加

    开发板是飞凌OK210 arch/arm/mach-s5pv210/mach-smdkc110.c 首先是UART的寄存器默认配置信息: /* Following are default values ...

  6. 开始学习python

    刚刚离开学校,到公司实习,发现所有的技术都是崭新的,所有的工具都是熟悉中带着陌生. 就像是孤身一人到了一个曾经只闻其名的偌大城市,看什么都觉得新鲜,做什么都心有畏惧.幸好 搞软件并没有那么多人情世故, ...

  7. 1036. Boys vs Girls (25)

    #include <stdio.h>#include <string.h>int main(){ int n,i; while(scanf("%d",&am ...

  8. Jsonp 跨域请求实例

    关于jsonp的一个实例,其实自己也不是很了解,今天下午稍微研究了一下: 简单来说,jsonp就是为了两个不同网站之间数据传递而产生的,主要用于js脚本,因为浏览器本身是禁止跨域访问的: 本机实例: ...

  9. 传统ASP.NET开发和MVC的设计思想

    传统ASP.NET开发 第一步:客户端请求服务器: 第二步:服务器从数据库取得数据处理后响应给客户端页面. MVC的设计思想 第一步:客户端请求控制器(里面的一个方法): 第二步:控制器从数据库里取得 ...

  10. UITableViewCell 重合问题解决方法

    这两天做ios遇到一个UITableViewCell 数据重合的问题,原因:引起这个问题的主要原因是,重用cell.之前cell上的内容未被清空,而又增加新增内容所致.从网上查了一些解决方法,比如: ...