现在的位置: 首页 > 综合 > 正文

文件系统概述

2018年04月17日 ⁄ 综合 ⁄ 共 3282字 ⁄ 字号 评论关闭
一、文件系统概述
(1)在计算机系统中,要用到大量的程序和数据,它们以文件的形式存放在外存中,需要时可随时将它们调入内存.如果由用户直接管理外存上的文件,不仅要求用户熟悉外存特性,了解各种文件的属性,以及它们在外存上的位置,而且在多用户环境下,还必须能保证数据的安全性和一致性.显然这不是最佳选择.
(2)为了解决文件管理的问题,在操作系统中出现了文件系统,负责管理在外存上的文件,并把对文件的存取、共享和保护等手段提供给操作系统和用户。这不仅方便了用户,保证了文件的安全性,还有效地提高了系统资源的利用率.
(3)在16bit单片机系统中由于没有文件系统,用户从存储器(如E2PROM)中读出的是一堆二进制代码,这种处理机制效率低,且容易出错.在ARM-linux嵌入式系统中由于文件系统的存在,它帮助用户屏蔽了底层硬件,用户看到的都是文件,比如hello.txt、long.mp3等,这样用户就可以通过函数read()、write()来操作这些文件,虽然实质上仍是对存储器上的二进制数据进行操作,但开发难度降低.这就是文件系统的作用.
 
二、磁盘分区
(1)
Windows磁盘分区
   <1>在Windows操作系统中,采用行向分区,即先将整个硬盘切开,分为若干个主分区,比如C盘、D盘、E盘、F盘等,再将文件放入不同的磁盘分区内.
   <2>C盘可以看做是Windows操作系统的根分区.
   <3>当然,每个主分区下还可以分为多个扩展分区.
(2)PC机的linux磁盘分区
   <1>在linux操作系统中,采用纵向分区,即先将根文件分为若干个子目录,比如boot目录、bin目录、usr目录、lib目录、proc目录等,再将整个硬盘上的分区与各个子目录相对应.
   <2>默认情况下linux系统将整个硬盘分为3个分区,分别是boot分区、swap分区和根分区.
      1.boot分区:该分区只有目录/boot与之对应.在/boot目录下主要存放着Grub子目录及内核镜像.因此,用户对目录/boot的访问就是对boot分区的访问.
      2.swap分区:该分区用于虚拟内存,在linux系统中没有相应的目录文件与之对应.
      3.根分区:除/boot目录外,剩下所有的目录文件均在根分区.
  【attention
   1.在linux操作系统中,根分区可以访问boot分区.可以认为将boot分区挂载到根分区的boot目录下,这样根分区就可以通过访问/boot目录来访问boot分区.
   2.重装linux系统时,默认会将boot分区、虚拟分区、根分区都进行格式化.
   3.swap分区没有相应的目录文件与之对应.
   4.所谓的根文件系统不包括boot目录.
(3)嵌入式linux磁盘分区
   <1>在嵌入式linux中,只有Flash,而不是硬盘.它有3个分区,分别是Bootloader分区、kernel分区和rootfs分区.
   <2>嵌入式linux磁盘的分区方法类似于Windows,它也是先确定每个分区的起始地址及偏移量,然后再向该地址范围内烧入相应的镜像文件.对于Bootloader和kernel,是将二进制数据烧入相应的地址范围内.对于根文件系统,是将文件系统烧入相应的地址范围内.
   <3>PC机的linux与ARM的linux区别之一在于后者的Bootloader、kernel只是一堆二进制数数据,并没有相应的文件系统,且根文件系统中并没有boot目录,因此不能将Bootloader和kernel挂载到根文件系统中,这样根文件系统也就无法访问bootloader和kernel.而在PC机的linux系统中,根文件系统可以通过boot目录来访问boot分区.
   <4>嵌入式系统中的Bootloader和kernel的作用类似于PC机上linux系统中的Boot分区.在嵌入式系统中,没有类似的swap分区,即嵌入式系统不能使用虚拟内存,其实际物理内存是多大就只能使用多大,不能因为内存小而占用Flash空间而形成虚拟空间.
 
