现在的位置: 首页 >> 操作系统 >> FreeBSD >> FreeBSD 核心 (2)
添加时间:2005-8-21 来源:网教中国 作者:
FreeBSD 核心 (2)

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

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_des

[1] [2] [3] [4]  下一页


上一篇:FreeBSD 核心 (1) 下一篇:FreeBSD内核定制参考
大部分文章摘自网上,如有侵犯您的权益请与我们联系,我们会第一时间进行处理,谢谢! [ 打印文章 ] [ 关闭窗口 ]
推荐文章
·FreeBSD handbook中文版 9 配制F
·FreeBSD 升级系统
·Ports & Package
·FreeBSD kernel 编译大法(二)ker
·FreeBSD 上使用Kerberos 5认证
·FreeBSD 5.x 中 gbfs 的修正,及
·FreeBSD 安装Linuxigd
·FreeBSD 使用cvsd创建安全的cvs
·FreeBSD trafcount命令介绍
·FreeBSD入门安装及汉化
相关文章
·FreeBSD 核心 (1)
·FreeBSD4.8 IPFW How to!
·FreeBSD下的内存文件系统
·FreeBSD内核定制参考
·freebsd系统日志与备份
·关于FreeBSD4.4网络源代码接口层
·FreeBSD 5.2.1 boot0(启动扇区代
·FreeBSD中的设备命名规则
·FreeBSD 5内核源代码分析之copyi
·FreeBSD 5内核源代码分析之系统
最新文章
·FreeBSD连载(94):基于NAT的负载
·FreeBSD连载(93):反向代理负载
·FreeBSD连载(92):基于DNS的负载
·FreeBSD连载(91):提升静态网页
·FreeBSD连载(90):单服务器性能
·FreeBSD连载(89):CGI和SSI的安
·FreeBSD连载(88):安全连接方式S
·FreeBSD连载(87):基于用户的访
·FreeBSD连载(86):对IP地址和域
·FreeBSD连载(85):配置Apache服(
Google