答案1
在VFS层中,所有文件都是虚拟的(它实际上是SunOS工程师发明的,用于将UFS(基于磁盘)和NFS(基于网络)文件系统结合起来)。
每个 openfile
都有一个函数表f_op
,这些函数表提供通用例程(其中一些可能是通用的)的实现,并且每个inode
都有一个附加对象,该对象还具有包含必要实现的address_space
C 函数表 ( )。a_ops
顺序是这样的:
sys_read()
:应用程序使用系统调用发起文件读取- 调用被传递到 VFS 堆栈顶层 (
vfs_read()
) file->f_op->read()
使用或do_sync_read()
或将调用传递给文件系统驱动程序new_sync_read()
- 如果文件以直接输入输出模式打开,则调用适当的函数(
a_ops->direct_IO()
、ext4_direct_IO()
forext4
)并返回数据 - 如果在页面缓存中找到页面,则返回数据
file_get_page()
- 如果在页面缓存中找不到页面,则使用从文件系统读取该页面
a_ops->readpage()
,这是由ext4_readpage()
fromext4
driver实现的 - VFS 堆栈使用以下命令创建块输入输出请求
submit_bio()
从http://myaut.github.io/dtrace-stap-book/kernel/fs.html,它有点过时了,因为在我写完这篇文章后,VFS 堆栈被重构了一点
答案2
我不会以任何方式对此给出详尽的答案......
你基本上是正确的,除了一个重要的分离:读()问道核心文件描述符包含什么核心处理其余的事情。无论是物理文件系统、网络文件系统、虚拟文件系统(/proc、/sys、...)都与读()。内核有底层代码来服务请求(或不服务),这就是您所说的驱动程序。