首页 > Linux > 使用 O_DIRECT 需要注意的地方

使用 O_DIRECT 需要注意的地方

在之前的 open 使用标记里面, 我提到了 O_DIRECT 标志的使用, 使用 DMA 的方式,
数据不经过内核空间, 直接在用户空间和设备之间传输. 在文章的测试例子里面我放了一个
小错误, 在使用这个标志时读写文件时没有对相关的参数对齐.

实际上, 使用 O_DIRECT 打开的文件要求读写的 bufferbuffer_size 和读写偏移
都要做 I/O 对齐, 对齐的单位为 logical_block_size, 是存储设备能寻址的最小存储
单元, 可以用过下列指令查看该值:

# cat /sys/block/sda/queue/logical_block_size 
512

buffer_size 和偏移的对其都比较好处理, 但是 buffer 地址的对其不太方便, 不过
glibc 提供了 posix_memalign() 函数, 可以返回一个对齐后的 buffer.

下面是使用的小例子:

unsigned char buf[512] = "1234567890";
void *align_buf = NULL;
 
/* 假设 /sys/block/sda/queue/logical_block_size 为 512B */
if (posix_memalign(&align_buf, 512, sizeof(buf)) != 0) {
    perror("memalign failed");
    return;
}
int len = pwrite(fd, align_buf, sizeof(buf), offset);
/* ... ... */

分类: Linux 标签:
  1. 本文目前尚无任何评论.
  1. 2015年11月30日07:07 | #1