《基于ARM9的嵌入式Linux系统开发原理与实践》课件第9章_第1页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第9章_第2页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第9章_第3页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第9章_第4页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第9章_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

第9章嵌入式Linux根文件系统9.1文件系统9.2Linux文件系统9.3嵌入式闪存文件系统9.4构建嵌入式Linux根文件系统原理9.5构建嵌入式Linux根文件系统实例——

CramFS根文件系统构建(博创2410)本章小结

9.1文件系统

9.1.1文件系统简介

理论上说一个嵌入式设备如果内核能够运行起来,且不需要运行用户进程的话,是不需要文件系统的,文件系统简单的说就是一种目录结构。由于Linux操作系统的设备在系统中是以文件的形式存在,将这些文件进行分类管理以及提供和内核交互的接口,就形成一定的目录结构也就是文件系统。文件系统是为用户反映系统的一种形式,为用户提供一个检测控制系统的接口。9.1.2文件和目录

1.文件和目录概述

1)文件

绝大多数操作系统(从DOS到Windows,从Unix到Linux)中都有文件的概念。简单的讲文件就是一组相关纪录的集合。Linux中文件是无结构的字符流,即文件中的任两个字节是完全独立的。具体的信息要放到相应的环境中才能理解。

2)目录

文件多了就会发生混乱,因此目录就出现了。目录就是存放一组文件的“夹子”,Windows中的“文件夹”就是这个概念。目录就是一组相关文件的集合,我们通常都通过目录来管理文件。目录和文件一样也有自己的名字。而一个目录下面除了可以存放文件之外,还可以存放目录,称为这个目录的子目录。这个子目录之下还可以有它自己的子目录,依此类推从而形成一个树状目录结构。

3)路径

使用任何操作系统的用户应该都对这个概念较熟悉。打个比方,某个文件就好像是在一个写字楼中的一间办公室内的一把椅子,当然还有其他很多椅子也在这个办公室里。现在要把它找出来坐在上面办公,那么只知道这个椅子是什么样的还不行,还需要知道如何到达那里。文件名就是这把椅子,而路径就是用来说明如何找到该椅子的。

4)文件目录命名规则

和DOS相比,Linux文件命名相当宽松。Linux文件名可以由字母、数字和一些标点符号组成。文件名中不能包含有空格和下列的字符:

!@#$%^&*()"\/|;<>2.文件类型

Linux文件系统中包括以下类型的文件:

(1)文本文件。

(2)二进制文件。

(3)目录文件。

(4)连接文件。

(5)设备文件。

(6)管道文件。9.1.3文件权限

1.文件权限的概念

与Unix一样,Linux系统也是多用户系统。这样就产生了一个用户的文件会不会暴露在另一个用户面前的问题。为了保护用户的私人文件不被其他用户所侵犯,就出现了文件权限的概念。这种文件权限的概念允许文件和目录归一个特定的用户所拥有。用户权限除了对他所拥有的文件或目录进行存取或其他操作,也包括限制其他用户在这些文件上的存取和操作。

2.文件权限的构成

文件的权限有三种:读、写和执行。读权限允许用户阅读文件的内容,对目录来说,允许用户列出目录中的内容;写权限允许用户写和修改文件,对目录来说,写权限允许用户在这个目录中建立新文件或删除文件;执行权限允许用户运行文件,对目录来说,执行权限允许用户进入和退出该目录。

3.文件权限的依赖性

要特别注意的是,用户对文件所拥有的权限依赖于他对文件所属的目录所拥有的权限。虽然一个文件的权限为“-rwxrwxrwx”,但其他用户也只有在对该文件所属目录拥有读写和执行权限时,才能够对该文件进行读、写和执行。

4.改变文件权限

在系统应用中有时需要让其他用户使用某个他本来不能使用的文件的时候,就需要改变文件的权限。在Linux中,使用chmod命令来进行有关权限的设置。但只有当文件的拥有者对某个文件有写的权限时,他才能够改变该文件的权限(超级用户对所有文件进行权限设置)。chmod的命令格式主要有两种,下面是直接设置文件权限的第一种格式:

chmod[-R]modefilename1filename2...9.1.4文件链接

1.硬链接

