如何在ARM64中获取CPU品牌信息?

ecr0jaav  于 2023-08-03  发布在  其他
关注(0)|答案(4)|浏览(210)

在Windows X86中,CPU品牌可以通过cpuid内在函数查询。下面是代码的示例:

#include <stdio.h>
#include <intrin.h>

int main(void)
{
    int cpubrand[4 * 3];

    __cpuid(&cpubrand[0], 0x80000002);
    __cpuid(&cpubrand[4], 0x80000003);
    __cpuid(&cpubrand[8], 0x80000004);

    char str[48];
    memset(str, 0, sizeof str);
    memcpy(str, cpubrand, sizeof cpubrand);
    printf("%s\n", str);
}

字符串
在Windows ARM64中有什么替代方案?

pgpifvop

pgpifvop1#

获取此信息的直接方法是读取 * 主ID寄存器 * MIDR_EL1。这可以通过mrs指令(内联)汇编或_ReadStatusReg指令来完成。
遗憾的是,无法从用户模式(即EL0),每次尝试都会抛出异常。在Linux上,这种行为被模拟,因此MIDR_EL1仍然可以被访问。但是,我不知道也没有机会测试Windows是否也提供此功能。
参考文献:

h6my8fg2

h6my8fg22#

虽然可能 * 不是 * 你正在寻找的答案(即。直接询问CPU),您可以使用以下代码从Windows注册表中获取“ProcessorNameString”值:

#define BUFSIZ 64 // For easy adjustment of limits, if required

char answer[BUFSIZ] = "Error Reading CPU Name from Registry!", inBuffer[BUFSIZ] = "";
const char *csName = "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0";
HKEY hKey;  DWORD gotType, gotSize = BUFSIZ;
if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, csName, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
    if (!RegQueryValueExA(hKey, "ProcessorNameString", nullptr, &gotType, (PBYTE)(inBuffer), &gotSize)) {
        if ((gotType == REG_SZ) && strlen(inBuffer)) strcpy(answer, inBuffer);
    }
    RegCloseKey(hKey);
}

字符串
这将(或 * 应该 *)给予你Windows系统看到的处理器的“名称”!我无法访问ARM64系统,因此无法正确测试它,但在我的x64系统上,我得到以下(正确)字符串:Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz(这是通过使用__cpuid()调用获取“Brand String”返回的 * 确切 *)。
然而,像你一样,我很想知道一种直接做到这一点的方法-即,Windows O/S如何在ARM64系统上获得此信息?

zzzyeukh

zzzyeukh3#

也不是直接从CPU获取名称的方法,但可以从WMI Win32_Processor class获取处理器名称
它可以通过在cmd中运行wmic cpu get name或在PowerShell中运行(Get-WmiObject Win32_Processor).Name来获得。Getting it from C#也很简单,类似于

ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT Name FROM Win32_Processor")
foreach (ManagementObject mo in mos.Get())
{
    Console.WriteLine(mo["Name"]);
}

字符串
但是doing that from C要复杂得多。幸运的是,在this answer中已经有一个类似的例子。主要部分应该是这样的

BSTR query    = SysAllocString(L"SELECT Name FROM Win32_Processor");
hr = services->lpVtbl->ExecQuery(services, language, query, WBEM_FLAG_BIDIRECTIONAL, NULL, &results);
...
hr = result->lpVtbl->Get(result, L"Name", 0, &name, 0, 0);
SysFreeString(query);

vmdwslir

vmdwslir4#

另一种解决方案是使用cpuinfo,这是一个跨平台的CPU信息库,也可以使用supports ARM64

cpuinfo_initialize();
printf("Running on %s CPU\n", cpuinfo_get_package(0)->name);

字符串
它似乎也像Windows任务管理器一样从注册表项HARDWARE\DESCRIPTION\System\CentralProcessor\0获取CPU名称

相关问题