第 9 章 文件系统

142
9 9 第第第第第第

description

第 9 章 文件系统. 文件系统的选择是系统能够正常运行的基本条件。 使用了某种文件系统,就必须遵守其中的规则,否则,您在使用计算机的过程中就会遇到一些问题。. 本章主要介绍了: ◆ Linux 的文件系统结构。 ◆ Linux 采用的 VFS ,支持如 romfs 、 ramfs 、 ex2 、 jffs2 、 ms-dos 、 nfs 等各种文件系统。 ◆ Linux 源程序和开发板根文件系统 romfs 的目录结构和功能描述。 ◆ 在 uClinux 中文件的打开和读写操作示例。. 9.1 文件系统结构. - PowerPoint PPT Presentation

Transcript of 第 9 章 文件系统

Page 1: 第 9 章     文件系统

第第 99 章 文件系统章 文件系统

Page 2: 第 9 章     文件系统

文件系统的选择是系统能够正常运行文件系统的选择是系统能够正常运行的基本条件。的基本条件。 使用了某种文件系统,就必须遵守其使用了某种文件系统,就必须遵守其中的规则,否则,您在使用计算机的过程中的规则,否则,您在使用计算机的过程中就会遇到一些问题。中就会遇到一些问题。

Page 3: 第 9 章     文件系统

本章主要介绍了:本章主要介绍了:◆ ◆ LinuxLinux 的文件系统结构。的文件系统结构。◆ ◆ LinuxLinux 采用的采用的 VFSVFS ,支持如,支持如 romfsromfs 、、 ramframfss 、、 ex2ex2 、、 jffs2jffs2 、、 ms-dosms-dos 、、 nfsnfs 等各种文件等各种文件系统。系统。◆ ◆ LinuxLinux 源程序和开发板根文件系统源程序和开发板根文件系统 romfsromfs的目录结构和功能描述。的目录结构和功能描述。◆ ◆ 在在 uClinuxuClinux 中文件的打开和读写操作示例。中文件的打开和读写操作示例。

Page 4: 第 9 章     文件系统

9.1 9.1 文件系统结构文件系统结构 文件系统是操作系统的重要组成部分。文件系统是操作系统的重要组成部分。 LinuxLinux 特性之一就是对多种文件系统的特性之一就是对多种文件系统的

支持。支持。 这种特性使得这种特性使得 LinuxLinux 很容易地同其他操很容易地同其他操作作

系统共存。 系统共存。

Page 5: 第 9 章     文件系统

文件系统的概念使得用户能够查看存文件系统的概念使得用户能够查看存储设备上的文件和路径而无须考虑实际物储设备上的文件和路径而无须考虑实际物理设备的文件系统类型。理设备的文件系统类型。 LinuxLinux 透明的支持许多不同的文件系透明的支持许多不同的文件系统,将各种安装的文件和文件系统以一个统,将各种安装的文件和文件系统以一个完整的虚拟文件系统的形式呈现给用户。完整的虚拟文件系统的形式呈现给用户。

Page 6: 第 9 章     文件系统

LinuxLinux 在早期采用的是在早期采用的是 minixminix 文件系文件系统,但统,但 minixminix 只是一种教学型的文件系统,只是一种教学型的文件系统,它所管理的文件系统最大为它所管理的文件系统最大为 64MB64MB ,文件,文件名小于名小于 1414 个字符。个字符。 目前目前 LinuxLinux 中,使用的主流文件系中,使用的主流文件系统是统是 Ext2/3Ext2/3 。。

Page 7: 第 9 章     文件系统

除除 Ext2/3Ext2/3 以外,在以外,在 LinuxLinux 发展过程发展过程中,设计人员比较早的考虑到了对其他类中,设计人员比较早的考虑到了对其他类型文件系统的支持。型文件系统的支持。 要实现这一目的,需要将它们的操作要实现这一目的,需要将它们的操作和管理纳入统一的框架当中来,使得内核和管理纳入统一的框架当中来,使得内核的文件系统接口,如同标准的的文件系统的文件系统接口,如同标准的的文件系统“总线”,让用户通过同一组系统调用来“总线”,让用户通过同一组系统调用来管理和操作不同类型文件系统上的文件。 管理和操作不同类型文件系统上的文件。

Page 8: 第 9 章     文件系统

这个统一的、抽象的、虚拟的文件系这个统一的、抽象的、虚拟的文件系统接口,被称为统接口,被称为 VFS(virtual FileSystem SVFS(virtual FileSystem Switch)witch) ,它主要包含一组标准的文件操作,它主要包含一组标准的文件操作接口。接口。 通过通过 VFSVFS ,用户看到的都是一个个,用户看到的都是一个个的的 VFSVFS 文件,忽略了文件本身所处文件系文件,忽略了文件本身所处文件系统的差别。 统的差别。

Page 9: 第 9 章     文件系统

将内核比作计算机主板,那么将内核比作计算机主板,那么 VFSVFS就是一种标准的系统总线,各种文件系统就是一种标准的系统总线,各种文件系统就是插在该总线上的子卡,虽然各个子卡就是插在该总线上的子卡,虽然各个子卡的内部线路不同,但在总线接口处一致。的内部线路不同,但在总线接口处一致。 同时,内核看到的所有子卡的特性也同时,内核看到的所有子卡的特性也映射为具有共性的几类。映射为具有共性的几类。 如图如图9-19-1所示所示。。

Page 10: 第 9 章     文件系统

目前目前 LinuxLinux 系统支持的文件系统种类很多,系统支持的文件系统种类很多,包括包括 :: ntfsntfs (( windows NTwindows NT 的文件系统),的文件系统), msdosmsdos (( dosdos 的文件系统),的文件系统), isofsisofs(光盘文件系统),(光盘文件系统), nfsnfs(网络文件系统),(网络文件系统),

Page 11: 第 9 章     文件系统

romfsromfs (( romrom 中的文件系统),中的文件系统), smbfssmbfs (即(即 sambasamba ,可以在网络中与,可以在网络中与 win98win98、、 winntwinnt 共享),共享), procproc (目录(目录 /proc/proc 下的特殊文件系下的特殊文件系统),统), jffsjffs (( flashflash 中的文件系统)。中的文件系统)。

Page 12: 第 9 章     文件系统

当用户访问一个磁盘文件系统时,当用户访问一个磁盘文件系统时,对于目录树下的访问,最终将转换成对于对于目录树下的访问,最终将转换成对于这一部分物理磁盘的访问。这一部分物理磁盘的访问。 对于设备文件的访问,最终将转换对于设备文件的访问,最终将转换成对于对于驱动程序的访问。成对于对于驱动程序的访问。

Page 13: 第 9 章     文件系统

对于其他特殊文件的访问,一般是在对于其他特殊文件的访问,一般是在LinuxLinux 的内存数据结构中完成的。的内存数据结构中完成的。 对于磁盘文件系统中的文件的访问和对于磁盘文件系统中的文件的访问和磁盘设备文件的访问最终都反应在磁盘驱磁盘设备文件的访问最终都反应在磁盘驱动程序上,它们有什么不同吗? 动程序上,它们有什么不同吗?

Page 14: 第 9 章     文件系统

对于磁盘文件系统中文件的访问,是对于磁盘文件系统中文件的访问,是在文件目录树的结构下,对于有组织的数在文件目录树的结构下,对于有组织的数据进行的;据进行的; 而对磁盘设备文件进行访问,则是对而对磁盘设备文件进行访问,则是对于线性空间内数据的访问,也就是无法看于线性空间内数据的访问,也就是无法看到数据的组织情况。到数据的组织情况。 文件系统的层次结构如图文件系统的层次结构如图 9-29-2 所示。所示。

Page 15: 第 9 章     文件系统

9.2 9.2 文件系统类型文件系统类型 在在 uClinuxuClinux 的系统中,由于硬件资的系统中,由于硬件资源和使用环境的限制,一般内存的数量比源和使用环境的限制,一般内存的数量比较小(较小( 88 ~~ 32M32M 字节),外存只配置小容字节),外存只配置小容量的量的 FLASHFLASH ;所以,在;所以,在 uClinuxuClinux 中,比较中,比较常用的文件系统有常用的文件系统有 romfsromfs 文件系统,虚拟文件系统,虚拟ramdiskramdisk ,, JFFSJFFS 文件系统。文件系统。 对于有网络设备的系统,还可以使对于有网络设备的系统,还可以使用用 NFSNFS 文件系统。文件系统。

Page 16: 第 9 章     文件系统

9.2.1 romfs9.2.1 romfs 文件系统文件系统1. romfs1. romfs 特点特点 romfs(rom file system)romfs(rom file system) 是一种只读文件是一种只读文件系统,占用系统资源也比较小。 系统,占用系统资源也比较小。

Page 17: 第 9 章     文件系统

起初,设计它的目的是在启动盘起初,设计它的目的是在启动盘 (( 包包括光盘和软盘括光盘和软盘 )) 等场合下,提供一个比普通等场合下,提供一个比普通文件系统文件系统 (( 如功能强大的如功能强大的 ext2)ext2) 更加节省空更加节省空间的文件系统。间的文件系统。 创建创建 romfsromfs 文件系统需要使用文件系统需要使用 genrgenromfsomfs 工具。工具。

Page 18: 第 9 章     文件系统

目前目前 romfsromfs已经获得了广泛的应用,已经获得了广泛的应用,日趋成熟。日趋成熟。 根据根据 romfsromfs 开发者的介绍,如果把开发者的介绍,如果把文件系统编译成为文件系统编译成为 LinuxLinux 的一个内核的一个内核 modmoduleule 进行加载,那么进行加载,那么 minixminix 文件系统编译出文件系统编译出来的来的 modulemodule 的大小将会超过的大小将会超过 20KB(20KB( 经测经测试在试在 2.4.72.4.7内核中编译出来的内核中编译出来的 minix.ominix.o 是是 3339093909 字节字节 )) ,而采用,而采用 i586i586编码编码 ((即在普通即在普通奔腾机上奔腾机上 )) 的的 romfsromfs 的的 modulemodule 可以不超可以不超过过 11 个代码页即个代码页即 4KB(4KB(测试结果测试结果 2.4.72.4.7内核内核中是中是 75017501 字节,超过了字节,超过了 4KB)4KB) 。。

