5分钟搞懂Linux中直接I/O原理
下边我们来看一下当历程通过 read() 体系挪用读取一个已经配置了 O_DIRECT 标识符的文件的时辰,体系都做了哪些处理赏罚。 函数 read() 的原型如下所示:
操纵体系中处理赏罚 read() 函数的进口函数是 sys_read(),其首要的挪用函数相关图如下:
函数 sys_read() 从历程中获取文件描写符以及文件当前的操纵位置后会挪用 vfs_read() 函数去执行详细的操纵进程,而 vfs_read() 函数最终是挪用了 file 布局中的相干操纵去完成文件的读操纵,即挪用了 generic_file_read() 函数,其代码如下所示:
函数 generic_file_read() 初始化了 iovec 以及 kiocb 描写符。描写符 iovec 首要是用于存放两个内容:用来吸取所读取数据的用户地点空间缓冲区的地点缓和冲区的巨细;描写符 kiocb 用来跟踪 I/O 操纵的完成状态。之后,函数 generic_file_read() 凋用函数 __generic_file_aio_read()。该函数搜查 iovec 中描写的用户地点空间缓冲区是否可用,接着查看会见模式,若会见模式描写符配置了 O_DIRECT,则执行与直接 I/O 相干的代码。函数 __generic_file_aio_read() 中与直接 I/O 有关的代码如下所示:
上边的代码段首要是搜查了文件指针的值,文件的巨细以及所哀求读取的字节数量等,之后,该函数挪用 generic_file_direct_io(),并将操纵范例 READ,描写符 iocb,描写符 iovec,当前文件指针的值以及在描写符 io_vec 中指定的用户地点空间缓冲区的个数等值作为参数传给它。当 generic_file_direct_io() 函数执行完成,函数 __generic_file_aio_read()会继承执行去完成后续操纵:更新文件指针,配置会见文件 i 节点的时刻戳;这些操纵所有执行完成往后,函数返回。 函数 generic_file_direct_IO() 会用到五个参数,各参数的寄义如下所示:
(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |