Версия ядра Linux - 4.15.0-47-generic
, а Размер блока - 4096
с помощью команды sudo /sbin/tune2fs -l /dev/sda1|grep "Block size"
.
Я только что написал демонстрацию DIRECT IO, код следующий:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#define BUF_SIZE 1024
int main(int argc, char * argv[])
{
int fd;
int ret;
unsigned char *buf;
ret = posix_memalign((void **)&buf, 512, BUF_SIZE);
if (ret) {
perror("posix_memalign failed");
exit(1);
}
memset(buf, 'c', BUF_SIZE);
fd = open("./direct_io.data", O_WRONLY | __O_DIRECT | O_CREAT, 0755);
if (fd < 0){
perror("open ./direct_io.data failed");
exit(1);
}
do {
ret = write(fd, buf, BUF_SIZE);
if (ret < 0) {
perror("write ./direct_io.data failed");
}
} while (0);
free(buf);
close(fd);
}
Мой вопрос:
Block Size
равен 4096, поэтому вышеприведенная демонстрация, в которой адрес buf
равен 512 выравниванию, а размер buf
кратен 512 байтам, может работать правильно. Я искал много информации, которая говорит, что адрес и размер буфера должны быть кратны Block Size
.