Page 19: 第 9 章     文件系统

此外虽然此外虽然 LinuxLinux 下的下的 msdosmsdos 文件系文件系统根本就未支持设备文件和符号链接,统根本就未支持设备文件和符号链接, msmsdosdos 文件系统在文件系统在 kernel 2.4.7kernel 2.4.7 下编译出来的下编译出来的module(msdos.o)module(msdos.o) 大小仍然达到了大小仍然达到了 1067010670BB 。。

Page 20: 第 9 章     文件系统

从上面的比较可以看出,在从上面的比较可以看出,在 romfsromfs中,文件系统的管理代码占用的空间比较中,文件系统的管理代码占用的空间比较小,这—点就可以从一个方面看出小,这—点就可以从一个方面看出 romfsromfs比较节省空间。比较节省空间。

Page 21: 第 9 章     文件系统

需要注意的是,需要注意的是, romfsromfs 的文件访问的文件访问权限和属主这些信息尚没有完全实现。权限和属主这些信息尚没有完全实现。 此外,由于此外,由于 romfsromfs 文件系统是只读文件系统是只读的,所以可以做得很小。但是有不少场合,的,所以可以做得很小。但是有不少场合,还需要对其进行写操作。还需要对其进行写操作。 要满足这些写操作的要求,只能在编要满足这些写操作的要求,只能在编译的时候加上写访问功能,或者采取变通译的时候加上写访问功能,或者采取变通的手段,在运行的时候另外生成一个的手段,在运行的时候另外生成一个 RAMdRAMdiskisk 宋暂存数据。宋暂存数据。

Page 22: 第 9 章     文件系统

2. romfs2. romfs 文件系统结构文件系统结构 romfsromfs 文件系统是为了对块设备进行文件系统是为了对块设备进行高效管理而开发的。所有的高效管理而开发的。所有的 romfsromfs 文件,文件,经过经过 genromfsgenromfs 程序生成之后,合并到一个程序生成之后,合并到一个文件文件 ((即即 romfsromfs 的映象文件的映象文件 )) 中去。 中去。

Page 23: 第 9 章     文件系统

只需要采用只需要采用 mountmount 命令将这个文件命令将这个文件挂接到任何一个目录下,就可以对这个挂接到任何一个目录下,就可以对这个 roromfsmfs 中的文件按照正常方式进行访问了。中的文件按照正常方式进行访问了。 romfsromfs 映像文件的文件组织方式映像文件的文件组织方式如表如表

9-19-1所示所示。。

Page 24: 第 9 章     文件系统

romfsromfs 映像文件开始的映像文件开始的 88个字节存放了个字节存放了ASCIIASCII 码“码“ -ROM1FS-”-ROM1FS-” ,之后存放了这个文,之后存放了这个文件系统中的字节总数。件系统中的字节总数。 checksumchecksum 处存放的是从文件头开始的处存放的是从文件头开始的512512 个字节的校验码。然后是文件系统的卷标个字节的校验码。然后是文件系统的卷标名称,该名称以名称,该名称以 ASCIIASCII 值为值为 00的字符结尾,所的字符结尾,所占用的空间为占用的空间为 1616 字节的整数倍。字节的整数倍。 后面就开始存放各个文件的头部结构了。后面就开始存放各个文件的头部结构了。 文件的表示结构文件的表示结构如表如表9-29-2所示所示。。

Page 25: 第 9 章     文件系统

其中,其中, spec.infospec.info 域根据该文件域根据该文件 ((或或者目录者目录 )) 的类别而有不同的含义。的类别而有不同的含义。 主要有如下几种情况:主要有如下几种情况:

Page 26: 第 9 章     文件系统

00 :硬链接,此时:硬链接,此时 spec.infospec.info 域的内容为用域的内容为用于链接的目标文件于链接的目标文件11 :目录,此时:目录,此时 spec.infospec.info 域的内容为第一域的内容为第一个文件的文件头个文件的文件头22 :普通文件,此时:普通文件,此时 spec.infospec.info 域的内容无域的内容无效,应该设置为效,应该设置为 00 值值33 :符号链接,此时:符号链接,此时 spec.infospec.info 域的内容无域的内容无效,应该设置为效,应该设置为 00 值值

Page 27: 第 9 章     文件系统

44 :块设备,此时:块设备,此时 spec.infospec.info 域的内容为域的内容为 1616bitbit 的主设备号和的主设备号和 16bit16bit 的从设备号的从设备号55 :字符设备,同样,此时:字符设备,同样,此时 spec.infospec.info 域的域的内容无效,应该设置为内容无效,应该设置为 00 值值66 :网络:网络 socketsocket套接字,此时套接字,此时 spec.infospec.info域的内容无效,应该设置为域的内容无效,应该设置为 00 值值77 :: fifofifo 管道文件,此时管道文件,此时 spec.infospec.info 域的内域的内容无效,应该设置为容无效,应该设置为 00 值值

Page 28: 第 9 章     文件系统

由于由于 romfsromfs 文件系统为了减小文件系统为了减小 modmoduleule 的大小省略了很多完整性检测的代码,的大小省略了很多完整性检测的代码,所以使用者要自己注意,如不要生成硬链所以使用者要自己注意,如不要生成硬链接循环,要自己为当前目录和父目录生成接循环,要自己为当前目录和父目录生成““ .”.” 和“和“ ..”..” 链接。链接。 当然,这些工作当然,这些工作 genromfsgenromfs 工具通常工具通常都会自动做好的。都会自动做好的。

Page 29: 第 9 章     文件系统

3. romfs3. romfs 使用使用 EV44B0IIEV44B0II 的的 romfsromfs 的制作过程的制作过程如图如图

9-39-3所示所示。。

Page 30: 第 9 章     文件系统

(1) (1) 在主机的在主机的 /romfs/romfs 目录下生成需要的目录结构目录下生成需要的目录结构(2) (2) 利用利用 genromfsgenromfs工具,工具,

将将 /cygdrive/d/aaaa/uClinux-44b0ii/romfs/cygdrive/d/aaaa/uClinux-44b0ii/romfs 目目录生成为录生成为 ROMdiskROMdisk的的 romfsromfs 映像文件映像文件 romfs.iromfs.imgmggenromfs–v–V"ROMdisk"-f/cygdrive/d/aaaagenromfs–v–V"ROMdisk"-f/cygdrive/d/aaaa/images/romfs.img/images/romfs.img––d/cygdrive/d/aaaa/uClinux-44b0ii/romfsd/cygdrive/d/aaaa/uClinux-44b0ii/romfs

Page 31: 第 9 章     文件系统

(3) (3) 将将 romfs.imgromfs.img作为初始化数据连接到作为初始化数据连接到 LinLinuxux 内核当中内核当中(4) (4) 使用使用 romfsromfs 的文件系统的时候,可以采的文件系统的时候,可以采用用 mountmount 命令直接将其挂接到合适的目录命令直接将其挂接到合适的目录下,例如下,例如 ((假设假设 /dev/ram0/dev/ram0是是 romfsromfs 文件文件系统的设备系统的设备 )) ::

mount -t romfs /dev/rom0 /varmount -t romfs /dev/rom0 /var

Page 32: 第 9 章     文件系统

将会把将会把 /dev/ram0/dev/ram0 挂接到挂接到 /var/var 目录目录上去,此后直接对上去,此后直接对 /var/var 目录进行操作即可。目录进行操作即可。但是,但是, romfsromfs 映射到内存中,它仍旧无法映射到内存中,它仍旧无法支持动态擦写保存。支持动态擦写保存。 对于系统需要动态保存的数据可以采对于系统需要动态保存的数据可以采用虚拟用虚拟 ramdiskramdisk 或或 JFFSJFFS 的方法进行处理。的方法进行处理。

Page 33: 第 9 章     文件系统

9.2.2 ramfs9.2.2 ramfs 文件系统文件系统 ramdiskramdisk 是使用是使用 RAMRAM 虚拟的磁盘虚拟的磁盘(该驱动程序在(该驱动程序在 /linux/drivers/block/rd./linux/drivers/block/rd.cc ),是一个内存块,作为一个盘分区使用;),是一个内存块,作为一个盘分区使用;或者说将内存模拟为硬盘空间,从而可以或者说将内存模拟为硬盘空间,从而可以像对待硬盘空间一样在其上保存文件。 像对待硬盘空间一样在其上保存文件。

Page 34: 第 9 章     文件系统

使用使用 ramdiskramdisk主要是为了提高访问主要是为了提高访问速度,若事先知道特定的文件将被高频率速度,若事先知道特定的文件将被高频率访问,通过将文件存放在内存里就可以提访问,通过将文件存放在内存里就可以提高性能。高性能。 在这个虚拟磁盘的基础上,加载在这个虚拟磁盘的基础上,加载 EXTEXT22 文件系统来管理和操作文件。文件系统来管理和操作文件。

Page 35: 第 9 章     文件系统

使用使用 ramdiskramdisk 是非常简单的。是非常简单的。 ramdiskramdisk 的大小是可以配置的,其配置项的大小是可以配置的,其配置项是是 /config/.config/config/.config文件中的文件中的 CONFIG_USERCONFIG_USER_RAMIMAGE_RAMFS128_RAMIMAGE_RAMFS128 (( 128K128K )。)。 ramramdiskdisk的加载过程包含在的加载过程包含在 /vendors/micetek//vendors/micetek/44b/rc44b/rc 文件中:文件中:bin/expand /etc/ramfs.img /dev/ram0bin/expand /etc/ramfs.img /dev/ram0mount -t ext2 /dev/ram0 /varmount -t ext2 /dev/ram0 /var

