我使用C代码写入磁盘.
首先我尝试使用malloc,发现写入不起作用(写入返回-1):
fd = open('/dev/sdb', O_DIRECT | O_SYNC | O_RDWR);
void *buff = malloc(512);
lseek(fd, 0, SEEK_SET);
write(fd, buff, 512);
Run Code Online (Sandbox Code Playgroud)
然后我改变了第二行,它有效:
void *buff;
posix_memalign(&buff,512,512);
Run Code Online (Sandbox Code Playgroud)
但是,当我将lseek偏移量更改为1:时lseek(fd, 1, SEEK_SET);,写入不再起作用.
首先,为什么没有malloc工作?
然后,我知道在我的情况下,posix_memalign保证内存对齐的起始地址必须是512的倍数.但是,内存对齐和写入不应该是一个单独的进程吗?那么为什么我不能写任何我想要的偏移?
从Linux手册页中打开(2):
O_DIRECT标志可能会对用户空间缓冲区的长度和地址以及I/O的文件偏移量施加对齐限制.
和:
在Linux 2.4下,传输大小,用户缓冲区和文件偏移的对齐必须都是文件系统逻辑块大小的倍数.在Linux 2.6下,对齐到512字节边界就足够了.
O_DIRECT的意思是"尝试最小化I/O与此文件的缓存效果",如果我理解正确,则意味着内核应该直接从用户空间缓冲区复制,因此可能需要更严格的对齐的数据.