通常,x86-64架构提供与x86的兼容性。 32位Windows(或其他操作系统)可以在x86-64处理器上运行。 (如果我错了,请纠正我。)
我想知道是否有可能(在C ++中)32位Windows知道底层处理器是否为64位。例如,如果Windows 7 32位在Core i5上运行,我们应该能够知道处理器是64位的(尽管Windows 7 32位正在运行)。
您可能会质疑这样的要求,即使处理器是64位且OS是32位,64位进程也无法运行(如果我错了,请纠正我)。但程序的目的是了解处理器,而不是操作系统。 This question可能看起来与此类似,但它没有给出任何C ++程序的提示。
答案 0 :(得分: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);
然后是结构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;
}
现在是一个简化代码和调用本机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;
}
}
答案 1 :(得分:5)
嗯,据我所知,你只能通过查看CPU信息本身来实现这一点。我认为应该足够(对于x86和amd64)检查CPU是否支持long mode。
为此,您可以在x86上使用cpuid
指令。通过你的帖子的Windows-ness,我猜你正在使用Microsoft C ++编译器。为此,有一个__cpuid
intrinsic。遗憾的是,Microsoft页面上的描述以PBE
标志结束,而我的cpuinfo中的lm
标志稍后会出现三个标志。
查看CPUID Modifications for AMD Processors,您可以LM
获取InfoType = 0x80000001
,结果位于最后返回的整数的第29位。在CPUID Modifications for Intel Processors中,相同的位指定EM64T
标志,该标志等同于AFAIK。
在这两种情况下,您应首先执行InfoType = 0x80000000
以获得最大有意义的InfoType
值。如果它小于0x80000001
,那么你不应该进行上述检查,而是假设不支持长模式。