Page 36: 第 9 章     文件系统

首先将预先生成的首先将预先生成的 EXT2EXT2 的磁盘映像的磁盘映像的压缩格式,释放到的压缩格式,释放到 ramram 块设备上。块设备上。 然后使用然后使用 mountmount 命令将命令将 ramram 块设备块设备中的文件系统安装到根文件系统的中的文件系统安装到根文件系统的 /var/var 下。下。 随后就可以对随后就可以对 ramdiskramdisk 进行文件操作进行文件操作了。了。

Page 37: 第 9 章     文件系统

9.2.3 JFFS9.2.3 JFFS 与与 JFFS2JFFS2 文件系文件系统统 ramdiskramdisk 是运行在内存中的,所以是运行在内存中的,所以在系统掉电后,所有保存的数据都会丢失。在系统掉电后,所有保存的数据都会丢失。 这时,一个比较好的选择是 这时,一个比较好的选择是 JFFSJFFS 文文件系统(最新的版本是件系统(最新的版本是 JFFS2JFFS2 ),), JFFSJFFS文件系统一般使用文件系统一般使用 FLASHFLASH 作为磁盘,所以作为磁盘,所以在掉电后数据不会丢失;在掉电后数据不会丢失; 而且,而且, JFFSJFFS 可以对由于在掉电时刻可以对由于在掉电时刻操作导致的不完整数据进行修复。操作导致的不完整数据进行修复。

Page 38: 第 9 章     文件系统

1.JFFS1.JFFS (1) (1) 存储格式存储格式 第一版本的第一版本的 JFFSJFFS 是一个日志结构是一个日志结构的文件系统。在的文件系统。在 FlashFlash 的存储空间中,数的存储空间中,数据和辅助信息都依次存放于其中。据和辅助信息都依次存放于其中。 在该文件系统中,只有一种文件在该文件系统中,只有一种文件节点,它通过节点,它通过 jffs_raw_inodejffs_raw_inode 这个结构这个结构进行描述。每个这样的节点都关联到某个进行描述。每个这样的节点都关联到某个文件上,其中包含了一个简单的头部、辅文件上,其中包含了一个简单的头部、辅助信息以及存储的数据。 助信息以及存储的数据。

Page 39: 第 9 章     文件系统

其中存储的辅助信息不仅包括通常所其中存储的辅助信息不仅包括通常所记录的文件记录的文件 inodeinode 信息信息 (( 如如 uid,giduid,gid 等等 )) ,,也包含了它所关联的文件的名字等。也包含了它所关联的文件的名字等。 由于在由于在 JFFSJFFS 中,大的文件都分为很中,大的文件都分为很多节点存放,所以除了必须存放数据之外,多节点存放,所以除了必须存放数据之外,还要额外保存这段数据在文件中的偏移量。还要额外保存这段数据在文件中的偏移量。

Page 40: 第 9 章     文件系统

设备文件节点和符号链接等特殊的文设备文件节点和符号链接等特殊的文件只需要存储很少量的文件信息,例如设件只需要存储很少量的文件信息,例如设备文件只需要在数据区存放主次设备号即备文件只需要在数据区存放主次设备号即可,而符号链接文件则只需要在数据区存可,而符号链接文件则只需要在数据区存放链接目标的文件名称即可。放链接目标的文件名称即可。 所以这种文件只需要占用很小的空间,所以这种文件只需要占用很小的空间,通常不会占用超过一个节点。通常不会占用超过一个节点。

Page 41: 第 9 章     文件系统

删除文件的时候,采用的方法是在辅助信删除文件的时候,采用的方法是在辅助信息存放的地方设置一个已删除标记,所有关息存放的地方设置一个已删除标记,所有关于被删除文件的于被删除文件的 FlashFlash块都会加上这个已删块都会加上这个已删除标记,在使用该文件的文件句柄释放之后,除标记,在使用该文件的文件句柄释放之后,这些节点就成为废弃节点了。 这些节点就成为废弃节点了。

Page 42: 第 9 章     文件系统

此外,在更新文件的时候,新的文件此外,在更新文件的时候,新的文件存放的节点会添加到所有已经使用的存储存放的节点会添加到所有已经使用的存储空间的末尾,旧版本的文件也会被废弃,空间的末尾,旧版本的文件也会被废弃,等待在回收空间的时候重新分配利用。等待在回收空间的时候重新分配利用。 第一版本第一版本 JFFSJFFS 只有一种记录节点格只有一种记录节点格式,所以尚不支持硬链接。式,所以尚不支持硬链接。

Page 43: 第 9 章     文件系统

(2) (2) 文件系统操作的实施过程文件系统操作的实施过程① ① 挂接挂接

挂接挂接 JFFSJFFS 文件系统时,会把整个存文件系统时,会把整个存储设备扫描一次,每个存储块都读取一次,储设备扫描一次,每个存储块都读取一次,然后根据所有节点中存储的信息来生成一然后根据所有节点中存储的信息来生成一个文件系统的目录树,同时也自动生成了个文件系统的目录树,同时也自动生成了一个文件在一个文件在 FlashFlash 中物理存储位置的对应中物理存储位置的对应表,用来进行文件的寻址操作。表,用来进行文件的寻址操作。

Page 44: 第 9 章     文件系统

② ② 读取读取 文件目录结构可以通过文件目录结构可以通过 mountmount 时生时生成的信息获得,成的信息获得, cdcd 和和 rmdirrmdir 等目录操作都等目录操作都可以直接根据这些信息来确定如何操作。可以直接根据这些信息来确定如何操作。 而读取文件的内容的时候,利用而读取文件的内容的时候,利用 momountunt 时生成的物理地址表可以轻松地将指定时生成的物理地址表可以轻松地将指定的内容读入到缓存区中以备使用。的内容读入到缓存区中以备使用。

Page 45: 第 9 章     文件系统

③ ③ 改变属性改变属性 例如改变文件的属主例如改变文件的属主 (chown(chown 命令命令 ))和操作权限和操作权限 (chmod(chmod 命令命令 )) 等操作,只需要等操作,只需要将一个记录新的信息的节点写到将一个记录新的信息的节点写到 FlashFlash 已已利用的存储空间的末尾,然后将旧节点标利用的存储空间的末尾,然后将旧节点标记为废弃节点即可。记为废弃节点即可。 写文件等操作也与此类似,并不是通写文件等操作也与此类似,并不是通过直接改写旧节点来完成的。过直接改写旧节点来完成的。

Page 46: 第 9 章     文件系统

(3) (3) 空间回收空间回收 可以看出,在可以看出,在 JFFSJFFS 的操作中,是不的操作中,是不会对废弃的存储块来进行重新利用的。随会对废弃的存储块来进行重新利用的。随着对文件系统进行过的操作不断积累,占着对文件系统进行过的操作不断积累,占用的存储块会越来越多,已经利用的用的存储块会越来越多,已经利用的 FlashFlash空间就会不断地增长。空间就会不断地增长。 当所有存储块都被占用了之后当所有存储块都被占用了之后 ((可能可能有一些标记为废弃,但仍然是被占用的有一些标记为废弃,但仍然是被占用的 )) ,,文件系统就要开始对废弃的存储块进行回文件系统就要开始对废弃的存储块进行回收再利用了。 收再利用了。

Page 47: 第 9 章     文件系统

当然,回收废弃空间的时候,如果发当然,回收废弃空间的时候,如果发现所有回收的空间加起来仍不足以满足当现所有回收的空间加起来仍不足以满足当前操作的需求,那么系统不能继续当前的前操作的需求,那么系统不能继续当前的操作;操作; 如果是内核线程请求分配空间,那么如果是内核线程请求分配空间,那么该线程进入睡眠状态;如果是用户程序请该线程进入睡眠状态;如果是用户程序请求进行写操作,那么将会返回求进行写操作,那么将会返回 ENOSPCENOSPC错错误信息。误信息。

Page 48: 第 9 章     文件系统

在进行空间回收时,系统自动从所有在进行空间回收时,系统自动从所有存储块中的第一个开始进行分析存储块中的第一个开始进行分析 ,,不断将废不断将废弃的;节点回收,将尚在使用的节点进行弃的;节点回收,将尚在使用的节点进行合并,这样最终合成出整个的——块废弃合并,这样最终合成出整个的——块废弃的的 FlashFlash 存储块,存储块, 这样就可以将这一整块存储块的内容这样就可以将这一整块存储块的内容一次性擦除,成为新的空闲块。一次性擦除,成为新的空闲块。

Page 49: 第 9 章     文件系统

(4) (4) 缺陷缺陷 关于空间回收,可以看出,关于空间回收,可以看出, JFFSJFFS 并并没有进行太多优化。没有进行太多优化。 它是按照顺序,从第一个数据块开始它是按照顺序,从第一个数据块开始腾出空间,如果第一块写满了有效数据,腾出空间,如果第一块写满了有效数据,它也会将这些数据后移,腾出第一块来作它也会将这些数据后移,腾出第一块来作为空闲块。 为空闲块。

Page 50: 第 9 章     文件系统

在极端的情况下,效率会非常低。当在极端的情况下,效率会非常低。当然,这种方式也保证了然,这种方式也保证了 FlashFlash 的每一块都的每一块都可以得到相同的擦写次数,有利于提高整可以得到相同的擦写次数,有利于提高整个个 FlashFlash 设备的使用寿命。设备的使用寿命。

Page 51: 第 9 章     文件系统

JFFSJFFS 尚不支持对数据进行压缩之后存储。尚不支持对数据进行压缩之后存储。 而在嵌入式系统中,如果数据可以得到 而在嵌入式系统中,如果数据可以得到最大限度的压缩,可以提高资源的利用率,有最大限度的压缩,可以提高资源的利用率,有利于提高性能、节省成本。利于提高性能、节省成本。

