2

无论进程是否通过 Rosetta 运行,我都需要检索 Mac 的真实架构。

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

4

2 回答 2

6

感谢@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'
于 2020-12-17T20:28:28.423 回答
1

正如@Elmo 的回答所表明的那样,命令行sysctl -n sysctl.proc_translated或本机等效sysctlbyname()调用将指示您是否在 Rosetta 下运行。

另外两个sysctl值是相关的。在没有 Rosetta 的 M1 硬件上,将返回以下值:

hw.cputype: 16777228
hw.cpufamily: 458787763

hw.cputype0x0100000C(CPU_TYPE_ARM64) 并且hw.cpufamily0x1b588bb3(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 Registry 中。虽然默认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。

于 2021-01-18T17:45:24.647 回答