大数跨境

在 macOS 上设置 OSDev 环境

在 macOS 上设置 OSDev 环境 索引目录
2026-03-19
1
导读:关注「索引目录」公众号,获取更多干货。

关注「索引目录」公众号,获取更多干货。

为什么 macOS 上的 OSDev 能正常工作(如果你不再对抗默认设置)

失败模式总是相同的:你按照 OSDev 教程操作,点击make,最终得到的二进制文件要么无法启动,要么无法链接,甚至格式都不符合引导加载程序的要求。

macOS 是一个优秀的编辑器工作流程环境,但它作为传统操作系统开发(OSDev)的默认构建目标却非常糟糕。

本指南构建了一个分层的思维模型来解释“为什么”,然后给出了我成功使用过的三种设置(从最轻到最重):macOS 上的交叉工具链、Docker 构建容器和通过 Lima 运行的 Linux 虚拟机。


两个硬性限制(栈是不能忽略的)

1)CPU架构:aarch64 与 x86

现代 Mac(M1/M2/M3/M4)是aarch64(ARM64)机器。大多数 OSDev 示例、引导加载程序和“hello kernel”演练都针对i686/x86_64

  • 导致的问题:
    默认情况下生成Native clangldARM 机器代码。
  • 重要性:
     x86 模拟器(或真正的 x86 硬件)无法执行 ARM 操作码。如果你的内核使用了错误的指令集架构 (ISA),你不会遇到“轻微错误”的情况,而是会直接停止运行。

如果你的目标平台是 ARM ,那么你仍然会受到第二个限制。

2) 可执行文件格式:Mach-O 与 ELF

macOS 使用Mach-O。大多数操作系统开发工具链和启动流程都假定使用ELF 格式

  • ELF:
     Linux/BSD 工具和 OSDev 构建系统的通用格式。
  • Mach-O:
     macOS 原生格式,与 Apple 的链接器/加载器和平台约定紧密集成。
  • 导致的问题:
     OSDev 项目中的引导加载程序、内核和链接脚本通常需要 ELF 段/符号布局和 ELF 标头。
  • 核选项(不要这样做):
    编写自己的链接器(或在启动路径中编写 Mach-O 加载器),只是为了使原生工具链适用。

三种工作设置(从原生设置→隔离设置→最大兼容性设置)

方案一:macOS上的交叉编译器(反馈循环最快)

这是“全部保留在本地”的设置:

  • 编辑器:
     macOS
  • 构建工具链:i686-elf-*
    x86_64-elf-*
  • 输出:
    目标的 ELF 二进制文件

路径A:自制软件(快速入门)

如果你只需要一个可用的跨平台工具链,那么 Homebrew 是最快捷的途径。

brew install i686-elf-binutils i686-elf-gcc
  • 优点:
    几分钟即可完成设置。
  • 缺点:
    控制力较弱。一旦开始构建 libc、切换独立/托管模式或锁定特定版本,您就需要进行源代码构建。

路径 B:从源代码构建(“我要它正确无误”的路径)

这是常见的操作系统开发方法:先构建 binutils,然后基于 binutils构建GCC 。

为什么这个顺序很重要

  • Binutils
    提供as(汇编器)、ld(链接器)及其他工具。
  • GCC
    在生成最终对象/二进制文件时会调用这些工具。

Binutils 示例(i686-elf)

# Native compiler toolchain for building tools
xcode-select --install

# Fetch sources
wget https://ftp.gnu.org/gnu/binutils/binutils-2.45.tar.gz
tar -xvf binutils-2.45.tar.gz

# Out-of-tree build keeps your source directory clean
mkdir -p binutils-2.45/build
cd binutils-2.45/build

# Key flags:
# --target=i686-elf    => produce tools that emit i686 code and ELF output
# --prefix=...         => install into an isolated directory
# --disable-nls        => disables Native Language Support (fewer deps, faster build)
# --disable-werror     => warnings won't fail the build on strict compilers
../configure \
  --target=i686-elf \
  --prefix=/usr/local/cross \
  --disable-nls \
  --disable-werror

# macOS doesn't ship `nproc` by default
make -j"$(sysctl -n hw.ncpu)"
make install

对 GCC 重复相同的模式,将其指向相同的--target--prefix


方案二:Docker(可移植+可复现)

Docker 为您提供了一个干净的 Linux 构建环境,同时将源代码保留在主机上。

  • 您将获得:
    跨机器固定、可共享的工具链。
  • 你会损失什么:
    一些性能(尤其是在 Apple Silicon 上强制使用 x86 模拟时)。

最小 Dockerfile 框架

FROM --platform=linux/amd64 ubuntu:latest

RUN apt-get update && apt-get install -y \
    build-essential \
    wget \
    nasm \
    qemu-system-x86

# Toolchain install/build goes here:
# - install prebuilt x86_64-elf toolchain packages, OR
# - build binutils+gcc from source inside the image

WORKDIR /osdev
CMD ["/bin/bash"]

构建 + 运行

docker build -t osdev-env .

# -v maps your current folder into the container
docker run --rm -it -v "$(pwd)":/osdev osdev-env make

为什么这--platform=linux/amd64很重要?
在 Apple Silicon 上,这会强制使用 x86_64 用户空间。这可以提高与预编译工具链的兼容性,但由于需要进行模拟,运行速度可能会变慢。


方案三:通过 Lima 运行 Linux 虚拟机(兼容性最佳)

如果你想要最不“神秘莫测”的行为,那就别再跟 macOS 对抗了,改在 Linux 系统内构建吧。

  • 这是兼容性的终极方案:
    它符合大多数 OSDev 文档所假设的环境。
  • 工作流程:
    在 macOS 上编辑,在 Linux 上构建/运行,通过 SSH 连接 VS Code。

安装利马

brew install lima

创建并进入虚拟机

limactl start --name osdev template://ubuntu
limactl shell osdev

挂载你的源目录(主机↔虚拟机)

编辑实例配置:

limactl edit osdev

添加可写挂载点:

mounts:
  - location: /path/to/your/os/source/code
    writable: true

VS Code 集成

添加到您的 SSH 配置中,以便您的编辑器可以识别 Lima 主机:

Include ~/.lima/*/ssh.config
  • 编辑器界面:
     macOS
  • 构建工具 + QEMU:
    在虚拟机内部

在虚拟机内运行 QEMU

sudo apt-get update
sudo apt-get install -y qemu-system-x86

# Example: adjust to your boot flow / image layout
qemu-system-x86_64 -m 512M -net none -kernel /path/to/your/os/kernel

结论

选择能够提供确定性结果的最轻量级配置:

  • 交叉编译器:
    在 macOS 上日常运行速度最快。
  • Docker:
    团队和持续集成的最佳可复现性。
  • Lima VM:
    在工具链/引导加载程序深度方面具有最佳兼容性。

如果你想在 Apple Silicon 上运行完整的 Linux 主机而无需虚拟化,那么Asahi Linux是最终选择。


关注「索引目录」公众号,获取更多干货。


【声明】内容源于网络
0
0
索引目录
索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
内容 444
粉丝 0
索引目录 索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
总阅读544
粉丝0
内容444