如何在Windows上检测X32?

时间:2015-09-20 02:56:32

标签: windows c-preprocessor 32bit-64bit abi linux-x32-abi

X32允许用户使用在x86_64处理器上运行的32位整数,长整数和指针来编写程序。在某些使用案例中,使用X32有许多好处。 (X32与X86或X64不同;有关详细信息,请参阅Difference between x86, x32, and x64 architectures。)

某些Windows Enterprise Server似乎支持X32,但我无法找到有关它的更多信息。这是基于一些英特尔PDF,如Intel® Xeon® Processor E5-2400 Series-based Platforms for Intelligent Systems

Intel® Xeon® Processor E5-2400 Series-based Platforms for Intelligent Systems OS support

Microsoft Predefined Macros上的文档列出了常见的嫌疑人,例如_M_X64_M_AMD64。但它似乎没有讨论X32的架构选项。

如果Microsoft支持X32,那么我怀疑它将是一个类似于大地址空间感知或终端服务感知的选项。

Microsoft 实际是否支持X32(而不是X86和X64)?

  • 如果是这样,我如何确定何时在Windows下选择X32?
  • 如果没有,那么为什么英特尔专门为Windows推出X32平台?

4 个答案:

答案 0 :(得分:1)

  

Microsoft是否真的支持X32(而不是X86和X64)?

没有。

答案 1 :(得分:1)

Windows没有x32 ABI。但是,它具有仅在2GB的低地址空间中为您提供内存的功能。只需禁用/LARGEADDRESSAWARE标志(默认情况下,它已为64位二进制文​​件启用),然后就可以在64位应用程序中使用32位指针了。

这些二进制文件中的用户空间指针的最高位将被清零,因此它基本上与Linux上的x32 ABI相似。 Windows中的long一直是32位类型,因此它与x long和指针为32位宽的x32 ABI中的相同。

  

默认情况下,基于Microsoft Windows的64位应用程序具有几TB的用户模式地址空间。有关精确值,请参阅Windows和Windows Server版本的内存限制。但是,应用程序可以指定系统应为应用程序分配所有小于2 GB的内存。如果满足以下条件,则此功能对64位应用程序很有用:

     
      
  • 2 GB的地址空间就足够了。
  •   
  • 该代码有许多指针截断警告。
  •   
  • 指针和整数可以自由混合。
  •   
  • 该代码具有使用32位数据类型的多态性。
  •   
     

所有指针仍然是64位指针,但是系统确保每个内存分配均发生在2 GB的限制以下,因此,如果应用程序将指针截断,则不会丢失任何重要数据。 可以将指针截断为32位值,然后通过符号扩展或零扩展将其扩展为64位值。

     

Virtual Address Space

但是如今,即使在Linux kernel developers are discussing to drop x32 Support

答案 2 :(得分:0)

对于迟到的答案(以及对大卫的不公正)感到抱歉。

我正在ml64.exeMASM for x64 (ml64.exe)阅读,我在汇编程序中遇到了 32位地址模式 。它提供X32地址大小覆盖。

因此,Windows工具确实提供了与X32相关的支持。它还解释了英特尔如何生产X32二进制文件和驱动程序。我只是猜测,但我怀疑英特尔可能正在使用自定义分配器或VirtualAlloc来确保指针地址在一定范围内。

Windows操作系统似乎没有自定义构建的内核,比如Debian 8,它提供了操作系统的基础。也就是说,由开发人员来确保整数,长整数和指针也在32位范围内。

答案 3 :(得分:0)

phuclv关于在给定进程中禁用/ LARGEADDRESSAWARE的答案的小脚注:在某些情况下,当数据结构有利时,如果有人采取必要的措施以在64位模式下实际使用32位指针,则可能Windows上的性能提升(与Linux上一样),尽管幅度不大。参见:Benchmark of 32-bit pointers in 64-bit code on Windows