我编写了几个程序,发现当以 64 位编译时,内存映射段(例如共享对象和共享内存所在的位置)总是位于 7f9aca84a000-7fff88400000 附近的某个位置,但从不完全相同。
我想知道在 x86_64 架构(ELF64)上这个内存段是否有固定的起始地址,或者这个段的最大和最小范围是多少?
这就是我问这个问题的原因。我们正在将系统从 Tru64 UNIX 迁移到 Linux。该系统使用IPC Sys V共享内存的复杂固定内存映射,并使用链表在该段内从结构到另一个结构。由于这段代码的大小和复杂性,以及我们手头有限的时间,我们正试图找到一种可靠的方法来修复共享内存的开始(有效地使用带有指定地址的 shmat 来附加段)。使用 64 位,虚拟地址空间是如此巨大(48 位有效可能的地址),以至于选择“安全”固定地址比 32 位更容易且风险更小。