三、根文件系统
(1)根文件系统
   linux要在一个分区上存放系统启动所必需的文件,比如内核镜像文件、内核启动后运行的第一个程序(init)、给用户提供操作界面的shell程序,应用程序所依赖的库等.这些必需、基本的文件合称为根文件系统.Linux系统启动后首先挂载这个分区.一般都包括这样一些子目录:/etc/、/dev/、/usr/、/bin/、/var/等.
(2)普通文件系统
   根文件系统由各个目录组成,其它目录上的所有目录、文件的集合,也成为普通文件系统.比如U盘具有fat格式的文件系统,当把U盘插入嵌入式系统中时,为了访问U盘这种物理介质,必须将U盘挂载到根文件系统的某个目录下,常用的挂载点是/mnt目录.现假定/mnt目录原有yaffs格式的文件系统,当挂载成功后,/mnt目录就编程了fat格式的文件系统.需要说明的是,原有的yaffs文件系统只是暂时的屏蔽了,并没有从Flash上消息.当卸载U盘时,/mnt目录仍为yaffs格式的文件系统.所以说,根文件系统下的每个子目录都可以有各自的文件系统.注意,在Windows下U盘时fat格式文件系统,在Linux下是vfat格式文件系统,两者其实是一种,只是名字不同而已.
(3)在根文件系统的最顶层目录中,每个目录都有其具体的目的和用途,一般根据FHS(文件系统层次标准,主要规定顶层文件夹的名字,大家必须统一用相同的名字)定义建立一个正式的文件系统结构,各个分区根据情况分别挂载不同的根文件系统.FHS并不是一个强制性的标准,但大多数的Linux、UNIX发行版都遵循该标准.

四、虚拟文件系统
   虚拟文件系统(VFS)作为内核子系统,为用户空间程序提供了文件系统相关的接口.系统中所有文件系统不但依赖VFS共存,而且也依靠VFS系统协同工作.通过虚拟文件系统,程序可以利用标准的UNIX文件系统调用对不同介质上的不同文件系统进行读写操作.VFS主要有两方面的作用:
(1)为kernel识别不同的文件系统类型
   当内核启动后系统会先启动虚拟文件系统,由于不同物理介质上的文件系统类型不同,因此kernel需要VFS来帮忙识别当前物理介质上是哪种文件系统.其实,无论什么类型的文件系统,对于VFS而言,它只是一个文件而已.在嵌入式系统的启动过程中,VFS是对内核所支持的文件系统进行一一识别.比如,VFS识别出当前系统是yaffs格式的文件系统,则内核便将控制权交给了yaffs文件系统.注意,VFS始终都存在.
(2)为不同类型文件系统之间数据通信提供了桥梁作用
   在嵌入式系统中,允许根文件系统下各个子目录具有不同格式的文件系统,而子目录间会有一些数据流通,比如将当前子目录下的某个文件拷贝到另一子目录下,由于两个子目录具有不同格式的文件系统,因此必须借助于虚拟文件系统VFS的帮忙.由于VFS的存在,就可以使用标准的open()、read()和write()这样的系统调用而无需考虑具体文件系统和实际物理介质.例如:
    #cp /hard/v1 /soft/v2  /*目录hard是ext3格式,目录soft是yaffs格式*/
   该命令作用是将目录hard下的v1文件拷贝到目录soft,并重命名为v2.由于两个子目录具有不同格式的文件系统,它们之间的转换就需要VFS.当系统执行该命令时,cp首先被VFS拿到,翻译时它会先找到cp命令的源地址(hard目录),根据源地址的文件格式调用其系统调用函数read(),将文件内容读出.再找到cp命令的目的地址(soft),根据目标地址的文件格式调用其系统调用函数write(),最后将内容写入v2文件内.这就是VFS的作用.注意,虽然不同类型的文件系统都具有标准的系统调用函数open()、read()和write(),但这些函数在不同文件系统中实现的方法也不同,它们只是名字相同而已.
【上篇】
【下篇】

抱歉!评论已关闭.