使用 O_DIRECT 需要注意的地方
在之前的 open 使用标记里面, 我提到了 O_DIRECT
标志的使用, 使用 DMA 的方式,
数据不经过内核空间, 直接在用户空间和设备之间传输. 在文章的测试例子里面我放了一个
小错误, 在使用这个标志时读写文件时没有对相关的参数对齐.
实际上, 使用 O_DIRECT
打开的文件要求读写的 buffer
和 buffer_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); /* ... ... */ |