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

Io 0x80端口地址连接到什么?,io,x86,port,hardware,Io,X86,Port,Hardware,当发送命令并从某个芯片(比如RTC)读取数据时,不同的文件说,我们应该等待一段时间才能从设备读取数据,以确保数据可用。许多代码段使虚拟从端口读取0x80。我想知道这个地址位置连接到什么设备,如果有的话。我谈论的是IA-32 PC体系结构。这些虚拟读取实现了延迟;发件人: inb\u p()、outb\u p()、inw\u p()和outu\u p()宏在其他情况下工作 与上面的相同,但是他们做了一个额外的短路(大约一个 端口访问后的延迟(微秒);你可以推迟四点左右 在#包含之前,使用#定义真正

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

这些虚拟读取实现了延迟;发件人:

inb\u p()
outb\u p()
inw\u p()
outu\u p()
宏在其他情况下工作 与上面的相同,但是他们做了一个额外的短路(大约一个 端口访问后的延迟(微秒);你可以推迟四点左右 在
#包含
之前,使用
#定义真正慢的IO
的微秒

这些宏通常(除非您通过跳转定义慢IO),这是 可能不太准确)将端口输出用于端口
0x80
的延迟,因此 您需要首先使用
ioperm()
访问端口
0x80
(输出到端口
0x80
不应影响系统的任何部分)。寻找更通用的方法 关于拖延,请继续阅读


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

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

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

通常,邮政编码很快就会闪过。但是,如果系统在引导时挂起,则可以查看最后一个POST代码,并使用此信息对系统进行故障排除

包含大多数BIOS的标准邮政编码列表。然而,计算机/主板制造商可能会插入他们自己的邮政编码,因此该列表并非100%全面

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

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

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

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

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

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

Windows驱动程序示例:
__外部(0x80,0x00A0)


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

补充回答:@phoxis注意,您列出的代码是基于EFI固件的英特尔主板所独有的。该列表可能不适用于其他主板。是的,它们是,我的观点是,我们可以使用端口进行虚拟读写,以引入较小的延迟。Linux内核上的用法4.2:每个端口映射到的内容:反向链接: