0x80端口地址连接到什么?

时间:2011-07-22 17:39:14

标签: io x86 port hardware

当发送命令并从某个芯片读取数据时,比如RTC,不同的文档说我们应该等待一段时间才能从设备读取数据以确保数据可用。许多代码段从端口0x80进行虚拟读取。我想知道这个地址位置连接的设备,如果有的话。我正在谈论IA-32 PC架构。

3 个答案:

答案 0 :(得分:13)

I / O端口0x80传统上用于POST代码。 (POST =开机自检)

系统启动时,BIOS会将一系列调试代码输出到I / O端口0x80。这些用于调试非启动系统。

在大多数台式机中,您可以安装POST代码调试板,它基本上是一个小型PCI(或ISA)插槽板,可对I / O端口0x80的I / O写入进行解码,并通过7段LED显示值

PCI Post Code board

通常情况下,POST代码会很快闪烁。但是,如果系统在启动时挂起,您可以查看上一个POST代码是什么,并使用此信息对系统进行故障排除。

This site 包含大多数BIOS的标准POST代码列表。但是,计算机/主板制造商可能会插入自己的POST代码,因此列表不是100%全面。

系统开始启动操作系统后,POST代码不是很相关。但是,某些操作系统供应商可能会使用POST代码板作为调试工具,特别是对于printf()可能不实用的代码中的位置(例如中断服务程序)。

某些操作系统将使用对I / O端口0x80的读写作为延迟机制。如果您需要等待几微秒才能完成某些事情,那么使用完整的sleep()或delay()定时器可能是不切实际的,因此对“安全”I / O地址执行“虚拟”读/写操作是轻量级的解决方案。对0x80的读取和写入基本上是保证不会对系统的操作产生不利影响,因此对于这种虚拟操作来说它是一个不错的选择。

你会发现,对于许多较旧/较慢的外围设备(如RTC芯片),有时需要等待一些usec进行I / O写操作才能“生效”。虚拟访问0x80是一种方便的方法。

您也可以找到对0x80进行虚拟写操作的代码,以“刷新”任何电子“回声”的总线。在某些平台上,可以将值写入未使用/无效的I / O地址,从该地址读回,并查看刚写入的值 ,即使实际上没有硬件在该地址 即可。但是,如果您对其间的另一个地址(例如,I / O端口0x80)执行虚拟写操作,则可以防止这种情况发生。

答案 1 :(得分:3)

enter image description here

您可以通过在内核驱动程序中使用此代码来编写(和读取)到端口0x80:

(请注意,像我这样的某些PC在这个位置有一个WORD,所以可以写16位。)

Windows驱动程序示例:
__outword(0x80,0x00A0);

如果您没有双机调试系统,并且由于任何原因(例如系统冻结)无法使用debugview跟踪,这也可用于内核调试。端口80可能会为您保留最后一个调试代码。

答案 2 :(得分:2)

它应该是一个延迟;例如读

> The inb_p(), outb_p(), inw_p(), and outw_p() macros work otherwise
> identically to the ones above, but they do an additional short (about
> one microsecond) delay after the port access; you can make the delay
> about four microseconds with #define REALLY_SLOW_IO before you
> #include <asm/io.h>. These macros normally (unless you #define
> SLOW_IO_BY_JUMPING, which is probably less accurate) use a port output
> to port 0x80 for their delay, so you need to give access to port 0x80
> with ioperm() first (outputs to port 0x80 should not affect any part
> of the system). For more versatile methods of delaying, read on.

来自here