Linux系统是通过使用文件的i节点号来标识文件的,i节点号是文件系统中文件的唯一标识符。目录实际上是i节点号和其相应文件名的一个列表。目录中的每一个文件都是一个与特定的i节点的链接。硬链接就是为文件另取一个文件名并将它与原来的i节点链接。可以使用1n命令来为一个文件建立多个链接。

2.符号链接

符号链接与硬链接不同,它是另一种类型的链接。符号链接允许用户为文件另取一个名字,但却不将其与i节点相链接。

可以用1n-s命令建立一个文件的符号链接。使用命令:

1n-sgyg01.gifnyp01.gif9.1.5文件系统

操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:

①与文件管理有关的软件;

②被管理的文件;

③实施文件管理所需的数据结构。

9.2Linux文件系统

9.2.1Linux文件系统概述

Linux中用户能看到的文件空间是一个单树状结构的,该树的根在顶部,称为根目录(root),用“/”表示。文件空间中的各种目录和文件从树根向下分支。9.2.2Linux文件系统组成

Linux操作系统由一些目录和文件组成。根据安装的方式不同,这些目录可能是不同的文件系统。通常,一个系统可以由多个文件系统组成:根分区文件系统( / ),和安装在 /usr下的文件系统,还有其他安装在 /home、/var的文件系统。其中,根文件系统必须是Linuxext2/3,或者ReiserFS等。9.2.3Linux文件系统管理

Linux文件系统管理最上层模块是根文件系统。系统启动时,必首先装入“根”文件系统,然后根据 /etc/fstab中制订,逐个建立文件系统。此外,用户也可以通过mount、umount操作,随时安装和卸载文件系统。9.2.4虚拟文件系统(VFS)

Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(VirtualFileSystem),为各类文件系统提供一个统一的操作界面和应用编程接口。图9-1Linux下的文件系统结构

9.2.5安装和卸载文件系统

要在Linux目录树中安装一个文件系统,必须要有实际要安装的硬盘分区、光盘或软盘,并且作为该文件系统安装点的目录必须是实际存在的。

手工安装文件系统。命令是:

mount[options]<device><mount_point>

9.3嵌入式闪存文件系统

Linux启动时,若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件

系统。9.3.1嵌入式系统存储设备及其管理机制分析

构建适用于嵌入式系统的Linux文件系统,必然会涉及到两个关键点:一是文件系统类型的选择,它关系到文件系统的读写性能、尺寸大小;另一个就是根文件系统内容的选择,它关系到根文件系统所能提供的功能及尺寸大小。

1. Blkmem驱动层

Blkmem驱动是为uclinux专门设计的,也是最早的一种块驱动程序之一,现在仍然有很多嵌入式Linux操作系统选用它作为块驱动程序,尤其是在uClinux中。它相对来说是最简单的,而且只支持建立在NOR型Flash和RAM中的根文件系统。使用Blkmem驱动,建立Flash分区配置比较困难,这种驱动程序为Flash提供了一些基本擦除/写操作。

2. RAMdisk驱动层

RAMdisk驱动层通常应用在标准Linux中无盘工作站的启动,对Flash存储器并不提供任何的直接支持,RAMdisk就是在开机时,把一部分的内存虚拟成块设备,并且把之前所准备好的档案系统映像解压缩到该RAMdisk环境中。当在Flash中放置一个压缩的文件系统,可以将文件系统解压到RAM,使用RAMdisk驱动层支持一个保持在RAM中的文件系统。

3. MTD驱动层

为了尽可能避免针对不同的技术使用不同的工具,以及为不同的技术提供共同的能力,Linux内核纳入了MTD子系统(MemoryTechnologyDevice)。它提供了一致且统一的接口,让底层的MTD芯片驱动程序无缝地与较高层接口组合在一起。JFFS2、Cramfs,、YAFFS等文件系统都可以被安装成MTD块设备。MTD驱动也可以为那些支持CFI接口的NOR型Flash提供支持。9.3.2基于Flash的文件系统

1. Romfs

传统型的Romfs文件系统是最常使用的一种文件系统,它是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,它按顺序存放所有的文件数据,所以这种文件系统格式支持应用程序以XIP方式运行,在系统运行时,可以获得可观的RAM节省空间。uClinux系统通常采用Romfs文件系统。