Page 52: 第 9 章     文件系统

不支持硬链接,每一个存储块中都保不支持硬链接,每一个存储块中都保存了对应的文件名。存了对应的文件名。 这样,就算是很常用的改名操作,也这样,就算是很常用的改名操作,也需要增加一个新的需要保存全部所需数据需要增加一个新的需要保存全部所需数据的存储块进行存储。的存储块进行存储。

Page 53: 第 9 章     文件系统

2. JFFS22. JFFS2 的主要改进的主要改进(1) JFFS2(1) JFFS2 的节点头部中增加了一些新的信的节点头部中增加了一些新的信息,包括息,包括 CRCCRC校验码和节点类型等。校验码和节点类型等。(2) (2) 由于由于 JFFSJFFS 空间回收方式的缺陷,在空间回收方式的缺陷,在 JFJFFS2FS2 中,所有的存储节点都不可以跨越中,所有的存储节点都不可以跨越 FlaFlashsh 的块界限了。 的块界限了。

Page 54: 第 9 章     文件系统

这样,就可以在回收空间的时候,按这样,就可以在回收空间的时候,按照照 FlashFlash 的各个块为单位,进行选择,将最的各个块为单位,进行选择,将最合适的块腾出来,擦除之后作为新的空闲块。合适的块腾出来,擦除之后作为新的空闲块。 这样,虽然不能像这样,虽然不能像 JFFSJFFS 对每个对每个 FlashFlash块都保证同样的擦除次数,但是可以提高效块都保证同样的擦除次数,但是可以提高效率与利用率。率与利用率。

Page 55: 第 9 章     文件系统

(3) JFFS2(3) JFFS2 不再像不再像 JFFSJFFS 中只有——种节点,中只有——种节点,现在有现在有 33 种节点类型了,分别用于表示擦种节点类型了,分别用于表示擦除块的标记、普通文件、目录。除块的标记、普通文件、目录。 其中,第一种是在其中,第一种是在 FlashFlash 擦除了一块擦除了一块之后建立的,惟一的用处就是表明之后建立的,惟一的用处就是表明 F1ashF1ash的块擦除工作顺利完成。的块擦除工作顺利完成。

Page 56: 第 9 章     文件系统

(4) (4) 文件系统的信息并不像文件系统的信息并不像 JFFSJFFS 中那样,中那样,全部保存在内存之中,可以很快取得的数全部保存在内存之中,可以很快取得的数据并不保存在内存之中,这样可以提高内据并不保存在内存之中,这样可以提高内存的利用率。存的利用率。(5) (5) 增加了对数据的压缩。增加了对数据的压缩。(6) (6) 开始支持硬链接。开始支持硬链接。

Page 57: 第 9 章     文件系统

3.JFFS3.JFFS 文件系统的结构文件系统的结构 JFFSJFFS 文件系统的结构文件系统的结构如图如图9-49-4所示所示。。

Page 58: 第 9 章     文件系统

MTDMTD的全称是内存技术设备子系统,的全称是内存技术设备子系统,它负责操作和管理它负责操作和管理 FLASHFLASH 和和 RAMRAM 物理器物理器件,由于内置了对于件,由于内置了对于 NORFLASHNORFLASH、、 NANDNANDFLASHFLASH 、、 DOC(disk on chip)DOC(disk on chip) 和和 RAMRAM 的支的支持,所以持,所以 MTDMTD 能胜任目前大多数应用中的能胜任目前大多数应用中的存储器件,并且可以自动识别该器件,所存储器件,并且可以自动识别该器件,所以使用起来很方便 以使用起来很方便

Page 59: 第 9 章     文件系统

MTDMTD还支持将一块还支持将一块 FLASHFLASH器件分为器件分为不同的分区管理,这样可以将不同的分区管理,这样可以将 LinuxLinux 内核内核和根文件系统分别存在不同的分区,避免和根文件系统分别存在不同的分区,避免由于由于 FLASHFLASH 擦写和文件系统组织结构的相擦写和文件系统组织结构的相互影响。 互影响。

Page 60: 第 9 章     文件系统

MTDMTD 向向 JFFSJFFS 提供了字符型和块设备,提供了字符型和块设备,对于需要无延时的写入使用字符设备,如对于需要无延时的写入使用字符设备,如 LLinuxinux 内核的升级。内核的升级。 块设备为块设备为 JFFSJFFS 文件系统服务,在加文件系统服务,在加载载 JFFSJFFS 文件系统后,可以操作和管理文件。文件系统后,可以操作和管理文件。

Page 61: 第 9 章     文件系统

对于对于 EV44B0IIEV44B0II在使用在使用 JFFSJFFS 文件系文件系统时,要进行特殊处理,因为统时,要进行特殊处理,因为 S3C44B0XS3C44B0X的中断向量表在的中断向量表在 FLASHFLASH 中,所以在操作中,所以在操作 FLFLASHASH 擦写时,要关闭中断和快速中断,以擦写时,要关闭中断和快速中断,以避免避免 FLASHFLASH在擦写状态下,返回的状态数在擦写状态下,返回的状态数据,被误解成跳转地址。据,被误解成跳转地址。

Page 62: 第 9 章     文件系统

9.2.4 EXT29.2.4 EXT2 文件系统文件系统 LinuxLinux 中主流的文件系统一直是中主流的文件系统一直是 EXTEXT22 文件系统。文件系统。 在在 LinuxLinux 中,普通文件和目录文件中,普通文件和目录文件保存在称为块物理设备的磁盘或者磁带上。保存在称为块物理设备的磁盘或者磁带上。一套一套 LinuxLinux 系统支持若干物理盘,每个物系统支持若干物理盘,每个物理盘可定义一个或者多个文件系统理盘可定义一个或者多个文件系统 ((微机上微机上等价于磁盘分区等价于磁盘分区 )) 。。

Page 63: 第 9 章     文件系统

每个文件系统由逻辑块的序列组成,每个文件系统由逻辑块的序列组成,一个逻辑盘空间一般划分为几个用途各不一个逻辑盘空间一般划分为几个用途各不相同的部分,即引导块、超级块、相同的部分,即引导块、超级块、 inodeinode区以及数据区等。区以及数据区等。

Page 64: 第 9 章     文件系统

◆ ◆ 引导块:在文件系统的开头,通常为一个引导块:在文件系统的开头,通常为一个扇区,其中存放引导程序,用于读人并启扇区,其中存放引导程序,用于读人并启动操作系统。动操作系统。◆ ◆ 超级块超级块 (superblock)(superblock) :用于记录文件系:用于记录文件系统的管理信息。特定的文件系统定义了特统的管理信息。特定的文件系统定义了特定超级块。定超级块。

Page 65: 第 9 章     文件系统

◆ ◆ inodeinode 区区 ((索引节点索引节点 )) :一个文件:一个文件 ((或目或目录录 ))占据一个索引节点。第一个索引节点是占据一个索引节点。第一个索引节点是该文件系统的根节点。利用根节点,可以该文件系统的根节点。利用根节点,可以把一个文件系统挂在另一个文件系统的非把一个文件系统挂在另一个文件系统的非叶节点上。叶节点上。◆ ◆ 数据区:用于存放文件数据或者管理数据数据区:用于存放文件数据或者管理数据(( 如一级间址块、二级间址块等如一级间址块、二级间址块等 )) 。。

Page 66: 第 9 章     文件系统

LinuxLinux 最早引入的文件系统类型是最早引入的文件系统类型是 MINIXMINIX。。 第一个专门为第一个专门为 LinuxLinux 设计的文件系统类型是设计的文件系统类型是EXT(Extended File SystemEXT(Extended File System ,, 19921992年年 44月月 )) ,,但目前流行最广的是但目前流行最广的是 19931993年提出的年提出的 EXT2(SeEXT2(Second Extended File System)cond Extended File System) 。。

Page 67: 第 9 章     文件系统

EXT2EXT2 是是 LinuxLinux 中的一个可扩展的强中的一个可扩展的强有力的文件系统。有力的文件系统。 通过通过 VFSVFS 的超级块的超级块 (struct ext2_sb_(struct ext2_sb_info ext2_sb)info ext2_sb) 可以访问可以访问 EXT2EXT2 的超级块,的超级块,通过通过 VFSVFS 的的 inode(stuct ext2_inode_info inode(stuct ext2_inode_info ext2_i)ext2_i)可以访问可以访问 EXT2EXT2 的的 inodeinode 。。

Page 68: 第 9 章     文件系统

文件系统文件系统 EXT2EXT2 的源代码在的源代码在 /usr/src/usr/src/linux/fs/ext2/linux/fs/ext2 目录下,它的数据结构在文目录下,它的数据结构在文件件 /usr/src/linux/include/linux/ext2_fs.h/usr/src/linux/include/linux/ext2_fs.h以及同一目录下的文件以及同一目录下的文件 ext2_fs_i.hext2_fs_i.h 和和 ext2ext2_fs_sb.h_fs_sb.h 中定义。中定义。

Page 69: 第 9 章     文件系统

在在 EXT2EXT2 中,文件也是由逻辑块的序中,文件也是由逻辑块的序列组成。所有的数据块的长度相同,但是列组成。所有的数据块的长度相同,但是对于不同的对于不同的 EXT2EXT2 文件系统,其长度可以变文件系统,其长度可以变化。当然,对于给定的化。当然,对于给定的 EXT2EXT2 文件系统,其文件系统,其块的大小在创建时就会固定下来。块的大小在创建时就会固定下来。 文件总是整块存储,不足一块的部分文件总是整块存储,不足一块的部分也占用一个数据块。例如,在数据块长度也占用一个数据块。例如,在数据块长度为为 10241024 字节的字节的 EXT2EXT2 文件系统中,一个长文件系统中,一个长度为度为 10251025字节的文件就要占用字节的文件就要占用 22 个数据块。个数据块。

