6

通常、x86-64アーキテクチャはx86との互換性を提供します。32ビットWindows(または他のOS)は、x86-64プロセッサで実行できます。(私が間違っている場合は私を訂正してください)。

32ビットWindowsが、基盤となるプロセッサが64ビットであるかどうかを(C ++で)知ることができるかどうかを知りたいです。たとえば、Corei5で実行されているWindows7 32ビットの場合、プロセッサが64ビットであることを認識できるはずです(ただし、Windows 7 32ビットは実行されています)。

プロセッサが64ビットでOSが32ビットであっても、64ビットプロセスを実行できないという要件に疑問を呈するかもしれません(間違っている場合は訂正してください)。しかし、プログラムの目的は、OSではなくプロセッサを知ることです。 この質問はこれに似ているように見えるかもしれませんが、C++プログラムのヒントを与えるものではありません。

4

2 に答える 2

6

これはC++ソリューションではありませんが、C#で機能するようです。ただし、重要なポイントはAPI構造SYSTEM_INFOとAPI GetNativeSystemInfo()
にあるため、C++に簡単に変換する必要があります。

まず、情報を取得する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;
    }
}
于 2012-08-31T09:48:18.363 に答える
5

ええと、私が知る限り、これはCPU情報自体を見ることによってのみ得ることができます。CPUがロングモードをサポートしているかどうかを確認するには(x86とamd64の場合)十分なはずだと思います。

cpuidそのためには、 x86の命令を使用できます。あなたの投稿のWindowsらしさから、あなたがMicrosoftC++コンパイラを使用していると推測します。そのために、__cpuid固有のがあります。PBE悲しいことに、Microsoftのページの説明はflagで終わりますがlm、私のcpuinfoのflagは3フラグ後になります。

AMDプロセッサのCPUIDの変更を見るLMと、で取得できInfoType = 0x80000001、最後に返された整数のビット29になります。IntelプロセッサのCPUID変更では、同じビットEM64TがAFAIKと同等のフラグを指定します。

どちらの場合も、InfoType = 0x80000000意味のある最大InfoType値を取得するには、最初に実行する必要があります。未満の場合0x80000001は、上記のチェックを行わず、代わりにロングモードがサポートされていないと想定してください。

于 2012-08-31T09:46:17.123 に答える