为了账号安全,请及时绑定邮箱和手机立即绑定

无论 Rosetta 如何,获取 M1 Mac 的真实架构

无论 Rosetta 如何,获取 M1 Mac 的真实架构

牧羊人nacy 2023-12-14 16:58:07
我需要检索 Mac 的真实架构,无论该进程是否通过 Rosetta 运行。现在在 Node.js 中process.arch返回,x64在 shell 中uname -m返回x86_64。
查看完整描述

2 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

如果翻译一下的话:

$ 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'


查看完整回答
反对 回复 2023-12-14
?
慕后森

TA贡献1802条经验 获得超5个赞

命令行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_FIRESTRM_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 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。


查看完整回答
反对 回复 2023-12-14
  • 2 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信