Page 70: 第 9 章     文件系统

EXT2EXT2 文件系统中的每个文件都用一文件系统中的每个文件都用一个单独的个单独的 inode(inode( 即即 stuct ext2_inodestuct ext2_inode 结结构构 )) 来描述,而每个来描述,而每个 inodeinode 都有一个唯一都有一个唯一的标志号。的标志号。 EXT2EXT2 通过使用通过使用 inodeinode 来来定义文件系统的结构以及描述系统中每个定义文件系统的结构以及描述系统中每个文件的管理信息。文件的管理信息。

Page 71: 第 9 章     文件系统

挂接挂接 (mount)(mount) 为为 ext2ext2 文件系统文件系统mount -t ext2 /dev/ram0 /tmpmount -t ext2 /dev/ram0 /tmp将将 /dev/ram0/dev/ram0上上 ext2ext2 文件系统挂接到文件系统挂接到 /tm/tmpp 目录上。目录上。

Page 72: 第 9 章     文件系统

9.3 9.3 文件系统目录结构文件系统目录结构 嵌入式嵌入式 LinuxLinux 中,文件系统通常还中,文件系统通常还是按照标准的目录结构来存放所有的文件是按照标准的目录结构来存放所有的文件的。的。 在本节之中,选择了 在本节之中,选择了 uClinux(MiceteuClinux(Micetek)k) 开发环境中的默认目录、文件层次来对开发环境中的默认目录、文件层次来对嵌入式嵌入式 LinuxLinux 中的目录与文件进行介绍。中的目录与文件进行介绍。 另外,为了阅读和分析另外,为了阅读和分析 LinuxLinux 代码,代码,也给出了源程序的目录结构。也给出了源程序的目录结构。

Page 73: 第 9 章     文件系统

9.3.1 romfs9.3.1 romfs 文件系统目录结构文件系统目录结构 首先需要了解这个首先需要了解这个 romfsromfs 目录树中目录树中究竟提供了哪些功能。究竟提供了哪些功能。 因为在嵌入式环境下的资源是非常有因为在嵌入式环境下的资源是非常有限的,所以目录树中的所有文件都应该是限的,所以目录树中的所有文件都应该是系统提供的功能所必需的文件,以免浪费系统提供的功能所必需的文件,以免浪费宝贵的存储空间。 宝贵的存储空间。

Page 74: 第 9 章     文件系统

在这个开发环境中,使用的是在这个开发环境中,使用的是 uClinuClinux-2ux-2 .. 44 .. xx 内核,以及对应的工具。内核,以及对应的工具。 这块开发板在默认情况下已经提供了这块开发板在默认情况下已经提供了通常的通常的 LinuxLinux 文件操作功能以及文件操作功能以及 telnettelnet 服服务、务、 httphttp 服务等,此外还需要对服务等,此外还需要对 FlashFlash 进进行擦除操作,所以这些程序及相关的配置行擦除操作,所以这些程序及相关的配置文件都会被编译到该目录树中。文件都会被编译到该目录树中。

Page 75: 第 9 章     文件系统

图图9-59-5所示所示的就是的就是 uClinuxuClinux 开发环境下开发环境下 romfsromfs文件系统的根目录中的目录结构。 文件系统的根目录中的目录结构。

Page 76: 第 9 章     文件系统

这个目录结构基本上同普通这个目录结构基本上同普通 LinuxLinux系统中的目录是相同的,其中系统中的目录是相同的,其中 //binbin 和和 //sbinsbin 存放了可执行程序;存放了可执行程序; //devdev 目录存放的是系统设备文件,目录存放的是系统设备文件,提供系统中各种设备的说明; 提供系统中各种设备的说明;

Page 77: 第 9 章     文件系统

//etcetc 目录存放系统中各种关于用户帐目录存放系统中各种关于用户帐号、网络等的配置文件和启动脚本;号、网络等的配置文件和启动脚本; //liblib 下存放了库文件;下存放了库文件; //procproc 下面是系统信息下面是系统信息 (( 本目录是虚本目录是虚拟目录,并不存放在拟目录,并不存放在 romfsromfs 中,而是在系中,而是在系统运行的时候自动生成统运行的时候自动生成 )); ;

Page 78: 第 9 章     文件系统

/usr/usr 目录是目录是 LinuxLinux 系统里面占用磁盘系统里面占用磁盘空间最大的目录,是用户共享文件目录;空间最大的目录,是用户共享文件目录; /home/home 是系统默认的普通用户是系统默认的普通用户的主目录的根目录;的主目录的根目录; /var/var 、、 /tmp/tmp是一些系统记录文件和是一些系统记录文件和临时文件的存放地。临时文件的存放地。 本节主要介绍本节主要介绍 /etc/etc ,, /bin/bin ,, /sbin/sbin和和 /dev/dev 目录。目录。

Page 79: 第 9 章     文件系统

11 .. /etc/etc 目录目录 在在 /etc/etc 目录中,通常保存的是启动目录中,通常保存的是启动脚本和应用程序的配置文件。脚本和应用程序的配置文件。 在在 uClinuxuClinux 中,中, /etc/etc 目录下默认文目录下默认文件件如表如表9-39-3所示所示。。

Page 80: 第 9 章     文件系统

(1) inetd.conf(1) inetd.conf (未用)(未用)文件文件 inetd.confinetd.conf 中的内容如下:中的内容如下:telnet stream tcp nowait root /sbin/telntelnet stream tcp nowait root /sbin/telnetdetdhttp stream tcp nowait root /sbin/httphttp stream tcp nowait root /sbin/httpd -id -iuptime stream tcp nowait root /bin/cat uptime stream tcp nowait root /bin/cat /proc/uptime /etc/motd/proc/uptime /etc/motd

Page 81: 第 9 章     文件系统

在现在的发行版本中,在现在的发行版本中, inetd.confinetd.conf通常都被通常都被 xinetd.confxinetd.conf 所取代了。所取代了。 由于在这个环境中还是使用由于在这个环境中还是使用 inetdinetd 进进行网络服务的管理,所以配置文件依然是行网络服务的管理,所以配置文件依然是 iinetd.confnetd.conf 。。

Page 82: 第 9 章     文件系统

从这个文件中的内容来看,对从这个文件中的内容来看,对 telnettelnet的登录请求,将会由的登录请求,将会由 /sbin/telnetd/sbin/telnetd 来处理;来处理; 对对 httphttp 请求,则会由请求,则会由 /sbin/http/sbin/http 来来处理;处理; 对于对于 uptimeuptime ,则会将,则会将 /proc/uptime/proc/uptime的内容和的内容和 /etc/issue/etc/issue 中的内容显示出来,也中的内容显示出来,也就是系统已经启动的时间加上该就是系统已经启动的时间加上该 uClinuxuClinux 中中的欢迎信息。的欢迎信息。

Page 83: 第 9 章     文件系统

(2) inittab(2) inittab 由于要在启动的时候通过串行口向调由于要在启动的时候通过串行口向调试机发回提示信息、错误信息等,因此文试机发回提示信息、错误信息等,因此文件件 inittabinittab 这里要进行终端的初始化。这里要进行终端的初始化。

Page 84: 第 9 章     文件系统

(3) motd((3) motd( 或或 issue)issue) 文件文件 motdmotd 中的内容主要是中的内容主要是 uClinuxuClinux的一些欢迎信息,在启动的一些欢迎信息,在启动 MICETEKMICETEK开发版开发版的时候,会在登录之前显示这些欢迎信息。的时候,会在登录之前显示这些欢迎信息。可以将该文件的内容替换为希望显示的内可以将该文件的内容替换为希望显示的内容。容。

Page 85: 第 9 章     文件系统

(4) passwd(4) passwd 文件文件 passwdpasswd 中的内容:中的内容: root ab6root ab6TRGT20sY26rTRGT20sY26r 在在 MICETEKMICETEK 开发系统中,默认情况开发系统中,默认情况下可以使用任何用户登录下可以使用任何用户登录 (( 通过改动通过改动 loginlogin的源代码来实现的的源代码来实现的 )) ,这里,这里 passwdpasswd 文件尚文件尚未使用。未使用。

Page 86: 第 9 章     文件系统

(5) rc(5) rc文件文件 rcrc 中的内容:中的内容:hostname EV44B0IIhostname EV44B0II/bin/expand /etc/ramfs.img /dev/ram0/bin/expand /etc/ramfs.img /dev/ram0mount -t proc proc /procmount -t proc proc /procmount -t ramfs /dev/ram0 /varmount -t ramfs /dev/ram0 /var

Page 87: 第 9 章     文件系统

mkdir /var/configmkdir /var/configmkdir /var/tmpmkdir /var/tmpmkdir /var/logmkdir /var/logmkdir /var/runmkdir /var/runmkdir /var/lockmkdir /var/lockcat /etc/motdcat /etc/motd

Page 88: 第 9 章     文件系统

ifconfig lo 127.0.0.1ifconfig lo 127.0.0.1route add -net 127.0.0.0 netmask 255.25route add -net 127.0.0.0 netmask 255.255.255.0 lo5.255.0 lodhcpcd -p -a eth0 &dhcpcd -p -a eth0 &ifconfig eth0 192.168.1.20ifconfig eth0 192.168.1.20MDB :9999&MDB :9999&

Page 89: 第 9 章     文件系统

在本系统的在本系统的 rcrc 文件中主要完成了下面的功能:文件中主要完成了下面的功能: ◆ ◆ 设定设定 hostnamehostname 为为 EV44B0IIEV44B0II 。。 ◆ ◆ 使用使用 ifconfigifconfig设定网络设定网络 (ip(ip 地址、网关地址、网关等等 )) 。。 ◆ ◆ 使用使用 expandexpand 将将 ramfsramfs 展开到展开到 /dev/ram/dev/ramOO。。 ◆ ◆ 挂接挂接 /var(ram/var(ram 盘盘 )) 和和 /proc/proc 文件系统。文件系统。 ◆ ◆ 建立一些目录,显示欢迎信息,启动建立一些目录,显示欢迎信息,启动 MDMDBB 调试服务程序。调试服务程序。

