mmap一次性分配所有内存吗?

3
我正在开发一个JIT编译器,它会在内存中生成机器码。这个JIT主要针对64位POSIX x86系统,并且我担心代码中的跳转总是被编码为32位相对偏移量。我想做的是,mmap一块2-4GB的可执行内存区域用于机器码,并自己管理这块内存。
我具体想知道的是:在64位系统上,即使系统没有4GB的内存,我是否可以一次性mmap 4GB的内存?我假设大多数(或所有)操作系统不会真正分配我未写入的页面,所以如果我总是首先分配低地址,只要我不使用比系统物理内存更多的内存,我就没问题了。
我也很想听听其他关于如何管理机器码分配的建议,以便机器码始终驻留在64位机器上的同一4GB空间中。

1
我所知道的每个现代操作系统都不会一次性分配所有内存,而是在需要时惰性分配内存。尽管如此,我没有任何正式的参考来支持这一点... - templatetypedef
你可以尝试mmap整个4GB区域,如果失败了,mmap会让你选择首选映射位置。当然,如果两者都失败了,那么你可能需要报错。虽然我认为大多数现代操作系统都允许你映射整个4GB并延迟分配内存。 - tangrs
你可能想要在调用mmap()时传递MAP_NORESERVE参数,以保持与内存交换空间较小的系统兼容。https://dev59.com/Xl7Va4cB1Zd3GeqPIUpk - Pascal Cuoq
1个回答

1
你的 4GB 的 mmap 可能会成功分配虚拟内存,并且物理页面将在程序修改它们时被分配。如果你的物理内存耗尽,你的进程可能会被终止。另请参阅 this question

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接