linux - direct_io失败的原因

标签 linux file-io kernel

我想知道在什么情况下直接 I/O 传输会失败?

我有以下三个子查询。根据“了解 Linux 内核”一书......

  1. Linux 提供了一种绕过页面缓存的简单方法:直接 I/O 传输。在每个 I/O 直接传输中,内核对磁盘 Controller 进行编程,将数据直接从/向属于自缓存应用程序的用户模式地址空间的页面传输。

-- 所以要解释失败,需要检查应用程序是否具有自缓存功能?不确定如何做到这一点。

2.此外,该书说“当自缓存应用程序希望直接访问文件时,它会打开指定 O_DIRECT 标志的文件。在为 open() 系统调用提供服务时,dentry_open() 函数会检查 direct_IO方法是针对正在打开的文件的address_space对象实现的,反之则返回错误码”。

-- 除了这个还有其他可以解释直接 I/O 失败的原因吗?

3.这个命令“dd if=/dev/zero of=myfile bs=1M count=1 oflag=direct”在 linux 中会失败吗(假设有足够的可用磁盘空间)?

最佳答案

底层文件系统和 block 设备必须支持O_DIRECT 标志。此命令将失败,因为 tmpfs 不支持 O_DIRECT

dd if=/dev/zero of=/dev/shm/test bs=1M count=1 oflag=direct

写入大小必须是底层驱动程序 block 大小的倍数。此命令将失败,因为 123 不是 512 的乘积:

dd if=/dev/zero of=myfile bs=123 count=1 oflag=direct

关于linux - direct_io失败的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13115819/

相关文章:

linux - x86 架构的 Linux 内核中中断处理代码的位置

python - 如何让子进程运行 60 秒

c++ - 为什么与 pthread 链接会导致段错误?

java - Android 通过 OpenCsv 写入 CSV 文件

python - 快速将大量字符串列表转换为 ndarray

c# - NReco.VideoConverter.ConvertLiveMedia

c - C中通过设备树文件获取设备地址

linux - 今天可以学习(带有)kernel 2.6 的设备驱动程序吗

linux - Linux控制台中的模糊文件搜索

linux - QNX 7 中的 PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 错误