2. Cramfs

Cramfs是Linux的创始人LinusTorvalds开发的一种可压缩只读文件系统,在Cramfs文件系统中,每一页被单独压缩,可以随机页访问,其压缩比高达2 : 1,为嵌入式系统节省大量的Flash存储空间。

3. Ramfs/Tmpfs

Ramfs也是LinusTorvalds开发的,Ramfs文件系统把所有的文件都放在RAM里运行,通常是Flash系统用来存储一些临时性或经常要修改的数据。

4. JFFS2

JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux和uCLinux中。

5. YAFFS

YAFFS/YAFFS2是一种和JFFSx类似的闪存文件系统,它是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。和JFFS2相比,它减少了一些功能,所以速度更快,而且对内存的占用比较小。此外,YAFFS自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。9.3.3基于RAM的文件系统

1. Ramdisk

Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。

2. ramfs/tmpfs

ramfs是LinusTorvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。)9.3.4网络文件系统NFS(NetworkFileSystem)

NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。

9.4构建嵌入式Linux根文件系统原理

一个根文件系统是支持Linux内核系统正常运行的一些基本内容。它应该提供给系统和软件使用的库(如Glibc),和供用户使用的支持系统和用户使用的软件。一般来说包含以下几个内容:

(1)基本的目录结构。

(2)供给基本程序运行所需的库。

(3)用户自己的脚本配置文件。

(4)必要的设备文件的支持。

(5)一些基本的应用程序。

(6)一些启动时需要加载的驱动模块。9.4.1根文件系统关键目录

1. bin目录的文件

该目录下主要存放Shell和各种命令程序。通常通过busybox生成,busybox是一个开源程序。

2. dev目录的文件

该目录下存放的是设备文件,对应每一个外部设备。如果要操作一个设备,必须首先打开这个设备对应的设备文件,然后才能读写。也可以通过脚本自动生成,便于扩展和修改。

3. etc目录的文件

该目录主要存放配置文件和启动脚本。

4. lib目录的文件

该目录下主要存放动态链接需要的库。如果编译busybox和应用程序都采用静态链接,那么是不需要库的,但这样的代价是每一个可执行文件都链接了需要的二进制代码,而这些代码可能是重复的,造成每一个单独的可执行文件过大,对于Flash较小的系统是很难接受的。如果采用动态链接,则会大大减少可执行文件的大小。9.4.2根文件系统关键文件

1. linuxrc文件

linuxrc文件用于加载模块驱动等,运行在init进程启动之前,它退出后内核才会调用init进程读取inittab中的设置,它是执行init进程初始化文件。

2. inittab文件

/linuxrc文件中看到它最后运行了

/sbin/init,而init又会根据

/etc/inittab来运行。inittab文件条目格式:

id:runlevels:action:process

3. rcS文件

从inittab实例中可以看到现在根文件系统启动到达 /etc/init.d/rcS,rcS文件是进行一些主机名的设置,显示一些登录欢迎信息等。

4. fstab文件

fstab文件存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过“mount/directoryname”命令来加载一个文件系统。每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。同时,fsck、mount、umount等命令都可利用该程序。

5. profile文件

这个文件主要是为系统添加环境变量。9.4.3BusyBox

1. BusyBox简介

BusyBox使用一个文件整合很多微型版本的Unix工具。它可提供多数GNU文件工具、Shell脚本工具,如cp、sh、ls、mv等。被非常形象地称为嵌入式Linux系统中的“瑞士军刀”。

2.基于BusyBox构建根文件系统

BusyBox把所有的命令都编译成一个文件BusyBox,其他命令工具都是指向BusyBox的连接。BusyBox在调用时,会根据调用连接的文件名转到特定的处理程序。这样,所有的这些程序只需被加载一次,而所有BusyBox组件都可以共享相同的代码段,这在很大程度上节省了系统的内存资源和应用程序的执行速度。图9-2Busybox的图形化编译界面

9.5构建嵌入式Linux根文件系统

实例——CramFS根文件系统构建

(博创2410)

首先做准备工作:

(1)下载所需的源文件。

(2)在内核中加入对CramFS文件系统支持。9.5.1创建根文件系统目录

建立工作目录:

[root@localhostmxl]#pwd

