1

匿名のmmapでメモリを割り当てました:

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);

次に、O_DIRECT で開いた fd を使用して書き込みます。

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");
}

しかし、不正なアドレスエラーが発生します:

allocated buffer: 0x7f096ddff000, 512000
writing to address: 0x7f096ddff000 size: 512000
failed to write: Bad address

住所はいい感じです。

バッファを .data に割り当てて 512 に揃えると、書き込みが機能するので、open() と write() は問題なく、すべての権限を持っています。

どうしたの?512 アライメント以外に直接 IO の要件はありますか?

アップデート:

たとえば、次のように mmap を変更すると:

char buffer[ 1024000 ];
for(buff->addr = buffer; ((unsigned long)buff->addr % 512) != 0; buff->addr = buff->addr + 1);

できます:

allocated buffer: 0x500e00, 512000
writing to address: 0x500e00 size: 512000
4

1 に答える 1

3

PROT_NONEページにアクセスできない場合があります。

少なくともmmapの3.引数としてPROT_READを使用するべきではありませんか?この場合に役立つようにするには、おそらくPROT_READ|PROT_WRITEが必要です。

于 2010-08-23T18:42:45.290 に答える