【问题标题】:Get real architecture of M1 Mac regardless of Rosetta获取 M1 Mac 的真实架构,无论 Rosetta
【发布时间】:2021-03-28 11:18:54
【问题描述】:

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

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

【问题讨论】:

  • 我的用例是通过自动更新发布应用程序的 arm 版本。还可以跟踪谁在运行模拟软件并将其与性能或其他问题联系起来。
  • 应该可以检测到Rosetta 2的存在并假设arm。
  • this note 说明了一般如何做到这一点。不过,我怀疑是否已经为此编写了一个 Nodejs 模块。
  • 谢谢!你知道是否有办法在 shell 脚本中做同样的事情吗? (如果您的终端应用程序在 x86 中运行,则 uname -m 将不会返回 arm)
  • 编写一个可执行文件来进行实际检查。在脚本中,尝试执行二进制文件并检查其结果以及它是否无法实际执行。

标签: javascript node.js macos shell rosetta


【解决方案1】:

正如@Elmo 的answer 所示,命令行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。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 1970-01-01
      • 2021-12-21
      • 2021-10-04
      • 2021-06-23
      • 2021-03-25
      • 1970-01-01
      • 2021-11-28
      • 2022-08-23
      相关资源
      最近更新 更多