如何为Mac系统编写自定义引导程序?

时间:2019-05-02 09:14:59

标签: macos assembly bootloader uefi

我在汇编中编写了一个小的引导程序,它使用BIOS中断,并且在我的PC上运行良好。我的问题是,是否有可能使其在Mac / Apple系统上运行。我知道Apple在这种意义上不使用BIOS,并且它们将许多事情都锁定了下来。但是,可以在Mac上使用实时Ubuntu棒,那么是否可以从Mac上启动时运行汇编程序? 如果是,您是否知道之前所做的任何起点或参考?

非常感谢!

2 个答案:

答案 0 :(得分:2)

  

我的问题是,是否有可能使其在Mac / Apple系统上运行。

总有可能。例如,有人可能会将系统仿真器(例如Bochs,Qemu)移植到能够仿真完全不同的具有BIOS的计算机的UEFI(看起来像UEFI应用程序)。

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

请注意,您还应该假设UEFI是“遗留行李移除”方案的第一步(并假设Intel提出了“ 2020年以后不再使用BIOS,甚至不只是兼容模块”的声明,因为Intel计划淘汰芯片组中的“旧包”等;这将阻止其他人编写的固件继续支持BIOS)。举一个简单的例子(已经存在); Apple机器没有PS / 2键盘控制器芯片,也没有“用于USB设备的旧版PS / 2仿真”支持,并且尝试访问PS / 2键盘控制器芯片可能会导致计算机锁定。 / p>

主要是;有一堆假设(例如关于内存映射,以及是否存在诸如A20门,PIC芯片,PIT芯片,PS / 2键盘控制器,“ BIOS兼容”视频卡ROM,VGA硬件寄存器等)的假设对于UEFI而言不是正确的,对于UEFI而言则不是面向未来的。出于这个原因,您还应该审核引导加载程序引导的操作系统,以识别并消除所有(可能是错误的)“传统假设”(否则,即使您已经为UEFI设计了一个非常好的引导加载程序,该操作系统也是如此)可能会在启动后不久失败。)

答案 1 :(得分:0)

Mac固件不提供旧版BIOS模式AFAIK。

您必须使用UEFI“系统调用”而不是int 0x10等BIOS调用,将代码重写为32位或64位UEFI应用程序。当然,您仍然可以将其编写为汇编语言,并且仍将在CPU上本地运行。

组装不仅意味着可以通过BIOS调用实现16位实模式。

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公司的兼容性支持模块(CSM)进行,该模块可在Mac上提供BIOS仿真。 (显然,它对于启动Windows的某些方式也很有用,这就是为什么它首先存在的原因。) Windows通常也可以在现代PC上使用UEFI引导。