2010-08-23 6 views
1

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 
+0

Est-ce que 'write()' renvoie une valeur non nulle? –

+0

essayez-vous d'écrire sur un matériel/un périphérique? Est-ce ce que vous voulez dire par IO direct? – Longfield

+0

L'écriture est supposée renvoyer une valeur non nulle, oui. Ici, il renvoie une erreur –

Répondre

3

PROT_NONE Pages may not be accessed.

vous atleast pas Si PROT_READ comme 3 argument à mmap? Et pour être utile dans ce cas, vous avez probablement besoin de PROT_READ | PROT_WRITE

+0

J'ai mal lu l'homme. Merci beaucoup –

Questions connexes