Page 90: 第 9 章     文件系统

(6) resolv.conf(6) resolv.conf (未用)(未用)resolv.confresolv.conf 中设定了中设定了 DNSDNS服务器的中地址服务器的中地址

Page 91: 第 9 章     文件系统

(7) services(7) services TCPTCP 和和 UDPUDP 可以同时被多个进程使可以同时被多个进程使用,需要给这些进程分配不同的端口号加用,需要给这些进程分配不同的端口号加以区别。以区别。 ServicesServices 文件包含分配给各种服务的文件包含分配给各种服务的端口号。端口号。 如如 telnettelnet 的的 TCPTCP 端口号为端口号为 2323 ,, htthttpp 为为 8080,, ftpftp 为为 2121 等。 等。

Page 92: 第 9 章     文件系统

22 .. /bin/bin 、、 /sbin/sbin 目录目录 这个目录是系统中最主要的可执行文这个目录是系统中最主要的可执行文件的存放地,这些可执行文件大都是件的存放地,这些可执行文件大都是 uClinuClinuxux 系统里最常用的命令了,一般用户和超系统里最常用的命令了,一般用户和超级用户都会经常使用的命令,可以供开发级用户都会经常使用的命令,可以供开发者在选择时参考。者在选择时参考。 这些命令可以大致归为下面几类:这些命令可以大致归为下面几类:

Page 93: 第 9 章     文件系统

(1)(1) 文件操作:文件操作: catcat ,, cmpcmp ,, cpcp ,, lnln ,, lsls ,,mkdirmkdir ,, moremore ,, mvmv ,, pwdpwd ,, rmrm ,, rmrmdir,cd,chmod,chown,expand,umaskdir,cd,chmod,chown,expand,umask 。。(2)(2) 系统管理:系统管理: dfdf ,, freefree ,,,, killkill ,, moumountnt ,, psps ,, shsh ,, shutdownshutdown ,, umountumount ,,init,exec,mknod,sleep,telnet,date,echoinit,exec,mknod,sleep,telnet,date,echo 。。

Page 94: 第 9 章     文件系统

(3) (3) 网络管理:网络管理: hostnamehostname ,, loginlogin ,, pinping,ftpg,ftp ,, ifconfigifconfig,, fingerfinger ,, routeroute 。。 还有不少很有用的程序还有不少很有用的程序 (( 例如例如 grepgrep等等 )) 都未被收入,主要是因为体积和功能要都未被收入,主要是因为体积和功能要求必须进行折衷的原因。求必须进行折衷的原因。

Page 95: 第 9 章     文件系统

33 .. /dev/dev 目录目录 在普通在普通 LinuxLinux 系统里,采用系统里,采用 makedmakedevev 脚本一劳永逸地生成了几乎所有的可能脚本一劳永逸地生成了几乎所有的可能用到的设备文件,而其中大多数都是实际用到的设备文件,而其中大多数都是实际上根本不可能用得到的。 上根本不可能用得到的。

Page 96: 第 9 章     文件系统

在采用了在采用了 devfs(devfs( 设备文件系统设备文件系统 )) 之之后,部分地解决了这个问题。后,部分地解决了这个问题。 在嵌入式环境下的在嵌入式环境下的 /dev/dev 目录绝对不目录绝对不能按照普通能按照普通 LinuxLinux 发行版中的发行版中的 /dev/dev 一样。一样。 在嵌入式应用领域中,通常采用的方在嵌入式应用领域中,通常采用的方式则是手工选择创建哪些设备文件节点,式则是手工选择创建哪些设备文件节点,尽量不创建用不到的设备文件。尽量不创建用不到的设备文件。

Page 97: 第 9 章     文件系统

在这个目录下,就仅仅包含了终端、串口、在这个目录下,就仅仅包含了终端、串口、ROMROM 和那些必须具有的设备文件和那些必须具有的设备文件 (( 如如 memmem ,,nullnull 等等 )) ,构造了一个非常精简的,构造了一个非常精简的 /dev/dev 目录。目录。 此外,需要使用什么设备,再添加相应的此外,需要使用什么设备,再添加相应的设备文件。设备文件。 例如,假如需要支持例如,假如需要支持 framebufferframebuffer 使用图使用图形界面,就可以添加形界面,就可以添加 fbOfbO等设备文件的节点,等设备文件的节点,然后使用然后使用 genromfsgenromfs 重新生成重新生成 romfsromfs 映像文映像文件,上传到件,上传到 MICETEKMICETEK开发板上即可。开发板上即可。

Page 98: 第 9 章     文件系统

9.3.2 uClinux9.3.2 uClinux 源程序结构源程序结构 在在 MICETECKMICETECK开发板的开发板的 uClinuxuClinux 源源程序目录为:程序目录为: uclinx-44b0iiuclinx-44b0ii ,其目录结构描述如下:,其目录结构描述如下:

Page 99: 第 9 章     文件系统

1.lib/uclibc1.lib/uclibcliblib 是用户应用程序库目录,包括是用户应用程序库目录,包括 libclibc 、、 llibmibm 等函数库。等函数库。 uclibcuclibc 包括包括 uc-libcuc-libc 、、 uuc-libmc-libm 等函数库。等函数库。2.usr2.usr它包括用户模式下的应用软件,如:它包括用户模式下的应用软件,如: ftpftp ,,httpdhttpd ,, ifattachifattach ,, initinit ,, mircrowindomircrowindowsws ,, mountmount ,, tftp,tftpdtftp,tftpd ,, routeroute 等各等各种免费应用软件包。种免费应用软件包。

Page 100: 第 9 章     文件系统

3.config3.config针对不同厂商开发板的配置情况,裁减配针对不同厂商开发板的配置情况,裁减配置置 uClinuxuClinux 内核,形成的配置脚本文件。内核,形成的配置脚本文件。此目录提供一个交互的此目录提供一个交互的 LinuxLinux 配置程序。配置程序。4.vendors4.vendors此目录下包括各种开发平台的特殊结构信此目录下包括各种开发平台的特殊结构信息和支持文件。如息和支持文件。如 MICETEKMICETEK平台的支持平台的支持文件就在文件就在 ventors/micetek/44b0ventors/micetek/44b0目录下。目录下。

Page 101: 第 9 章     文件系统

5.romfs5.romfs它是一种它是一种 romfsromfs 文件系统,用于构造开发文件系统,用于构造开发平台的平台的 rootroot 根文件系统,包括根文件系统,包括 /bin/bin 、、 /e/etctc 、、 /dec/dec 、、 /home/home 、、 /lib/lib 、、 /mnt/mnt 、、 //procproc 、、 /usr/usr 、、 /var/var 等字目录。等字目录。

Page 102: 第 9 章     文件系统

6.images6.images包含包含 linux_bootram.binlinux_bootram.bin 、、 linux_bootrolinux_bootrom.binm.bin 和和 romfs.imgromfs.img三个文件,三个文件, linuxlinux_bootram.bin_bootram.bin 是下载到开发平台是下载到开发平台 ramram区区执行文件,执行文件,

linux_rom.binlinux_rom.bin 是烧制开发平台的是烧制开发平台的 flaflashsh区的文件,区的文件, romfs.imgromfs.img是开发平台的是开发平台的 rootroot 根文根文件系统件系统 romfsromfs 映象文件。映象文件。

Page 103: 第 9 章     文件系统

7.Linux 2.4.x7.Linux 2.4.x 它是它是 Linux 2.4.xLinux 2.4.x 内核源代码文件内核源代码文件目录目录 ,, 下面详细介绍目录文件的分布情况。下面详细介绍目录文件的分布情况。

Page 104: 第 9 章     文件系统

(( 11 )) kernelkernel 目录目录 此目录下文件实现了大多数此目录下文件实现了大多数 LinuxLinux 系统系统的核心函数,其中最重要、最主要的文件的核心函数,其中最重要、最主要的文件当属当属 sched.csched.c 。。

sched.csched.c 文件定义的函数有:文件定义的函数有:

Page 105: 第 9 章     文件系统

◆ ◆ 调度程序调度程序 scheduleschedule及相关操作。 及相关操作。 ◆ ◆ 等待队列及相关操作。等待队列及相关操作。 ◆ ◆ 基准时钟及相关操作。基准时钟及相关操作。 ◆ ◆ 定时器相关操作任务队列及相关操作。定时器相关操作任务队列及相关操作。 ◆ ◆ 关于调度策略控制的关于调度策略控制的 goodnessgoodness 、、 nicenice 等。等。 ◆ ◆ 各种用户标识、组标识的各种用户标识、组标识的 setset 和和 getget 。。

Page 106: 第 9 章     文件系统

关于进程控制的文件也位于此目录下。关于进程控制的文件也位于此目录下。其中包括其中包括 forkfork .. cc 文件创建、“克隆”子进文件创建、“克隆”子进程的函数程的函数 do_fork()do_fork() ,, exit.cexit.c 文件定义结束文件定义结束自身进程的自身进程的 do_exit()do_exit() ,各种,各种 waitwait 操作,以操作,以及发送信号及发送信号 (signal)(signal) 操作操作 send_sigsend_sig。。 而而 signal.csignal.c 文件中的函数都是关于信文件中的函数都是关于信号控制的。号控制的。

Page 107: 第 9 章     文件系统

