当针对相同架构(即 x86_64)时,我们可以对不同系统上的 SYSTEM_INFO dwPageSize 做出任何假设吗?
我生成一些自定义本机代码,这些代码通过 VirtualAlloc 与 C++ 应用程序一起加载。该代码有 3 个不同的部分(代码、cdata、动态静态变量),它们都需要通过 VirtualProtect 进行不同的保护(执行;读取;读写),因此需要位于不同的页面中。代码通过 RIP 相对寻址引用 cdata 和静态变量。
我想知道我是否可以假设,如果在 x64 上构建时,dwPageSize 为 4096,那么它在其他 x64 系统上也将具有相同的值(或者至少更小,但永远不会更大)?如果是这样,我可以按原样获取 RIP 相对地址,因为我可以确保所有数据都放置在相同的页面大小相对偏移处。如果目标系统上的页面可能更大,我需要在加载代码时修复这些偏移量。
页面大小通常由处理器架构本身决定,尽管有时处理器架构可能支持多种页面大小。尽管如此,Microsoft 决定为每个体系结构指定一个特定的页面大小,因此确实可以安全地假设,无论代码在哪台计算机上运行,给定体系结构(以及 Windows 的位数)的页面大小都是相同的。
顺便说一句,在当前支持的所有体系结构中,页面大小均为 4KB。(一些已停产的架构使用 8KB。)请参阅此处查看完整列表。
特别是对于 x86-64,您可以确定它不会改变,因为处理器除了 4KB(对于小页面)之外不提供任何其他选择。理论上,微软可能会在某些架构(如 ARM)中更改它,但这对我来说是非常出乎意料的,因为它会导致大量兼容性问题,而且没有明显的优势。