J'alloué un peu de mémoire avec mmap anonyme:mmap pour les E/S directes: adresse incorrecte?
buff->addr = mmap(NULL, length, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS -1, 0);
fprintf(stderr, "allocated buffer: %p, %lu\n", buff->addr, (unsigned long)length);
alors je suis écrit à l'aide fd ouvert avec O_DIRECT:
int fd = open(name, O_CREAT | O_TRUNC | O_WRONLY | O_DIRECT, 00300);
if(fd == -1)
{
perror("failed to open for write");
return;
}
fprintf(stderr, "writing to address: %p size: %lu\n", buff.addr, buff.length);
if(write(fd, buff.addr, buff.length) != size)
{
perror("failed to write");
}
mais je reçois une mauvaise erreur d'adresse:
allocated buffer: 0x7f096ddff000, 512000
writing to address: 0x7f096ddff000 size: 512000
failed to write: Bad address
L'adresse me semble bonne.
Si je le tampon à allouer .data et aligner à 512, les travaux d'écriture, de sorte que le open() et write() sont ok, j'ai toutes les autorisations, etc.
Qu'est-ce qui ne va pas? Existe-t-il d'autres exigences pour l'alignement direct des entrées-sorties que l'alignement 512?
MISE À JOUR:
par exemple, si je change mmap pour cela:
char buffer[ 1024000 ];
for(buff->addr = buffer; ((unsigned long)buff->addr % 512) != 0; buff->addr = buff->addr + 1);
cela fonctionne:
allocated buffer: 0x500e00, 512000
writing to address: 0x500e00 size: 512000
Est-ce que 'write()' renvoie une valeur non nulle? –
essayez-vous d'écrire sur un matériel/un périphérique? Est-ce ce que vous voulez dire par IO direct? – Longfield
L'écriture est supposée renvoyer une valeur non nulle, oui. Ici, il renvoie une erreur –