LinuxLinux 设计一种模块机制。这种机制设计一种模块机制。这种机制可以让诸如设备驱动程序等软件模块动态可以让诸如设备驱动程序等软件模块动态地连接到系统核心中。而地连接到系统核心中。而 ksyms.cksyms.c 文件定文件定义不属于任何子系统的义不属于任何子系统的 LinuxLinux 的全程变量。的全程变量。 此外,该目录下还包含一些重要的文件,此外,该目录下还包含一些重要的文件,如:如:

Page 108: 第 9 章     文件系统

◆ ◆ time.ctime.c ,提供用户程序与系统之间关于时间的操,提供用户程序与系统之间关于时间的操作界面。作界面。◆ ◆ resource.cresource.c ,关于,关于 I/0I/0端口资源端口资源 (port)(port) 的管理。的管理。◆ ◆ dma.cdma.c ,关于,关于 DMADMA通道的管理。通道的管理。◆ ◆ softirq.csoftirq.c ,关于,关于 bottom halfbottom half 队列的操作。队列的操作。◆ ◆ itimer.citimer.c ,关于,关于 itimeritimer定时器读写的系统调用。定时器读写的系统调用。◆ ◆ printk.cprintk.c ,展示系统工作参数的操作,如,展示系统工作参数的操作,如 printkprintk 。。

Page 109: 第 9 章     文件系统

(( 22 )) mm/nommumm/nommu 目录目录 LinuxLinux 中独立于中独立于 CPUCPU 体系结构特征体系结构特征的内存管理文件几乎都集中在此目录下。的内存管理文件几乎都集中在此目录下。如页式存储管理、内存的分配和释放等等。如页式存储管理、内存的分配和释放等等。在在 nommunommu 目录下是没有目录下是没有 mmummu 的内存管的内存管理。理。

Page 110: 第 9 章     文件系统

文件文件 swap.cswap.c并不实现任何交换算法,并不实现任何交换算法,它仅仅处理命令行选项“它仅仅处理命令行选项“ swap=”swap=” 和“和“ bbuff=”uff=” 。。 swapfile.cswapfile.c 文件才是管理交换文件文件才是管理交换文件和交换设备的源程序所在。它包含和交换设备的源程序所在。它包含 swaponswapon 、、swapoffswapoff 系统调用的执行程序,以及从交系统调用的执行程序,以及从交换空间申请空闲页面的操作换空间申请空闲页面的操作 get_swap_paget_swap_pagege 。。

Page 111: 第 9 章     文件系统

page_io.cpage_io.c 文件则实现了与交换空间文件则实现了与交换空间底层的数据传输。底层的数据传输。 swap_state.cswap_state.c 文件维护文件维护 swapswap 缓存,缓存,它包含它包含 ((可以说可以说 )) 存储管理系统中最复杂、存储管理系统中最复杂、最难懂的操作和结构。最难懂的操作和结构。 vmscan.cvmscan.c 文件定义后台交换进程文件定义后台交换进程 kskswapdwapd 的代码,以及内存空间扫描函数,实的代码,以及内存空间扫描函数,实现现 LinuxLinux 的页面换出策略,如的页面换出策略,如 try_to_freetry_to_free_pages_pages 。。

Page 112: 第 9 章     文件系统

所有的存储分配策略都在所有的存储分配策略都在 mmmm 目录里实现。目录里实现。例如,例如, kmalloc.ckmalloc.c 实现核心内存块实现核心内存块 (( 以数据以数据结构结构 free_areafree_area表为人口表为人口 )) 的操作的操作 kmallockmalloc()() 、、 kfree()kfree() 等等 . vmalloc.c. vmalloc.c里包含里包含 vmallocvmalloc()() 、、 vfree()vfree() 、、 vremap()vremap() 等函数。等函数。 物理页面的申请函数源程序集中在物理页面的申请函数源程序集中在 page_page_alloc.calloc.c 中,如页面申请函数—中,如页面申请函数— get_free_paget_free_pages()ges() 。。

Page 113: 第 9 章     文件系统

内存管理中底层核心函数大多安排在内存管理中底层核心函数大多安排在memory.cmemory.c 文件中,如缺页中断响应函数文件中,如缺页中断响应函数 ddo_no_page()o_no_page() ,实现,实现 Copy on Write(COW)Copy on Write(COW)特性的特性的 do_wp_page()do_wp_page() ,以及众多页表管,以及众多页表管理函数。理函数。

Page 114: 第 9 章     文件系统

虚拟空间映射虚拟空间映射 (mapping)(mapping) 操作操作 do_do_mmap()mmap() 和和 do_munmap()do_munmap() ,以及系统调,以及系统调用用 brkbrk的响应函数,都涉及进程虚拟空间的响应函数,都涉及进程虚拟空间地址的调整,相关源代码在地址的调整,相关源代码在 mmap.cmmap.c 文件文件中。中。 对 对 mremapmremap 的操作代码则在的操作代码则在 mremamremap.cp.c 文件中。文件中。

Page 115: 第 9 章     文件系统

此外,此外, mlock.cmlock.c 文件实现四个关于文件实现四个关于内存内存 vmavma 段加锁操作的系统调用段加锁操作的系统调用 mlockmlock、、munlockmunlock、、 mlock-a11mlock-a11 、、 munlockallmunlockall 。。 mprotect.Cmprotect.C 实现实现 mprotectmprotect 系系统调用统调用 mprotectmprotect 。。

Page 116: 第 9 章     文件系统

(3) fs(3) fs 目录目录 文件处理是所有文件处理是所有 UNIXUNIX 系统都提供的系统都提供的基本功能。基本功能。 fsfs 目录源程序涵盖各种类型的目录源程序涵盖各种类型的文件系统和文件操作。文件系统和文件操作。 该目录下的每个子目录则分门别类地该目录下的每个子目录则分门别类地描述了某个特定的文件系统。描述了某个特定的文件系统。

Page 117: 第 9 章     文件系统

直接隶属该目录的文件分别是:直接隶属该目录的文件分别是:◆ ◆ exec.c exec.c 实现实现 execveexecve 系统调用。其余五种系统调用。其余五种关于装入执行程序的函数都由关于装入执行程序的函数都由 CC语言库文语言库文件实现。件实现。 execveexecve 支持脚本支持脚本 (script)(script) 文件和文件和多种格式的可执行文件。多种格式的可执行文件。◆ ◆ devices.c devices.c 负责设备的注册和注销,定义负责设备的注册和注销,定义缺省的打开设备操作和释放设备操作。缺省的打开设备操作和释放设备操作。

Page 118: 第 9 章     文件系统

◆ ◆ block_dev.cblock_dev.c 。包含缺省的读、写设备操作。包含缺省的读、写设备操作◆ ◆ super.csuper.c 。 定义超级块的读操作,以及文件。 定义超级块的读操作,以及文件系统的安装、卸装操作。系统的安装、卸装操作。◆ ◆ inode.cinode.c 。。 VFS inodeVFS inode 的读写操作,以及维的读写操作,以及维护护 inodeinode缓存的程序。缓存的程序。◆ ◆ dcache.cdcache.c 。 维护。 维护 dcachedcache 的文件。的文件。

Page 119: 第 9 章     文件系统

◆ ◆ namei.cnamei.c 。 访问权限检查。根据路径检。 访问权限检查。根据路径检索索 dentrydentry 的相关操作,如的相关操作,如 open_nameiopen_namei 、、path_walkpath_walk、、 buffer.c buffer.c 实现缓存区缓存的实现缓存区缓存的文件。文件。◆ ◆ open.copen.c 。文件的打开、关闭操作。系统调。文件的打开、关闭操作。系统调用用 chownchown 、、 chmodchmod 、、 fchownfchown 、、 fchmofchmodd 、、 chrootchroot 、、 chdirchdir 、、 fchdirfchdir 等也由该文等也由该文件实现。件实现。

Page 120: 第 9 章     文件系统

◆ ◆ read_write.cread_write.c 。系统调用。系统调用 readread 、、 writewrite 、、lseeklseek 、、 llseekllseek的源程序的源程序◆ ◆ oreaddir.coreaddir.c 。读目录项的系统调用。读目录项的系统调用 readdireaddirr 和和 getdentsgetdents 由此文件实现。由此文件实现。◆ ◆ select.cselect.c 。集中存放。集中存放 selectselect 操作的几乎全操作的几乎全部源代码。部源代码。

Page 121: 第 9 章     文件系统

◆ ◆ pipe.cpipe.c 和和 fifo.cfifo.c 。实现管道。实现管道 (pipe)(pipe) 和命名管和命名管道道 (fifo).(fifo). 除了除了 fifo_open()fifo_open() 和和 fifo_init()fifo_init()函数函数在在 fifo.cfifo.c 文件外,其余函数均存放于文件外,其余函数均存放于 pipe.cpipe.c文件中。文件中。◆ ◆ ioctl.cioctl.c 。实现系统调用。实现系统调用 ioctlioctl 。。◆ ◆ fcntl.cfcntl.c 。实现关于。实现关于 fcntlfcntl 操作命令的源代码。操作命令的源代码。◆ ◆ dquot.cdquot.c 。支持磁盘配额机制。支持磁盘配额机制 (quota)(quota) 。。

Page 122: 第 9 章     文件系统

(4) arch(4) arch 目录目录 与与 CPUCPU类型相关的子目录和文件均集中类型相关的子目录和文件均集中安排在此目录下。安排在此目录下。 这里又有子目录这里又有子目录 alphaalpha 、、 armarm 、、 armnoarmnommummu 、、 i386i386 、、 ia64ia64 、、 m68km68k、、 mipsmips 、、 mips6mips644 、、 pariscparisc 、、 ppcppc 、、 s390s390、、 shsh 、、 sparcsparc ,每个,每个子目录对应一种子目录对应一种 CPUCPU,例如,例如 /arch/armnommu//arch/armnommu/mach-micetekmach-micetek就是关于就是关于 MICETEKMICETEK 板,没有板,没有 mmmmuu 的的 arm CPU arm CPU 子目录。子目录。

