什么是i / o端口,i / o端口地址?那个地址是RAM的一部分吗?

时间:2014-05-27 11:42:35

标签: linux linux-kernel linux-device-driver device

什么是i / o端口,i / o端口地址?当驱动程序想要与硬件通信时,例如并行端口(0x378)。那个端口地址(0x378)是RAM地址还是其他东西?

3 个答案:

答案 0 :(得分:10)

这最终取决于系统的架构。

x86处理器和它们下载的8080(最终是8008)使用一个名为I/O mapping的方案,其中来自处理器的特殊控制信号指示访问I / O端口而不是常规内存地点。必须使用相应的特殊指令进行此类访问。

许多其他处理器 - 尤其是当今移动和嵌入式设备中如此普遍的ARM内核 - 遵循不同的设计传统,其中I / O端口memory mapped在与普通内存相同的统一地址空间内。这意味着它们显示为常规内存位置(在特殊的保留地址区域中),并使用相当正常的指令进行访问。但需要注意的是,有时只允许特定的宽度访问 - 例如,32位嵌入式ARM芯片可能需要使用16位存储器访问指令访问特定端口,即使保留了完整的32位总线字为了它。

最终,有关特定处理器的信息可在其数据表或程序员手册中找到。具有连接片外外设的总线的系统 - 尤其是桥接总线 - 可能会增加额外的限制。

答案 1 :(得分:0)

连接到计算机的每个I / O设备都映射到唯一的I / O(输入/输出)地址。这些地址分配给计算机上的每个I / O端口,包括USBFirewireEthernetVGA等。在您的计算机中有65,5350000hFFFFh编号的端口。

I / O地址由计算机的主板控制,它们不会耗尽任何系统内存或RAM。通过为每个端口分配唯一的地址,您的计算机可以轻松识别和定位连接到计算机的设备。无论是键盘,鼠标,显示器,打印机还是任何其他设备,计算机都可以通过其I / O地址找到它。

答案 2 :(得分:0)

将外设连接到cpu的两种方法是1)通过专用I / O总线(端口映射I / O)2)通过内存控制器(内存映射I / O)连接处理器。

端口映射的I / O设备由处理器直接寻址,需要特殊指令才能实现。

内存映射I / O需要地址转换,即......,某些物理地址专用于I / O.为了从这些器件读取或写入,我们通常可以使用通常作为读取或写入RAM位置的指令。简而言之,我们完全抽象通过存储器控制器直接访问器件状态和控制寄存器(以及其他寄存器,如果有的话)。 / p>

这就是内核中的ioremap()函数恰好为上述实现发生的事情,即...,将设备地址区域映射到进程的虚拟地址空间。 存储器,设备和CPU连接到主地址总线。当总线看到某些地址时,寻址解码电路知道它们不是存储器地址,而是生成来访问I / O设备。

除了注意,可以从用户和内核模式访问端口映射设备,但是内存映射设备仅从内核空间映射。

在坚果shell中,您提出的问题的答案是 - 如果地址0x378是内存映射的地址,则它将是一个保留的物理ram地址。

如果地址不在这里,请尝试cat / proc / iomem然后它是一个确定的端口映射。 希望这能澄清你

@Gopikrishnaraju