编写引导加载程序时,如何调用端口而不是使用中断(即int 10h
)?在网上有一个列表我不知道已知的载体吗?有没有地方我可以去做bios中断未覆盖的硬件映射(即PCI-GPU)?
答案 0 :(得分:4)
您可以通过in
&进行I / O端口通信。 out
说明。
in dest, src
:其中dest
是输入;我很确定只有累加器寄存器可以用作dest
。 src
是端口号。 src
可以是数据寄存器或立即值。
out dest, src
:其中dest
是端口号;这次数据寄存器或立即值用于dest
。 src
是输出。 src
可以是累加器寄存器。
鉴于缺乏信息,我假设您的引导加载程序是针对x86的,并且您将被限制为或多或少地限制为512字节的空间。如果是这种情况,我建议您使用BIOS为您提供的中断,直到您加载内核为止。
可在Wikibooks,Wikipedia和OSDev Wiki找到更多信息。
答案 1 :(得分:4)
嗯,问题在于它不仅仅是硬件的映射,而且它不仅仅是计算机中的引导加载程序。
你真正在谈论的是写一个驱动程序。 BIOS管理最简单的设备,并使用最好的方法来实现程序员想要的。对于程序员来说,有一个访问它的API,对于x86实模式来说意味着中断,因为它们是完成上下文切换的最简单方法。
如果您仍想保持实模式,可能还有几个中断,您可能不知道,可以在某种程度上完成Ralf Brown´s Interrupt List。
然而,PCI和GPU在 lot 数据的高频下工作,这需要更多的内存和性能,这在实模式下无法轻松操作。保护和长模式是要走的路。
I8086提到了in
和out
指令作为访问设备的方法。
虽然这曾经是真实的,并且对于某些设备保持正确,但还有许多其他方式与硬件通信,例如,内存映射,DMA或与协处理器的通信。有时您只需使用in
和out
来查找设备的内存所在,以便使用内存映射接口访问它。我相信PCI就是其中之一。这些界面不再难以使用,但它们更有效。
你几乎会立刻碰到名为“缺乏官方和免费文档”的墙。你不能对此感到失望,总有很多设备可以免费获得他们的数据表和程序员参考(让我们承认英特尔有大量的文档),尽管它并不总是你自己的GPU或网卡。
TL; DR:您应该尽快切换到保护模式以解锁一系列新选项,然后您可以考虑编写一些驱动程序。 OSDev Wiki肯定会成为一个很好的资源。