获取 M1 Mac 的真实架构,不管 Rosetta
Get real architecture of M1 Mac regardless of Rosetta
我需要检索 Mac 的真实架构,无论进程是否 运行 通过 Rosetta。
现在 Node.js、process.arch
returns x64
和 shell、uname -m
returns x86_64
.
感谢@Ouroborus,this note 介绍了如何判断您的应用是否已翻译。
如果翻译:
$ 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'
如@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 Registry 中。默认的 IOService
平面实时收集数据,而 IODeviceTree
平面在启动时存储,并在树中包含这些条目(命令行 ioreg -p IODeviceTree
或 ioreg -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。
我需要检索 Mac 的真实架构,无论进程是否 运行 通过 Rosetta。
现在 Node.js、process.arch
returns x64
和 shell、uname -m
returns x86_64
.
感谢@Ouroborus,this note 介绍了如何判断您的应用是否已翻译。
如果翻译:
$ 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'
如@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 Registry 中。默认的 IOService
平面实时收集数据,而 IODeviceTree
平面在启动时存储,并在树中包含这些条目(命令行 ioreg -p IODeviceTree
或 ioreg -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。