/home/mxl

[root@localhostmxl]#mkdirroot

[root@localhostmxl]#cdroot

[root@localhostroot]#mkdirbuild_rootfs9.5.2创建设备文件

最省事的做法是到系统 /dev把所有的device打一个包,拷贝到dev下面;或者使用mknod来自己建所需要的device。9.5.3编译BusyBox

标准的Linux发行版本具有功能种类比较多的应用程序,这些应用程序占用的空间也很大,这对存储容量空间有限的开发板来说就不是理想的选择,在嵌入式开发过程中,经常用BusyBox来定制应用程序。BusyBox具有Shell的功能,它能提供系统所需要的大部分工具,包括编辑工具、网络工具、模块加载工具、压缩解压缩工具、查找工具、帐号密码管理工具和进程相关工具等。

1.先对源码进行解压(拷贝busybox-1.9.2.tar.gz到/home/mxl/root下)

[root@localhostroot]#tar-jxvfbusybox-1.9.2.tar.gz

[root@localhostroot]#cdbusybox-1.9.2

[root@localhostbusybox-1.9.2]#viMakefile

修改Makefile,找到ARCH和CROSSCOMPILE修改如下:

ARCH?=arm

CROSS_COMPILE?=/usr/local/arm/3.4.1/bin/arm-linux-

2.修改编译配置选项

[root@localhostbusybox-1.9.2]#makedefconfig

[root@localhostbusybox-1.9.2]#makemenuconfig

3.编译BusyBox

[root@localhostbusybox-1.9.2]#makeinstall

在busybox/_install目录下会生成我们需要的文件。

修改_install/bin/busybox的属性为4755,

[root@localhostbusybox-1.9.2]#chmod4755./_

install/bin/busybox9.5.4系统配置文件的建立

系统配置文件放在/etc目录下。

1.创建inittab文件

这个文件是init的初始化配置文件,是系统启动后第一个访问的脚本文件,后续的启动文件是由它指定的。

::sysinit:/etc/init.d/rcS

::respawn:-/bin/sh

::ctrlaltdel:/sbin/reboot

::shutdown:/sbin/swapoff-a

::shutdown:/bin/umount-a-r

2.创建

/etc/init.d文件夹和rcS文件

/etc/init.d/rcS是BusyBox中系统启动时默认的配置脚本。需要启动的进程和需要进行的设置可以放到这个文件里面,并在其中加入必要的初始化工作。

在rcS中添加:

#!/bin/sh

echo“StartingSystem”

hostnameuptech-s3c2410

/bin/mount-tprocproc/proc

/sbin/ifconfigeth0192.168.0.4

3.创建fstab文件

这个是mount文件系统时的配置文件。它指定了系统挂载块设备和目录的关系,需要和实际的系统相配合。在这里使用一个简单的fstab文件内容:

proc

/proc

proc

defaults

0

09.5.5添加应用程序

这里我们编写一个简单的应用程序打印一句问候语,程序代码如下:9.5.6创建lib库文件

以上面这个简单的hellolinux程序为例。在不知道需要什么的库的前提下,在开发板中运行经过交叉编译过的程序,看看提示需要什么库,然后再将相应的库文件考到文件系统的/lib下即可。hello.c这个程序需要的库文件有libc.so.6和ld-linux.so.2,但是这两个库只是一个链接文件,需要连同真正的库一起拷贝过来,所以需要使用命令查看他们的真正

文件。9.5.8下载cramfs根文件系统映像到开发板

重启第7章成功移植的引导程序vivi,进入下载模式,运行命令:

vivi>loadflashrootx

将新根文件系统映像mxlrootfs下载到开发板中,如图9-3所示。图9-3串口下载根文件系统映像mxlrootfs9.5.9测试cramfs根文件系统

下载完毕重启系统,超级终端可看到cramfs根文件系统的最终启动,如图9-4所示。图9-4cramfs根文件系统启动图9-5hello应用程序执行结果9.5.10cramfs根文件系统制作中的常见错误及解决办法

1. cramfs根文件系统构建后虚拟机不能启动

虚拟机启动后会出现如下信息:

***ANerroroccurredduringthefilesystemcheck

***Droppingyoutoa

温馨提示

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

评论

0/150

提交评论