#+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);
/* ... ... */