精华区 [关闭][返回]

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

主题:FreeBSD核心探讨.5.驱动程序篇
发信人: liangvy()
整理人: hahalee(1999-03-26 15:07:54), 站内信件
(liangvy.icewolf.leon)
2。2    虚拟文件系统和v-node
        FreeBSD在disk上的除了ffs以外还可以操作各种各样的文件系统。主要的如
下:
        。cd9660
          可以对ISO9660形式的cd-rom的目录/文件构造的文件系统进行mount,
          locate等目录层的操作
        。ms-dos
          对ms-dos文件系统进行目录层次的mount,定位等操作
        。mfs
          通过使用虚拟内存对swap区的一部分进行unix文件系统的构造,定位
          作为目录的一部分进行读写
        。nfs
          由nfs server提供的remote目录级进行mount,定位的目录层操作。
        。null
          对已经存在的目录层的使用别名
        。union
          对已有的目录A(上层)在下层目录B上进行重叠 (不大理解这的意思
          ,大概是在下层目录里面又嫁接了上层目录的意思:译者)。文件名的查
          找由上层优先进行。没有的话就转道下层。如果对下层的文件进行写操作
          ,它的拷贝就在上层上进行。举例说明,作业目录在上层,但cd-rom的源
          在下层,两个目录重叠,那么编译source的时候,就相当方便了。
        。procfs
          对于进程号的目录作成mount point。通过文件名对各个目录的进程进行
          控制。
        。kernfs
          为了对动作中的kernel有关的信息进行参考,而作成的mount  point
        。fdesc
          对于各个进程,用它所打开的文件柄对应的文件作成的mount point
        
        实际上,在核心内部,为了对它们进行统一操作,就对文件系统和v-node
进行抽象化,实际的处理过程就是调用各类的文件系统的模块进行处理。

2。2。1对虚拟文件系统的操作
        各个文件系统可以提供的操作的一览如下,它在struct vfsops
(@sys/mount.h)里面定义:
        。对文件系统进行mount的操作
        。本文件系统的开始动作的操作
        。本文件系统的umount操作
        。表达文件系统的根的v-node的查找操作
        。对一般用户的权限控制
        。取得文件系统的状态
        。内存内的管理信息写入介质中
        。从i-node到v-node的取得操作
        。v-node和nfs的文件柄的相互变换的操作
        。文件系统实际的模块的初始化

对于文件系统,各个实际的操作routine在vfsops的形式提供准备工作。各个文件系
统的vfsops,在以下的表里的source进行定义:

--------------------------------------------------------------
file system     vfsops的定义    source
--------------------------------------------------------------
ufs             ufs_vfsops      ufs/ffs/ffs_vfsops.c
cd9660          cd9660_vfsops   isofs/cd9660/cd9660_vfsops.c
msdos           msdosfs_vfsops  msdosfs/msdosfs_vfsops.c
mfs             mfs_vfsops      ufs/mfs/mfs_vfops.c
nfs             nfs_vfsops      nfs/nfs_vfsops.c
null            null_vfsops     miscfs/nullfs/null_vfsops.c
nuion           union_vfsops    miscfs/union/union_vfsops.c
procfs          procfs_vfsops   miscfs/procfs/procfs_vfsops.c
kernfs          kernfs_vfsops   miscfs/kernfs/kernfs_vfsops.c
fdesc           fdesc_vfsops    miscfs/fdesc/fdesc_vfsops.c
devfs           devfs_vfsops    miscfs/devfs/devfs_vfsops.c
ext2fs          ext2fs_vfsops   gnu/ext2fs/ext2_vfsops.c
lfs             lfs_vfsops      ufs/lfs/lfs_vfsops.c
portal          portal_vfsops   miscfs/portal.portal_vfsops.c
umap            umap_vfsops     miscfs/umapfs/umap_vfsops.c
---------------------------------------------------------------
这些就是文件系统的实际模块(*_vfsops.c),文件系统名称,文件系统号等等
在struct vfsconf(@sys/mount.h)里面汇总,各个模块里用宏VFS_SET()进入核
心。
        根据main()(@kern/init_main.c),在kernel初始化的过程中,vfsinit()
(@kern/vfs_init.c)里面有
        struct vfsconf  *vfsconf[MOUNT_MAXTYPE+1];
        struct vfsops   *vfssw[MOUNT_MAXTYPE+1];
