端口映射的I / O地址空间的位置

时间:2015-01-05 18:43:41

标签: c linux assembly hardware pc

我知道访问I / O地址空间中的端口需要特定的IN / OUT指令,它们不是物理内存(RAM)的一部分,但我还没有理解I / O地址空间实际位于何处(物理上)? (某种RAM)I / O控制器?物理内存的保留方?

3 个答案:

答案 0 :(得分:2)

在早期的X86处理器(以及8080,Z80等)上,I / O地址空间与内存位于同一数据和地址总线上,但是通过激活CPU上的专用IO请求引脚来访问

因此,电气I / O与RAM并行

这几天CPU直接说HDMI和PCIe,因此I / O空间要么在CPU内部(例如:VGA I / O接口),要么通过PCIe串行总线访问 PCIe还用于存储器映射I / O,因此在这方面IO仍然通过与存储器映射IO大致相同的电接口来访问。但不能超过用于RAM的相同IO引脚,

答案 1 :(得分:1)

可在Ralf Browns x86 / MSDOS中断列表中找到I / O地址列表:
http://www.pobox.com/~ralf
http://www.pobox.com/~ralf/files.html
ftp://ftp.cs.cmu.edu/afs/cs.cmu.edu/user/ralf/pub/

inter61d.zip:“PORTS.A”,“PORTS.B”,“PORTS.C”

答案 2 :(得分:1)

首先,您应该了解设备可以编程为响应任何地址,即使该地址不是物理内存的一部分。这是通过编程他们的内存解码器来完成的。简而言之,I / O设备的内存位于设备上。提供给设备的I / O空间通常映射设备上的存储器,即每个I / O设备提供它自己的存储器。

嗯,在过去,有一些"着名的"地址,例如,用于com(串行)端口的0x3f8,0x2f8,用于PCI配置空间的0xCF8-0xCFC。这些地址不使用任何物理存储器,单独的I / O信号被断言以指示这种情况。这些器件存储器解码器在工厂编程,仅在I / O引脚有效时才响应这些地址。

但这已经过时了。即使在PCI的后期,大多数设备最初都是通过IO空间配置的,但随后它们的存储器解码器被编程为响应物理存储器上方虚拟空间中的存储器映射地址。当编程存储器解码器时,不仅提供了基址,而且还提供了该地址空间的大小以避免设备之间的冲突。存储器位于设备上,而不是位于主机的RAM或芯片组中。

对于PCI-express,我相信现在咨询了内存映射空间的acpi表,并且基本上不推荐使用i / o指令。串行端口通常不包含在现代硬件中。即使它们是在PCI或PCIe设备上实现的。