自定义 heap/memory 分配范围

Custom heap/memory allocation ranges

我正在用 C(使用 GCC)和 NASM 在 Linux 下编写一个 64 位应用程序。

有没有办法指定我希望我的堆和堆栈位于何处。具体来说,我希望我所有的 malloc 数据都在 0x00000000-0x7FFFFFFF 范围内的 anywhere。这可以在编译时、链接时或 运行 时通过 C 代码或其他方式完成。没关系。

如果这不可能,请解释原因。

P.S。对于那些感兴趣的人,我到底在做什么:

我正在处理的程序是用 C 语言编写的。在 运行 期间,它会生成 NASM 代码,对其进行编译并动态链接到已经 运行ning 的程序。这是极端优化所必需的,因为该代码将 运行 数千次,如果不是数十亿次,并且在编译时是未知的。所以我需要 0x00000000-0x7FFFFFFF 地址的原因是因为它们适合汇编代码中的立即数。如果我不需要单独加载地址,我可以将所需的内存访问次数减半并增加局部性。

对于Linux,获取任何虚拟地址范围的标准方法是使用mmap(2)函数。

您可以指定起始虚拟地址和大小。如果该地址尚未被使用并且未被先前调用(或内核)保留,您将可以访问该虚拟地址。

可以通过将 return 值与您传递的起始地址进行比较来检查此调用是否成功。如果调用失败,函数returns NULL.

一般来说mmap用于将虚拟地址映射到文件描述符。但是这种映射必须通过 RAM 上的物理页面进行。由于应用程序无法直接访问磁盘。

因为您不需要任何文件备份,您可以在 mmap 调用中使用 MAP_ANONYMOUS 标志(也可以将 -1 作为 fd 传递)。

这是手册页相关部分的摘录 -

MAP_ANONYMOUS

The mapping is not backed by any file; its contents are initialized to zero. The fd argument is ignored; however, some implementations require fd to be -1 if MAP_ANONYMOUS (or MAP_ANON) is specified, and portable applications should ensure this. The offset argument should be zero. The use of MAP_ANONYMOUS in conjunction with MAP_SHARED is supported on Linux only since kernel 2.4.