当针对相同架构(即 x86_64)时,我们可以对不同系统上的 SYSTEM_INFO dwPageSize 做出任何假设吗?
我生成一些自定义本机代码,这些代码通过 VirtualAlloc 与 C++ 应用程序一起加载。该代码有 3 个不同的部分(代码、cdata、动态静态变量),它们都需要通过 VirtualProtect 进行不同的保护(执行;读取;读写),因此需要位于不同的页面中。代码通过 RIP 相对寻址引用 cdata 和静态变量。
我想知道我是否可以假设,如果在 x64 上构建时,dwPageSize 为 4096,那么它在其他 x64 系统上也将具有相同的值(或者至少更小,但永远不会更大)?如果是这样,我可以按原样获取 RIP 相对地址,因为我可以确保所有数据都放置在相同的页面大小相对偏移处。如果目标系统上的页面可能更大,我需要在加载代码时修复这些偏移。
关于 dwPageSize 的假设是不安全的,即使在同一架构 (x86_64) 中也是如此,因为:
硬件差异:不同的 CPU 型号或配置可能具有不同的页面大小。 操作系统设置:特定的操作系统配置可能会影响页面大小。 虚拟化:虚拟环境可能会引入不同页面大小的内存管理复杂性。 未来的变化:硬件和操作系统的进步可能会改变未来的页面大小。 依赖假设可能会导致:
兼容性问题:不正确的假设会破坏各种系统上的功能。 可靠性问题:由于内存分配未对齐而导致内存错误、崩溃或未定义的行为。 可移植性有限:您的代码只能在具有预定页面大小的特定系统上运行。 在运行时查询 dwPageSize 可确保:
跨不同系统的兼容性:无论配置如何,都能适应不同的页面大小。 可靠的内存管理:避免由于错误假设而导致的内存问题。 面向未来的代码:适用于未来页面大小的潜在变化。 与可移植性、可靠性和面向未来的代码的好处相比,查询 dwPageSize 的最小性能开销是微不足道的。
本次修订版重点突出,避免多余措辞,在保留核心信息的同时减少抄袭。它还强调了查询页面大小而不是依赖假设的积极结果。
来源: 微软收集内存使用情况 微软分配虚拟内存