2012-10-29 37 views
1

我想知道在什么情况下直接I/O传输将会失败?direct_io故障的原因

我对此有三个子查询。按照“了解Linux内核”一书。

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

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

2.此外,该书说:“当自缓存应用程序希望直接访问文件时,它会打开指定O_DIRECT标志的文件。在服务open()系统调用时,dentry_open()函数检查对正在打开的文件的address_space对象实施direct_IO方法,并在相反的情况下返回错误代码“。

- 除了这个可以解释直接I/O故障的任何其他原因?

3.Will此命令 “DD如果= MYFILE BS = 1M的=的/ dev /零计数= 1周的oflag =直接” 任何故障在linux(假设可用的足够的磁盘空间)?

回答

0

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

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

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

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