linux - 直接 IO 的 mmap : bad address?

标签 linux io mmap

我使用匿名 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

最佳答案

PROT_NONE Pages may not be accessed.

你至少不应该将 PROT_READ 作为 mmap 的 3. 参数吗?为了在这种情况下有用,您可能需要 PROT_READ|PROT_WRITE

关于linux - 直接 IO 的 mmap : bad address?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3550531/

相关文章:

Python hashlib Checksum 与 linux md5sum 不同

python - 有人可以在 python (scipy.io) 中解释 mdict,例如在 scipy.io.savemat() 中吗?

共享内存中的 C 结构成员指针 (mmap)

c - 从 mmaped 结构数组中删除结构

c - 将 -static 与 GCC 一起使用可以保证我的 C 程序可以跨 x86 发行版运行吗?

linux - 在 lighttpd 中正确设置 ssl 但是当我重新启动它时,https 会超时吗?

c - 指针问题

java - 无法读取本地资源

io - Z80 上未记录的 16 位 I/O 寻址

java - 随机访问中的 FileChannel 与 MappedByteBuffer?