使用 `O_DIRECT` 需要注意的地方

#+SETUPFILE: ~/Dropbox/Doc/Org_Templates/level-1.org

在之前的 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);
/* ... ... */

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