无论罗塞塔如何,都可以获得M1 Mac的真实架构



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

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

感谢@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'

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

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

hw.cputype: 16777228
hw.cpufamily: 458787763

hw.cputype0x0100000C(CPU_TYPE_ARM64(并且hw.cpufamily0x1b588bb3(CPUAMILY_ARM_FIRESTORM_ICESTORM(。

然而,当在Rosetta下执行时,收集CPUID的低级机器代码优先,并通过sysctlbyname()和命令行返回以下两个值:

hw.cputype: 7
hw.cpufamily: 1463508716

它们对应于0x7(CPU_TYPE_X86(和0x573b5eec(INTEL_WESTMERE(。

罗塞塔似乎报告了罗塞塔旗下的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

相关内容

  • 没有找到相关文章

最新更新