检测处理器是否在32位OS下是64位

dop*_*ime 6 c++ 64-bit 32-bit x86-64

通常,x86-64架构提供与x86的兼容性.32位Windows(或其他操作系统)可以在x86-64处理器上运行.(如果我错了,请纠正我).

我想知道是否有可能(在C++中)32位Windows知道底层处理器是否为64位.例如,如果Windows 7 32位在Core i5上运行,我们应该能够知道处理器是64位(尽管Windows 7 32位正在运行).

您可能会质疑这样的要求:即使处理器是64位且OS是32位,64位进程也无法运行(如果我错了,请纠正我).但程序的目的是了解处理器,而不是操作系统. 这个问题可能与此类似,但它没有给出任何C++程序的暗示.

Ste*_*eve 6

这不是C++解决方案,但它似乎适用于C#.
但是应该很容易转换为C++,因为关键点在于API结构SYSTEM_INFO和API GetNativeSystemInfo()

首先是对获得信息的API的引用

[DllImport("kernel32.dll")]
public static extern void GetNativeSystemInfo
              ([MarshalAs(UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);
Run Code Online (Sandbox Code Playgroud)

然后是结构SYSTEM_INFO和_PROCESSOR_INFO_UNION

[StructLayout(LayoutKind.Sequential)]
public struct SYSTEM_INFO
{
    internal _PROCESSOR_INFO_UNION uProcessorInfo;
    public uint dwPageSize;
    public IntPtr lpMinimumApplicationAddress;
    public IntPtr lpMaximumApplicationAddress;
    public IntPtr dwActiveProcessorMask;
    public uint dwNumberOfProcessors;
    public uint dwProcessorType;
    public uint dwAllocationGranularity;
    public ushort dwProcessorLevel;
    public ushort dwProcessorRevision;
}

[StructLayout(LayoutKind.Explicit)]
public struct _PROCESSOR_INFO_UNION
{
    [FieldOffset(0)]
    internal uint dwOemId;
    [FieldOffset(0)]
    internal ushort wProcessorArchitecture;
    [FieldOffset(2)]
    internal ushort wReserved;
}
Run Code Online (Sandbox Code Playgroud)

现在是一个简化代码和调用本机API的方法的枚举

public enum ProcessorArchitecture
{
    Unknown = 0,
    Bit32 = 1,
    Bit64 = 2,
    Itanium64 = 3
}

static public ProcessorArchitecture ProcessorBits
{
    get
    {
        ProcessorArchitecture pbits = ProcessorArchitecture.Unknown;
        SYSTEM_INFO l_System_Info = new SYSTEM_INFO();
        GetNativeSystemInfo(ref l_System_Info);

        switch (l_System_Info.uProcessorInfo.wProcessorArchitecture)
        {
            case 9: // PROCESSOR_ARCHITECTURE_AMD64
                pbits = ProcessorArchitecture.Bit64;
                break;
            case 6: // PROCESSOR_ARCHITECTURE_IA64
                pbits = ProcessorArchitecture.Itanium64;
                break;
            case 0: // PROCESSOR_ARCHITECTURE_INTEL
                pbits = ProcessorArchitecture.Bit32;
                break;
            default: // PROCESSOR_ARCHITECTURE_UNKNOWN
                pbits = ProcessorArchitecture.Unknown;
                break;
        }
        return pbits;
    }
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*rny 5

好吧,据我所知,你只能通过查看CPU信息本身来实现这一点.我认为应该足够(对于x86和amd64)来检查CPU是否支持长模式.

为此,您可以使用cpuidx86上的指令.通过你的帖子的Windows-ness,我猜你正在使用Microsoft C++编译器.为此,有一个__cpuid内在的.遗憾的是,微软页面上的描述以PBEflag 结尾,而lm我的cpuinfo中的flag则会在三个标志之后.

纵观CPUID修改AMD处理器,你可以LMInfoType = 0x80000001,结果是在最后返回整数位29.在Intel处理器CPUID修改中,相同的位指定EM64T等效AFAIK的标志.

在这两种情况下,您应该InfoType = 0x80000000首先获得最大的有意义的InfoType价值.如果它小于0x80000001,那么你不应该进行上述检查,而是假设不支持长模式.