【问题标题】:How to write a custom bootloader for mac systems?如何为 mac 系统编写自定义引导加载程序?
【发布时间】:2019-09-20 18:47:36
【问题描述】:

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

非常感谢!

【问题讨论】:

    标签: macos assembly bootloader uefi


    【解决方案1】:

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

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

    Assembly 不仅仅意味着带有 BIOS 调用的 16 位实模式。

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

    当您在 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 启动。

    【讨论】:

      【解决方案2】:

      我的问题是,有没有可能让它在 Mac / Apple 系统上运行。

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

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

      请注意,您还应该假设 UEFI 是“清除遗留包袱”计划的第一步(并假设英特尔的“2020 年后没有 BIOS,甚至不仅仅是兼容性模块”声明是因为英特尔计划撕毁芯片组等的“遗留包袱”;这将阻止其他人编写的固件继续支持 BIOS)。举一个简单的例子(已经存在); Apple 机器没有 PS/2 键盘控制器芯片,也没有“USB 设备的旧版 PS/2 仿真”支持,尝试访问 PS/2 键盘控制器芯片可能会导致计算机锁定。

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

      【讨论】:

      • 太棒了,也许更少的人会认为带有传统 PC 硬件的 16 位实模式“更接近于”他们现代桌面的金属,并停止将其作为他们的玩具操作系统项目的目标。但是,大多数最糟糕的 x86-16 SO 问题都来自使用 emu8086 或 DOSBOX 上学的人,所以这可能不会真正减少这种情况。 :/ 不管怎样,很高兴听到我们不会永远被 A20 这样的垃圾所困!
      • @PeterCordes:肯定有一些好处。不幸的是,也有不利的一面(例如 ACPI、安全启动)——我们正在进入一个没有准备的初学者需要应对的复杂性足以阻止大多数初学者开始的时代。
      • 我实际上还没有编写过 UEFI 应用程序(或旧版引导加载程序,但我知道如何编写,因为人们总是在 SO 上问这些问题),但大概 osdev 文档会发展到更多地涵盖 UEFI ?只要供应商可以禁用 SecureBoot,我们应该还是可以的,对吧?我在某种程度上明白你在说什么,但大多数关于 SO 的引导加载程序问题都来自那些似乎一开始几乎不了解 asm 的人。他们可以学习(或更好)使用调试器(如 BOCHS)在虚拟环境中进行开发。或非 x86 MARS。
      • 也许有很多人在尝试玩具操作系统,但从不需要问关于 SO 的问题,因为他们可以调试自己的愚蠢错误,但如果更多的话,他们中的许多人会放弃复杂的。我猜想纯粹进行 BIOS(或 UEFI)调用与使用 in/out 或 MMIO 直接与“硬件”对话之间的差距/飞跃会随着这一变化而变得更大,因为那时唯一稳定的接口可能会是 UEFI 调用吗?即使您确实假设有一个 AHCI SATA 控制器或其他东西,您是否需要 ACPI 才能找到它?这是一个公平的观点,如果这是你的意思。
      • @PeterCordes:人们在汇编中为 BIOS 编写引导加载程序,因为大多数编译器不能很好地支持实模式,而且 BIOS 的调用约定对于汇编来说几乎是令人愉快的(对于高级语言来说是可怕的)。对于 UEFI,情况正好相反——调用约定(堆栈对齐要求等)和位置独立性(以及 PE32+ 文件格式)使汇编语言“不那么有趣”,而高级语言则更加可行。
      猜你喜欢
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2012-03-02
      相关资源
      最近更新 更多