深入解析操作系统文件系统的间接调用机制
1. 从函数参数到参数指针
在读取包含ISO - 9660文件系统的CD时,通过指针进行的调用实际上会调用 cd9660_read 函数,即 rc = cd9660_read(a) 。
大多数与Unix相关的操作系统,如FreeBSD、Linux和Solaris,使用函数指针将文件系统的实现与访问其内容的代码隔离开来。FreeBSD还采用间接调用的方式来抽象读取函数的参数。
当遇到 vop->vop_read(a) 调用时,会好奇参数 a 是什么,以及之前假设的 VOP_READ 函数的四个原始参数发生了什么。经过研究发现,内核使用了另一层间接调用,允许文件系统相互层叠到任意深度。这种层叠使得一个文件系统可以基于另一个底层文件系统的服务提供一些额外的服务,如透明视图、压缩和加密。
有两种机制巧妙地协同工作来支持这一特性:
- 一种机制允许单个旁路函数修改任何 vop_vector 函数的参数。
- 另一种机制允许将所有未定义的 vop_vector 函数重定向到底层文件系统层。
例如,在图中展示了三个相互层叠的文件系统。最顶层是 umapfs 文件系统,系统管理员挂载它是为了映射用户凭证。下面是Berkeley Fast Filesystem (ffs),它在大多数操作上依赖于原始4.2 BSD文件系统实现 ufs
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



