О выравнивании памяти с Direct IO - PullRequest
0 голосов
/ 16 апреля 2019

Версия ядра 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.

...