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

Linux 什么是i/o端口,i/o端口地址?那个地址是RAM的一部分吗?,linux,linux-kernel,linux-device-driver,device,Linux,Linux Kernel,Linux Device Driver,Device,什么是i/o端口,i/o端口地址?当驱动程序想要与硬件通信时,例如并行端口(0x378)。端口地址(0x378)是RAM地址还是其他什么?这最终取决于系统的体系结构 x86处理器和8080(最终是8008)使用一种称为I/O映射的方案,其中来自处理器的特殊控制信号指示访问是I/O端口,而不是常规内存位置。此类访问必须使用相应的特殊说明 许多其他处理器——特别是今天在移动和嵌入式设备中广泛使用的ARM内核——遵循不同的设计传统,即I/O端口在与普通内存相同的统一地址空间内映射到内存。这意味着它们显

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

这最终取决于系统的体系结构

x86处理器和8080(最终是8008)使用一种称为
I/O映射
的方案,其中来自处理器的特殊控制信号指示访问是I/O端口,而不是常规内存位置。此类访问必须使用相应的特殊说明

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


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

这最终取决于系统的体系结构

x86处理器和8080(最终是8008)使用一种称为
I/O映射
的方案,其中来自处理器的特殊控制信号指示访问是I/O端口,而不是常规内存位置。此类访问必须使用相应的特殊说明

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


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

连接到计算机的每个I/O设备都映射到一个唯一的I/O(输入/输出)地址。这些地址分配给您计算机上的每个I/O端口,包括
USB
Firewire
Ethernet
VGA
等。在您的计算机中,有
65535
端口的编号从
0000h
FFFFh


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

连接到计算机的每个I/O设备都映射到唯一的I/O(输入/输出)地址。这些地址分配给您计算机上的每个I/O端口,包括
USB
Firewire
Ethernet
VGA
等。在您的计算机中,有
65535
端口的编号从
0000h
FFFFh


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

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

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

内存映射I/O需要地址转换,即,一些物理地址专用于I/O。要从这些设备读取或写入,我们可以使用与读取或写入RAM位置相同的指令。简言之,我们完全从直接访问设备状态和控制寄存器抽象出来(和其他寄存器,如有)通过内存控制器

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

此外,请注意,端口映射设备可以从用户和内核模式访问,但内存映射设备只能从内核空间映射

在nutshell中,您所问问题的答案是-如果地址0x378是内存映射地址,那么它将是一个保留的物理ram地址

尝试cat/proc/iomem如果地址不在这里,那么它肯定是端口映射的地址。 希望这能让你明白


@Gopikrishnaraju

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