精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● FreeBSD>>FreeBSD 核心探讨 (cool!)>>FreeBSD核心探讨.4.驱动程序篇

主题:FreeBSD核心探讨.4.驱动程序篇
发信人: liangvy()
整理人: hahalee(1999-03-22 08:31:19), 站内信件
翻译:liangvy           [email protected]     icewolf.leon :-)
版权所有,可以转贴

                        第二章  文件系统和设备驱动程序

    这章主要介绍文件系统和特殊的设备文件以及它们的对应关系。

2。1 disk上的 unix file system 的基本知识
    首先介绍一下经典的unix file system的思维方法。
    disk 的 partition就是从0到512byte的连续长度的block的东西。这里有
        1.file/directory有关的固定长度的信息,i-node
        2.file/directory的本体,data block
    的两样不同的东西。partition的前面的附近块(block#16 ,1--15用于boot 
    program :-))就是i-node,data block用的领域等等的开始位置(block号)
    和长度(block数量)等的记录,叫做super-block。一个block可能的容量只
    能有固定数目的i-node,所以如果分配了固定的i-node,收录了节点号和节
    点的块号和块的位置就可以计算出来。
        i-node就是
            。表明i-node的种类(file ,direstory,device等)
            。这个节点参考的次数(目录数)
            。参考,作成,变化的时间
            。权限
            。所有者的user id / group id
            。本体的长度
            。收集本体的data block的block号码的固定长度的对应表
              的一些记录。因为data block的对应表是固定的关系,比
              如10个,最长就能够作出512*10=5k为止的file。

   当文件比块大的时候,unix就采用成组联结的方式对它们进行管理。就是
   把所有的空闲块以一定数目为一组的方法作成单向空闲块stacker。
   特别地,文件的从先头的byte位置开始和i-node内的对应表有着密切的关系。
   而且,对于i-node的输入输出,可以对应指定位置的数据块进行读写。重要
   的是,核心可以依照这个管理表对io装置进行管理。
        unix对io设备的操作也是作为(特殊)文件进行的。对于用i-node进行
   描述的io设备,data block数据块的对应表就没必要了。这个部分的io设备
   的识别就通过device号码来进行。向这些对i-node进行输入输出处理的,
   就又设备驱动号区别,来进行device driver驱动。
        那么,节点怎么的进行查找呢?partition的最初的目录(根目录)就是,
   从第二个i-node开始,一个一个顺着节点进行查找。
        比如,对于目录/uuu/vvv/.../yyy/zzz的查找方式,有这种关系:
        。i-node #2 所存放的是root directory。读入它的本体,就可以找到
          相应的uuu所对应的i-node。
        。读入这个i-node所存放的directory的i-node本体,找到相应的vvv节点。
          ......
          查找对应yyy的节点
        。读入这个节点的本体信息,这里包含目录本题的内容,这样就可以找到
          zzz所对应的i-node。
        目录里面由于记录了对应文件名的节点号,所以,也有可能同一个节点号
    根据文件名不一样,就可以找到不同的目录名。这就是硬连接(hard link).
    但是,节点号有只存在于节点所在的分区的含义,所以,不同的分区,
    这种硬连接就不具有存在的可能性。为了解决这个矛盾,就有了符号连接
    (symble link)的说法。当节点是输入符号连接的时候,符号连接就包含
    了这个节点的data block所指定的路径名。但是,空连接和loop连接这种
    情况也是允许的,所以核心要指定循环连接的最大次数。具体由参数
    MAXSYMLINKS(@sys/param.h)指定。
        这样,多个分区建立一个文件系统就有可能了。启动核心的分区作为一个
   已存的文件系统,其他的分区就嫁接到目录层上面。这个操作过程就是mount。
   利用mount指令,就可以实现上面的操作。但是,mount之前的目录,在mount后
   就给屏蔽了,直到mount结束,那些目录就可以再现。
        以上就是经典的unix文件系统理论。但是,对于读入了i-node,就去读
   data block ,这种情况,对于一个比较大的分区,硬盘磁头向disk head的距
   离就太大了。总的来说,访问时间就会变长。在这里有一些指导思想:
        。分区要比较小,多分小区
        。了解超级块的地位,超级块记录了分区的信息,考虑由于介质的原因而
          使这个超级块造成损害,所以,在分区内部就必须为它准备多几个拷贝。
        。目录和它下层的文件,要在相同的领域内放置。
        。确保单位data block要比磁盘的block大。
        考虑了一些东西后,经过改良标准,freebsd就采用一个叫做FFS的文件系
   统(Fast File System),但这只是i-node领域/data领域的配置方法的变化,基
   本的考虑方法并没有变。对磁盘分区进行文件系统的构造的初始化由命令newfs
   提供。看看它的source就知道怎么配置的了。其他的构造(......)对应于kernel
   的source,对于构成boot program的文件disk.c和sys.c(@i386/boot/biosboot)
   比较简单易懂(单纯性)。
        上面讲述的i-node对disk的partition的记录形式,详细的(source)在
   struct dinode(@ufs/ufs/dinode.h)里面有。在核心内部使用的,包含这个东西
   的是struct inode(@ufs/ufs.inode.h)。

        描述io设备的文件叫特殊文件(special file),他对应的i-node有两个种
   类:
        。块型(block)
          和装置的固有的数据记录的单位(大多数的情况是512byte)无关。读写
          的最小单位是1byte,可以在任意的场所里任意长度的data。核心对各个
          block型的特殊文件进行固定的记录单位长度(倍数)进行缓冲(buffer)
          管理,这样就可以处理任意长度的读写了.
        。文字型(char)
          读写的基本单位是,受到装置固有的date记录单位长的限定。没有block
          型的缓冲管理,对应于装置的物理特性,读写属于专用。或者说,是读写
          两用。
        除了网络接口之外,io装置可以全部分为文字型和块型两个大类。总的来说,
   磁盘操作的两样都用,但其他的io装置只有文字型。还有就是一些没对应物理设
   备的kernel modules提供的虚拟设备也有,它们对应着文字型的特殊文件。特殊
   文件习惯放在目录/dev里面。

        对于特殊设备文件的i-node有block和chat两个类,设备通过驱动号进行记录
   。通过这些,就可以识别device driver。device 号就是major号(8bit)(主设备
  号)和minor号(24bit)(辅助设备号),device driver的识别就是由major的不
  一样而区别。而且呢,block型,char型的等等可能存在最大数目是256种类。一般的
  情况,同种类的设备不同数目的区别就是通过辅助设备号进行识别。实际上,对于
  disk的特殊文件,有disk/slide/partition表示法,而且,文字型,块型等的特殊
  设备文件也存在。以下就是一个ide硬盘的的文字型特殊设备文件的例子:
        /dev/rwd0               1台ide的硬盘
        /dev/rwd0s1             1台ide的硬盘的slide #1
        /dev/rwd0s2             1台ide的硬盘的slide #2
        /dev/rwd0s2a            slide #2的partition a
        /dev/rwd0s2b            slide #2的partition b
        ...
        /dev/rwd0s3             1台的ide的硬盘的slide #3

        如果把rwd换成wd,对应的就是block型的特殊设备文件了。
        对于磁盘,有如下的使用方法:
        。对于slide的文字型特殊文件
                读写disk label时候使用(disklabel command)
        。对于对应的partition的文字型特殊文件
                在分区上建立unix文件系统时候(newfs command),文件系统修复,
                检查(fsck)时候使用
        。对于partition的block型的特殊文件
                作为mount命令的参数使用
        (下一节介绍虚拟文件系统和v-node,要休息了:-) )

--
        Welcome to SuSE Linux 6.0 (i386) - Kernel 2.2.3 (tty1)
        liangvy # uname -a
        Linux liangvy.icewolf.leon 2.2.3 #12 Sun Mar 14 20:38
        CST 1999 i686 unknown
        

--
※ 来源:.网易 BBS bbs.netease.com.[FROM: www2.dt.sanyo.co.jp]

[关闭][返回]