【发布时间】:2020-09-04 08:34:22
【问题描述】:
在编写自己的 MBR 时,我需要告诉 nasm 使用 16bit 程序集,我想知道为什么在 2020 年我们必须使用 16bit 程序集才能编写引导加载程序。
为什么我们不能使用现代 x64 程序集开发引导加载程序?
【问题讨论】:
标签: assembly x86-64 x86-16 bootloader
在编写自己的 MBR 时,我需要告诉 nasm 使用 16bit 程序集,我想知道为什么在 2020 年我们必须使用 16bit 程序集才能编写引导加载程序。
为什么我们不能使用现代 x64 程序集开发引导加载程序?
【问题讨论】:
标签: assembly x86-64 x86-16 bootloader
你可以。
如果您不想处理旧版 BIOS 16 位不便,请编写 UEFI 引导加载程序而不是旧版 MBR。 UEFI 引导加载程序是由固件在与 MBR 完全不同的环境中加载的 32 位或 x86-64 “应用程序”,来自文件系统而不是磁盘上的特定位置,这意味着嵌入少量代码(512 字节)到磁盘上的一个特殊位置。
主流 PC 使用 UEFI 启动已有十多年了;让固件将 CPU 置于实模式并设置传统 BIOS 调用处理程序是一种向后兼容功能,可保持与 MBR 启动的兼容性,因为该格式没有空间让元数据告诉系统您要在哪种模式下启动。
请注意,使 CPU 处于 64 位长模式需要启用分页,因此仅修改 MBR 引导以使 CPU 在进入 MBR 时处于 64 位模式将无法正常工作。你需要一堆新的标准化。很多实模式 BIOS API 都是过时的东西,跟不上现代 PC,比如基于 CHS 而非线性偏移的磁盘访问,对图形 + 鼠标的简单支持,以及没有文件系统访问。所以是时候进行全面改造了。更不用说勉强兼容的 BIOS 的可怕之处了,这些 BIOS 恰好与 Windows 引导加载程序一起工作,但以各种随机方式彼此不同,例如它们如何将 CS:IP 设置为相同的线性地址或其他段寄存器。
业界最终采用 EFI / UEFI 作为传统 IBM-PC BIOS 样式引导的完全替代品。 https://wiki.osdev.org/UEFI
【讨论】: