获取 M1 Mac 的真实架构,而不受 Rosetta 影响。

11

我需要获取 Mac 的实际架构,无论该进程是否通过 Rosetta 运行。

现在在 Node.js 中,process.arch 返回 x64,在 shell 中,uname -m 返回 x86_64


我的使用情况是通过自动更新来发布应用程序的ARM版本。还要跟踪谁在运行模拟软件,并将其与性能或其他问题联系起来。 - Elmo
应该可以检测到 Rosetta 2 的存在并假定为 arm。 - Elmo
1
这里有一篇关于如何进行此操作的说明。虽然我怀疑是否已经有一个Nodejs模块编写了这个功能。 - Ouroborus
谢谢!你知道在shell脚本中有没有办法做同样的事情吗?(如果你的终端应用程序正在x86上运行,uname -m将不会返回arm) - Elmo
编写一个可执行文件来进行实际检查。在脚本中,尝试执行二进制文件并检查其结果以及是否无法实际执行。 - Ouroborus
这对于尝试让跨架构 Vagrant 镜像工作非常有用:https://github.com/hashicorp/vagrant/issues/12610 - oligofren
2个回答

15

感谢@Ouroborus,这个说明描述了如何确定您的应用程序是否已翻译。

如果已翻译:

$ sysctl sysctl.proc_translated
sysctl.proc_translated: 1

如果不是:

$ sysctl sysctl.proc_translated
sysctl.proc_translated: 0

在非ARM架构的Mac电脑上:

$ sysctl sysctl.proc_translated
sysctl: unknown oid 'sysctl.proc_translated'

1
为了方便脚本编写,您也可以使用 sysctl -n sysctl.proc_translated-n 将使 sysctl 仅打印该值。 - Zach Bloomquist
1
如果您想忽略未知的oid值,可以运行sysctl -in sysctl.proc_translated。这将仅打印该值而不显示错误消息。 - John Yeary

2
如@Elmo的答案所示,命令行sysctl -n sysctl.proc_translated或本机等效的sysctlbyname()调用将指示您是否在Rosetta下运行。
另外两个sysctl值是相关的。 在没有Rosetta的M1硬件上,返回这些值:
hw.cputype: 16777228
hw.cpufamily: 458787763

"hw.cputype" 是 "0x0100000C" (CPU_TYPE_ARM64),"hw.cpufamily" 是 "0x1b588bb3" (CPUFAMILY_ARM_FIRESTORM_ICESTORM)。
然而,在 Rosetta 下执行时,采集 CPUID 的底层机器码优先,并通过 "sysctlbyname()" 和命令行返回以下两个值:
hw.cputype: 7
hw.cpufamily: 1463508716

这些对应于0x7(CPU_TYPE_X86)和0x573b5eec(INTEL_WESTMERE)。
看起来Rosetta在Rosetta下报告了一个兼容x86的Westmere芯片,但这个选择似乎在我所见过的所有地方都是一致的。这个“虚拟架构”可能对某些程序有用的信息。
在IO注册表中还有另一个可能性。虽然默认的IOService平面实时收集数据,但IODeviceTree平面在启动时存储,并将这些条目包含在树中(命令行ioreg -p IODeviceTreeioreg -c IOPlatformDevice)。
cpu0@0  <class IOPlatformDevice, id 0x10000010f, registered, matched, active, busy 0 (180 ms), retain 8>
    | | | {
...
    | | |   "compatible" = <"apple,icestorm","ARM,v8">

(针对CPU 0-3) 和
cpu4@100  <class IOPlatformDevice, id 0x100000113, registered, matched, active, busy 0 (186 ms), retain 8>
    | | | {
...
    | | |   "compatible" = <"apple,firestorm","ARM,v8">

(适用于CPU 4-7)
这明显指的是ARMv8 Firestorm + Icestorm M1芯片。
相同的方法也适用于M1 Pro和M1 Max。

我该如何获取GPU核心数量? - tcapelle
@tcapelle 你应该提出一个新问题来问。 - Daniel Widdis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接