0

我看了一个 linux 的测试用例。它测试mmap如下:

#define HIGH_ADDR       (void *)(0x1000000000000)
addr = mmap(HIGH_ADDR, map_sz, PROT_READ,
                MAP_SHARED | MAP_FIXED, fildes, 0);

PPC64下的这种情况下,预期结果是得到一个 errno ENOMEM
但是PPC64下的实际结果是得到一个 errno 。 无论如何,它在X86_64 arch上运行良好。我想也许 PPC64 没有分配足够的内存。因此,我尝试将's 定义修改为: 但它仍然得到. 我只是想知道,PPC64 的 linux 如何管理他的内存。我的意思是,我想知道用户空间程序的内存地理。或者我应该使用什么 MAX 地址。Invalid argument
HIGH_ADDR
#define HIGH_ADDR (void *)(0x7FFFFFFFFFF)
Invalid argument

4

2 回答 2

2

来自man 2 mmap

       EINVAL 我们不喜欢 addr、length 或 offset(例如,它们太大,
              或未在页面边界上对齐)。

       EINVAL(自 Linux 2.6.12 起)长度为 0。

       EINVAL 标志既不包含 MAP_PRIVATE 或 MAP_SHARED,也不包含
              这两个值。

因此,如果太大mmap,则会发出错误信号。因此,这是预期的行为。EINVALaddr

建议:不要使用MAP_FIXED,除非你有很好的理由。

脚注:并非所有 64 位架构都支持 64 位地址。

于 2012-08-28T05:47:25.670 回答
2

像这样使用MAP_FIXED是无效的。即使它有效,它也可能会映射到您不想破坏的东西之上,例如加载的共享库或动态链接器。唯一安全的使用方法MAP_FIXED是映射已经分配给程序的地址范围的顶部(例如,通过事先调用mmapwithout MAP_FIXED)。

于 2012-08-28T05:51:58.780 回答