NASM: in/out 而不是 int

NASM: in/out instead of int

编写引导加载程序时,如何调用端口而不是使用中断(即 int 10h)?是否有我不知道的已知载体的在线列表?有没有我可以去映射 bios 中断未涵盖的硬件(即 PCI - GPU)的地方?

您可以通过 inout 指令与 I/O 端口通信。

in dest, src:其中dest为输入;我很确定只有累加器寄存器可以用作 destsrc 是端口号。 src可以是数据寄存器,也可以是立即数。

out dest, src:其中dest为端口号;这次数据寄存器或立即数用于 destsrc 是输出。 src可以是累加器寄存器。

鉴于缺乏信息,我假设您的引导加载程序适用于 x86,并且您将或多或少地被限制为 512 字节 space。如果是这种情况,我会建议使用 BIOS 为您提供的中断,直到您加载内核。

可以在 Wikibooks, Wikipedia, and the OSDev Wiki 上找到更多信息。

好吧,问题在于它不仅仅是硬件的映射,也不仅仅是计算机中的引导加载程序。

你说的其实是驱动的写法。 BIOS 管理最简单的设备,并使用最佳可用方法来实现程序员的需求。对于程序员来说,API 可以访问它,这对于 x86 实模式意味着中断,因为它们是进行完整上下文切换的最简单方法。

如果您仍想保持实模式,还有几个您可能不知道的中断,可以在某种程度上完整地找到 Ralf Brown´s Interrupt List

然而,PCI 和 GPU 以高频率处理 大量 数据,这需要更多的内存和性能,这在实模式下无法轻松操作。受保护和长模式是必经之路。

I8086 提到了 inout 指令作为访问设备的方法。 虽然这曾经是正确的并且对于某些设备仍然如此,但还有许多其他与硬件通信的方式,例如内存映射、DMA 或与协处理器的通信。有时您只需使用 inout 来找出设备内存所在的位置,然后使用内存映射接口访问它。我相信 PCI 就是其中之一。这些界面不再难用,但更有效。

您几乎会立即撞到名为 "lack of official and free documentation" 的墙。您一定不要对此感到失望,总是有很多设备可以免费获得其数据表和程序员参考资料(我们承认英特尔拥有大量文档),尽管它并不总是您自己的 GPU 或网卡。

TL;DR: 你应该尽快切换到保护模式以解锁新的选项范围,然后你可以考虑编写一些驱动程序。 OSDev Wiki 肯定会是一个很好的资源。