M1 Mac下`arch -x86_64 zsh`的内部执行机制解析
arch -x86_64 zsh的疑问与解答 问题背景
我在为M1 Mac(darwin arm64)寻找安装M1发布前的旧版npm包解决方案时,遇到了arch -x86_64 zsh命令。我知道它会尝试启动x86_64架构的zsh会话,但再次运行arch会返回i386(我认为它与x86_64兼容)。但我原本认为架构由硬件处理器决定,模拟不同架构需要VirtualBox或Qemu这类较重的软件,所以想了解arch -x86_64 zsh实际的作用,它是否真的在模拟不同架构?我尝试阅读man arch内容,但难以理解。
解答
1. arch -x86_64 zsh的本质
它没有用到第三方虚拟化工具,而是依赖Apple Silicon Mac内置的Rosetta 2翻译层——这是苹果专为M系列芯片打造的轻量兼容技术,能实时翻译x86_64架构的代码,让M1芯片可以直接执行,不需要额外的虚拟机。
2. 为什么运行arch返回i386?
这是zsh通用二进制的历史兼容特性导致的:zsh的通用二进制包同时包含了i386(32位x86)和x86_64(64位x86)的代码。当你用arch -x86_64指定架构时,系统确实在运行x86_64版本的zsh,但arch命令本身在x86_64环境下会返回i386作为兼容输出。你可以用uname -m命令验证,它会准确返回x86_64,证明当前会话是64位x86架构。
3. arch命令的核心作用
根据man arch的说明,它的功能是强制指定通用二进制文件的运行架构:
- 通用二进制是包含多架构代码的可执行文件,系统默认会选择最匹配硬件的架构(比如M1默认优先用arm64)
arch命令可以覆盖这个默认逻辑,让系统调用你指定的架构版本,对于x86_64架构的代码,Rosetta 2会自动完成翻译执行
翻译后的man arch核心内容
描述
不带参数的arch命令会显示机器的架构类型。
arch命令的另一个用途是运行通用二进制文件中的指定架构版本。通用二进制包含可在不同架构上运行的代码。默认情况下,操作系统会选择最匹配处理器类型的架构:64位处理器优先选择64位架构,而32位处理器只能运行32位架构。当最匹配的架构不可用时,操作系统会尝试选择其他架构:在64位处理器上会尝试32位架构,否则会报错无法运行。
arch命令可以改变操作系统的默认选择顺序,最常见的用法是在64位处理器上强制选择32位架构,即使64位架构可用。
arch_name参数必须是当前支持的架构之一:
- i386:32位英特尔架构
- x86_64:64位英特尔架构
- x86_64h:64位英特尔架构(Haswell处理器)
- arm64:64位ARM架构
- arm64e:64位ARM架构(Apple Silicon芯片)
内容的提问来源于stack exchange,提问作者RighteousGlory