各种东西的设定,这些是,管理mount信息的struct mount(@sys/mount.h)的成员
mnt_vfc和mnt_op要指定所对应的文件系统的vfsconf,vfssw。还有宏VFS_操作名
(struct mount *,..)里,可以各个操作的调用。

2。2。2对v-node的操作
虚拟文件系统就是通过对i-node的抽象化之后的v-node的文件/目录进行io处理。
为了这个目的,作为对v-node的适用处理,有
        。从v-node到文件名的查找,返回v-node
        。打开/关闭v-node
        。检查是否可能访问v-node
        。得到-v-node的属性
        。设定v-node的属性
        。对v-node的输入/输出
        。扩展v-node的硬连接和符号连接
        。对v-node进行目录的作成和删除
        。。。。
由这里开始,一共定义了41个。
        v-node由struct vnode(@sys/vnode.h)里定义,作为类别在enum vtype
里面表示出来,一共是9种类。它包含着在各个文件系统上对各个的文件/目录(包
括特殊)文件进行统一识别的信息。为了实现这样,v-node一连串的操作就是在各
模块里通过宏VNODEOP_SET()和核心通讯。这些操作名和实现的routine只需要必要
的几个对应。在核心初始化里,vfs_opv_init()(@kern/vfs_init.c)就使从数据得
到的号码一一对应,收集了routine的地址的同一size的配列再进行组合。各个
v-node就一个一个指向这些配列。对v-node的操作在vnode_if.h里定义:
它以
        VOP_操作名(v-node,...)
的统一形式记述。

        下面是对v-node的操作的定义source:
------------------------------------------------------------------------
各个v-node操作(vnodeopv)      source
------------------------------------------------------------------------
cd9660_fifoop_opv_desc          isofs/cd9660/cd9660_vnops.c
cd9660_specop_opv_desc          isofs/cd9660/cd9660_vnops.c
cd9660_vnodeop_opv_desc         isofs/cd9660/cd9660_vnops.c
dead_vnodop_opv_desc            miscfs/deadfs/dead_devfs_vnops.c
devfs_vnodeop_desc              miscfs/devfs/devfs_vnops.c
ext2fs_fifoop_opv_desc          gnu/ext2fs/ext2fs_vnops.c
ext2fs_specop_opv_desc          gnu/ext2fs/ext2fs_vnops.c
ext2fs_vnodeop_opv_desc         gnu/ext2fs/ext2fs_vnops.c
fdesc_vnodeop_opv_desc          miscfs/fdesc/fdesc_vnops.c
ffs_fifoop_opv_desc             ufs/ffs/ffs_vnops.c
ffs_specop_opv_desc             ufs/ffs/ffs_vnops.c
ffs_vnodeop_opv_desc            ufs/ffs/ffs_vnops.c
fifo_nfsv2nodeop_opv_desc       nfs/nfs_vnops.c
fifo_vnodeop_opv_desc           miscfs/fifofs/fifo_vnops.c
kernfs_vnodeop_opv_desc         miscfs/kernfs/kernfs_vnops.c
lfs_fifoop_opv_desc             ufs/lfs/lfs_vnops.c
lfs_specop_opv_desc             ufs/lfs/lfs_vnops.c
lfs_vnodeop_opv_desc            ufs/lfs/lfs_vnops.c
mfs_vnodeop_opv_desc            ufs/mfs/mfs_vnops.c
msdosfs_vnodeop_opv_desc        msdosfs/msdosfs_vnops.c
nfsv2_vnodeop_opv_desc          nfs/nfs_vnops.c
null_vnodeop_opv_desc           miscfs/nullfs/null_vnops.c
portal_vnodeop_opv_desc         miscfs/portal/portal_vnops.c
procfs_vnodeop_opv_desc         miscfs/procfs/procfs_vnops.c
spec_nfsv2nodeop_opv_desc       nfs/nfs_vnops.c
spec_vnodeop_opv_desc           miscfs/specfs/spec_vnops.c
umap_vnodeop_opv_desc           miscfs/umapfs/umap_vnops.c
union_vnodeop_opv_desc          miscfs/union/union_vnops.c
------------------------------------------------------------------------
这个基础上,spec_vnodeop_opv_spec里描述的操作群就是device driver 
interface的东西!!

( 本小节完,待本岛主有空再继续:-) )
liangvy.icewolf.leen
--

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

[关闭][返回]