Memory management mmap是否一次分配所有内存?

Memory management mmap是否一次分配所有内存?,memory-management,operating-system,posix,mmap,Memory Management,Operating System,Posix,Mmap,我正在开发一个JIT编译器,它将在内存中生成机器代码。此JIT主要针对64位POSIX x86系统,我担心代码中的跳转总是可以编码为32位相对偏移量。我想做的是为机器代码映射一个2-4GB的可执行内存块,并自己管理这个内存区域 我特别想知道的是:在64位系统上,即使系统没有4GB内存,一次mmap 4GB内存是否安全?我假设大多数(或所有)操作系统不会真正分配我没有写入的页面,因此如果我总是先分配较低的地址,我就可以了,只要我实际使用的内存不超过系统实际拥有的内存 我还想听听关于如何管理机器代码

我正在开发一个JIT编译器,它将在内存中生成机器代码。此JIT主要针对64位POSIX x86系统,我担心代码中的跳转总是可以编码为32位相对偏移量。我想做的是为机器代码映射一个2-4GB的可执行内存块,并自己管理这个内存区域

我特别想知道的是:在64位系统上,即使系统没有4GB内存,一次mmap 4GB内存是否安全?我假设大多数(或所有)操作系统不会真正分配我没有写入的页面,因此如果我总是先分配较低的地址,我就可以了,只要我实际使用的内存不超过系统实际拥有的内存


我还想听听关于如何管理机器代码分配的其他建议,以便机器代码始终位于64位机器上相同的4GB空间。

您的4GB的
mmap
可能成功分配虚拟内存,物理页面将在“脏”时分配,或由您的程序修改。如果物理内存不足,进程可能会终止。另请参见。

我所知道的每个现代操作系统都不会一次性分配所有这些,而是会根据需要惰性地分配内存。也就是说,我没有任何正式支持这一点的参考资料……您可以尝试
mmap
整个4GB区域,如果失败,
mmap
允许您选择您希望创建映射的位置。当然,如果两者都失败了,那么你可能就要出错了。尽管如此,我认为大多数现代操作系统都会让你映射整个4GB,并懒散地分配内存。你可能希望将
map\u NORESERVE
传递到
mmap()
以保持与交换空间很少的系统兼容。