Page 123: 第 9 章     文件系统

(5) include(5) include 目录目录 容纳容纳 LinuxLinux 源程序的所有头文件源程序的所有头文件 (he(header file)ader file) 。其中,与平台无关的头文件在。其中,与平台无关的头文件在 iinclude/linuxnclude/linux 子目录下,与平台无关低级子目录下,与平台无关低级头文件在头文件在 asm-genericasm-generic 目录下,与目录下,与 MICETMICETEK EK 平台相关的头文件在平台相关的头文件在 include/asm-arinclude/asm-armnommu/arch-micetekmnommu/arch-micetek 子目录下。子目录下。 另外,还有关于网络设备的头文件目另外,还有关于网络设备的头文件目录录 include/netinclude/net 。。

Page 124: 第 9 章     文件系统

(6) net(6) net 目录目录 在在 netnet 目录中存放的是和目录中存放的是和 LinuxLinux网络相关网络相关的的 CC 文件。其中每一种网络地址族都为一个文件。其中每一种网络地址族都为一个目录,如目录,如 appletalkappletalk、、 Ipv4Ipv4 等等。在等等。在 corecore目录下是各种网络地址族公用的文件。目录下是各种网络地址族公用的文件。 另外在另外在 schedsched 目录下存放的是对高性能网目录下存放的是对高性能网络的络的 QoSQoS 支持,支持, khttpdkhttpd 目录中存放的是内目录中存放的是内核级别的核级别的 -Web-Web服务器支持。服务器支持。

Page 125: 第 9 章     文件系统

(7) drivers(7) drivers 在在 driversdrivers 目录下,存放各种设备的驱动目录下,存放各种设备的驱动程序。其中程序。其中 ev44b0_soundev44b0_sound 、、 ev44b0_USBev44b0_USB 、、 eev44b0_kbdv44b0_kbd 、、 ev44b0_tsev44b0_ts 是是 MICETEKMICETEK平台的声平台的声卡、卡、 USBUSB 、键盘和触摸屏的驱动程序在、键盘和触摸屏的驱动程序在 /drivers//drivers/char char 目录下。目录下。 Smc9113Smc9113网卡驱动程序在网卡驱动程序在 /driver/drivers/nets/net 目录下。目录下。

除上述目录外,除上述目录外, LinuxLinux 源程序清单中还有源程序清单中还有ipcipc 、、 initinit 等目录。等目录。

Page 126: 第 9 章     文件系统

9.4 9.4 简单编程事例简单编程事例 熟悉熟悉 uClinuxuClinux 环境下文件系统,了环境下文件系统,了解解 uClinuxuClinux 中文件系统的体系结构,编写中文件系统的体系结构,编写文件系统处理程序。文件系统处理程序。 例例 11 .在.在 uClinuxuClinux 中实现文件的打中实现文件的打开和读写操作,同时对开和读写操作,同时对 ROMFSROMFS 和和 RAMDISRAMDISKK中的中的 EXT2EXT2 文件系统进行了操作,从而了文件系统进行了操作,从而了解了解了 ROMFSROMFS 文件系统的特性,对在文件系统的特性,对在 RAMDRAMDISKISK 中保存数据有了一些认识。中保存数据有了一些认识。

Page 127: 第 9 章     文件系统

下面对本例题涉及到的函数进行简要介绍:下面对本例题涉及到的函数进行简要介绍:int creat(const char *pathname,mode_t int creat(const char *pathname,mode_t mode);mode);

以以 modemode方式创建一个以方式创建一个以 pathnampathnamee 为文件名的文件,返回新的文件句柄为文件名的文件,返回新的文件句柄 fdfd ,,错误返回错误返回 -1-1 及错误代码及错误代码 errnoerrno 。。

Page 128: 第 9 章     文件系统

Int open(const char *pathname,int flags);Int open(const char *pathname,int flags); 以以 flagsflags方式打开一个以方式打开一个以 pathnamepathname为文件名的文件,正确返回为文件名的文件,正确返回 00,错误返回,错误返回 --11 及错误代码及错误代码 errnoerrno 。。

Page 129: 第 9 章     文件系统

size_t read(int fd,void *buf, size_t count);size_t read(int fd,void *buf, size_t count); 把把 fdfd指向的文件传送指向的文件传送 countcount 字节到字节到 bufbuf指指针所指向的内存中,正确返回实际写入的字针所指向的内存中,正确返回实际写入的字节数,错误返回节数,错误返回 -1-1及错误代码及错误代码 errnoerrno 。。

Page 130: 第 9 章     文件系统

size_t write(int fd,void *buf, size_t count);size_t write(int fd,void *buf, size_t count); 把把 bufbuf指针所指向的内存指针所指向的内存 countcount 字节传送字节传送到到 fdfd指向的文件中,正确返回读到的字节指向的文件中,正确返回读到的字节数或数或 00,错误返回,错误返回 -1-1 及错误代码及错误代码 errnoerrno 。。

Page 131: 第 9 章     文件系统

off_t lseek(int fd,off_t offset,int where);off_t lseek(int fd,off_t offset,int where); 将将 fdfd 所指文件的读写指针在所指文件的读写指针在 wherewhere位置移动位置移动 offsetoffset 个位移量。个位移量。

int close(int fd);int close(int fd); 关闭关闭 fdfd 所指文件,顺利关闭返回所指文件,顺利关闭返回 00 ,,错误返回错误返回 -1-1 。。 程序框图程序框图如图如图9-69-6所示所示。。

Page 132: 第 9 章     文件系统

源程序如下:源程序如下:#include "stdio.h"#include "stdio.h"#include <stdlib.h>#include <stdlib.h>#include <sys/types.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/stat.h>#include <fcntl.h>#include <fcntl.h>#define TEST_STRING "TEST file operati#define TEST_STRING "TEST file operation on different FS"on on different FS"

Page 133: 第 9 章     文件系统

int main(int argc,char * argv[])int main(int argc,char * argv[]){{

int fd,op_flag;int fd,op_flag;char * filename;char * filename;int len;int len;char buf[128];char buf[128];/* check input parameters *//* check input parameters */

Page 134: 第 9 章     文件系统

if(argc < 2)if(argc < 2){{fprintf(stderr,"please give filename");fprintf(stderr,"please give filename");exit(1);exit(1);}}/* open file *//* open file */filename = argv[1];filename = argv[1];op_flag = O_RDWR | O_CREAT;op_flag = O_RDWR | O_CREAT;

Page 135: 第 9 章     文件系统

if((fd=open(filename,op_flag)) <0)if((fd=open(filename,op_flag)) <0){{/* open error *//* open error */

fprintf(stderr,"open file %s errfprintf(stderr,"open file %s error",filename);or",filename);exit(1);exit(1);

}}/* write file *//* write file */

Page 136: 第 9 章     文件系统

if((len = write(fd,TEST_STRING,strlen(TEST_STif((len = write(fd,TEST_STRING,strlen(TEST_STRING)+1)) != strlen(TEST_STRING)+1)RING)+1)) != strlen(TEST_STRING)+1){{/* write file error *//* write file error */fprintf(stderr,"write file %s error",filenafprintf(stderr,"write file %s error",filename);me);

exit(1);exit(1);}}

/* seek current file pointer to the start of file *//* seek current file pointer to the start of file */

Page 137: 第 9 章     文件系统

if(lseek(fd,0,SEEK_SET) != 0)if(lseek(fd,0,SEEK_SET) != 0){{ fprintf(stderr,"fseek file %s errfprintf(stderr,"fseek file %s error",filename);or",filename);exit(1);exit(1);}}/* read file *//* read file */

Page 138: 第 9 章     文件系统

if((len = read(fd,buf,128)) != strlen(TEST_if((len = read(fd,buf,128)) != strlen(TEST_STRING)+1)STRING)+1){{/* read file error *//* read file error */fprintf(stderr,"read file %s len error",filefprintf(stderr,"read file %s len error",filename);name);exit(1);exit(1);}}/* compare write-read *//* compare write-read */

Page 139: 第 9 章     文件系统

if(memcmp(TEST_STRING,buf,len) != 0)if(memcmp(TEST_STRING,buf,len) != 0){{/* content different *//* content different */

fprintf(stderr,"check file %s cofprintf(stderr,"check file %s content error",filename);ntent error",filename);exit(1);exit(1);

}}

Page 140: 第 9 章     文件系统

printf("\nfile %s open-write-read ok \n",printf("\nfile %s open-write-read ok \n",filename);filename);/* close fd *//* close fd */close(fd);close(fd);return 0;return 0;}}

Page 141: 第 9 章     文件系统

9.5 9.5 本章小结本章小结 本章主要介绍了本章主要介绍了 LinuxLinux 的文件系统的文件系统结构,了解了结构,了解了 LinuxLinux 采用采用 VFSVFS ,支持如,支持如 roromfsmfs 、、 ramfsramfs 、、 ex2ex2 、、 jffs2jffs2 、、 ms-dosms-dos 、、nfsnfs 等各种文件系统;等各种文件系统; 给出了给出了 LinuxLinux 源程序和开发板根文源程序和开发板根文件系统件系统 romfsromfs 的目录结构和功能描述;的目录结构和功能描述; 另外给出了在另外给出了在 uClinuxuClinux 中文件的打开中文件的打开和读写操作示例。和读写操作示例。

Page 142: 第 9 章     文件系统

练习题练习题1.1. 简述简述 LinuxLinux 文件系统结构,并说明文件系统结构,并说明 VFSVFS的作用。的作用。2.2. 简述简述 romfsromfs 和和 ramfsramfs 文件系统结构,文件系统结构,并说明区别。并说明区别。3.3. 简述简述 jffsjffs 和和 jffs2jffs2 文件系统结构。文件系统结构。4.4. 简述简述 uClinuxuClinux 各个子目录的作用。各个子目录的作用。