我正在开发一个JIT编译器,它会在内存中生成机器码。这个JIT主要针对64位POSIX x86系统,并且我担心代码中的跳转总是被编码为32位相对偏移量。我想做的是,mmap一块2-4GB的可执行内存区域用于机器码,并自己管理这块内存。
我具体想知道的是:在64位系统上,即使系统没有4GB的内存,我是否可以一次性mmap 4GB的内存?我假设大多数(或所有)操作系统不会真正分配我未写入的页面,所以如果我总是首先分配低地址,只要我不使用比系统物理内存更多的内存,我就没问题了。
我也很想听听其他关于如何管理机器码分配的建议,以便机器码始终驻留在64位机器上的同一4GB空间中。
我具体想知道的是:在64位系统上,即使系统没有4GB的内存,我是否可以一次性mmap 4GB的内存?我假设大多数(或所有)操作系统不会真正分配我未写入的页面,所以如果我总是首先分配低地址,只要我不使用比系统物理内存更多的内存,我就没问题了。
我也很想听听其他关于如何管理机器码分配的建议,以便机器码始终驻留在64位机器上的同一4GB空间中。
mmap
整个4GB区域,如果失败了,mmap
会让你选择首选映射位置。当然,如果两者都失败了,那么你可能需要报错。虽然我认为大多数现代操作系统都允许你映射整个4GB并延迟分配内存。 - tangrsmmap()
时传递MAP_NORESERVE
参数,以保持与内存交换空间较小的系统兼容。https://dev59.com/Xl7Va4cB1Zd3GeqPIUpk - Pascal Cuoq