如何为 mac 系统编写自定义引导加载程序?

How to write a custom bootloader for mac systems?

我用汇编写了一个小的引导加载程序,它使用 BIOS 中断,在我的电脑上运行得很好。我的问题是,是否有可能让它在 Mac / Apple 系统上运行。我知道 Apple 在这个意义上不使用 BIOS,而且他们正在锁定很多东西。然而,可以在 mac 上使用实时 ubuntu 棒,那么是否可以 运行 从 mac 上启动的汇编程序? 如果是,您是否知道之前所做的任何起点或参考?

非常感谢!

Mac 固件不提供传统 BIOS 模式,AFAIK。

您必须将代码重写为 32 位或 64 位 UEFI 应用程序,使用 UEFI "system calls" 而不是 int 0x10 等 BIOS 调用。你当然仍然可以用汇编编写它,它仍然会 运行 在 CPU.

上原生

汇编不仅仅意味着 16 位实模式与 BIOS 调用。

BIOS int-无论什么接口在 PC 上也已经过时,但 PC 固件通常具有向后兼容模式,您可以启用该模式将 CPU 切换回实模式并提供那些软件界面。 (在从磁盘加载 512 字节引导加载程序之前,固件本身可能在启动期间切换到 32 或 64 位模式。)

这就是当您在 PC 上 运行 遗留 BIOS 代码时发生的情况。


根据 https://www.ubuntu.com/download/desktop,常规的 x86-64 Ubuntu 可引导磁盘映像在 PC 和 Mac 上工作,大概都使用 UEFI。


或者可能不是,根据 http://www.rodsbooks.com/ubuntu-efi/ 在 Mac 上启动 Ubuntu 通常会通过 Mac firmare 兼容性支持模块 (CSM) 在 Mac 上提供 BIOS 仿真。 (显然对于某些引导方式也很有用 Windows,这就是它首先存在的原因。)不过,该页面似乎已过时; Windows 通常也会在现代 PC 上使用 UEFI 启动。

My question is, is there any possibility to make it work on Mac / Apple systems.

总是有可能的。例如,有人可能将系统模拟器(例如 Bochs、Qemu)移植到 UEFI(因此它看起来像一个 UEFI 应用程序),它能够模拟一台完全不同的计算机,该计算机确实具有 BIOS.

实际上,您需要为 UEFI 编写新的引导加载程序。

请注意,您还应该假设 UEFI 是 "legacy baggage removal" 方案中的第一步(并假设英特尔的 "no BIOS after 2020, not even just a compatibility module" 声明是因为英特尔计划撕掉 "legacy baggage"芯片组等;这将阻止其他人编写的固件继续支持 BIOS)。举一个简单的例子(已经存在); Apple 机器没有 PS/2 键盘控制器芯片,也不支持 "legacy PS/2 emulation for USB devices",尝试访问 PS/2 键盘控制器芯片会导致计算机锁定。

大部分;有一大堆假设(例如关于内存映射,以及 A20 门、PIC 芯片、PIT 芯片、PS/2 键盘控制器、"BIOS compatible" 视频卡 ROM、VGA 硬件寄存器等东西的存在,等等)要么不适用于 UEFI,要么不适用于 UEFI。出于这个原因,您还应该审核引导加载程序启动的 OS,以识别并消除所有(可能是错误的)"legacy assumptions"(否则,即使您设计了一个非常好的引导加载程序对于 UEFI,OS 可能会在启动后很快失败。