【问题标题】:What does the 0x80 port address connect to?0x80 端口地址连接到什么?
【发布时间】:2011-07-22 17:39:14
【问题描述】:

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

【问题讨论】:

标签: io x86 port hardware


【解决方案1】:

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

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

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

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

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

在系统开始引导操作系统后,POST 代码的相关性并不高。但是,一些操作系统供应商可能会使用 POST 代码板作为调试工具,特别是对于代码中 printf() 可能不实用的地方(例如中断服务例程)。

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

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

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

【讨论】:

  • @phoxis 请注意,您列出的代码是基于其 EFI 固件的英特尔主板所独有的。该列表可能不适用于其他主板。
  • 是的,我的意思是我们可以使用端口进行虚拟读写以引入小的延迟。
【解决方案2】:

那些虚拟读取实现了延迟;来自Linux I/O port programming mini-HOWTO

inb_p()outb_p()inw_p()outw_p() 宏在其他情况下工作 与上面的相同,但他们做了一个额外的短(大约一个 微秒)端口访问后的延迟;你可以让延迟大约四 #define REALLY_SLOW_IO 在你 #include <asm/io.h> 之前的微秒。

这些宏通常(除非您#define SLOW_IO_BY_JUMPING,即 可能不太准确)使用端口输出到端口0x80 延迟,所以 您需要首先使用ioperm() 访问端口0x80(输出到端口 0x80 不应影响系统的任何部分)。对于更通用的方法 关于延迟,请继续阅读。

【讨论】:

    【解决方案3】:

    您可以通过在内核驱动程序中使用以下代码向(从)端口 0x80 写入(和读取):

    (请注意,像我这样的一些 PC 在此位置有一个 WORD,因此可以向其写入 16 位。)

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

    这也可用于在您没有两台机器调试系统并且由于任何原因(例如系统冻结)而无法使用 debugview 跟踪的情况下进行内核调试。端口 80 可能会为您保留最后的调试代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      相关资源
      最近更新 更多