Linux 版 (精华区)

发信人: tcpip (俺的昵称改了), 信区: Linux
标  题: FreeBSD核心探讨.5.驱动程序篇(转寄)
发信站: 哈工大紫丁香 (Tue Aug 24 16:45:50 1999), 转信

发信人: reden (Offer 快快来啊 ~!), 信区: FreeBSD       

标  题: FreeBSD核心探讨.5.驱动程序篇

发信站: BBS 水木清华站 (Mon Mar 29 19:49:32 1999)

标 题: FreeBSD核心探讨.5.驱动程序篇 

  

  作 者: liangvy (桃花岛主) 1999.03.26

  

  (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.net.tsinghua.edu.cn·[FROM: 159.226.21

.168]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.470毫秒