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

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

在这种情况下,在ppc64下,预期结果是errnoENOMEM
但在ppc64下的实际结果是errnoInvalid argument
不管怎样,它在x86_64 arch上运行良好。
我想也许PPC64没有分配足够的内存。所以,我试图修改HIGH_ADDR的定义:
#define HIGH_ADDR (void *)(0x7FFFFFFFFFF)
但它仍然会Invalid argument
我只想知道,Linux for PPC64是如何管理他的内存的。我是说,我想知道用户空间程序的内存地理位置。或者我应该使用的最大地址是多少。

最佳答案

man 2 mmap
我们不喜欢地址、长度或偏移量(例如,它们太大,
或者不在页面边界上对齐)。
eInval(从Linux2.6.12开始)长度为0。
einval标志既不包含map_private,也不包含map_shared,或包含
这两个值。
因此,如果mmap太大,则EINVAL将用addr发出错误信号。因此,这是预期的行为。
建议:不要使用MAP_FIXED,除非你有很好的理由。
脚注:并非所有64位体系结构都支持64位地址。

08-27 19:59