我想知道与通过 I/O 端口读取/写入设备相比,Linux 是否看到了与外围设备内存的 mmap 之间的差异。根据我在汇编课上学到的知识,我们几乎以与内存寻址相同的方式看待 I/O 端口寻址。所以我想我想知道我是否要写入我的设备所连接的端口的 I/O,这与映射到该设备的内存是一样的吗?
谢谢
我想知道与通过 I/O 端口读取/写入设备相比,Linux 是否看到了与外围设备内存的 mmap 之间的差异。根据我在汇编课上学到的知识,我们几乎以与内存寻址相同的方式看待 I/O 端口寻址。所以我想我想知道我是否要写入我的设备所连接的端口的 I/O,这与映射到该设备的内存是一样的吗?
谢谢
I/O 端口不是内存。一些硬件(例如图形卡)通过内存总线连接,而不仅仅是通过 I/O 端口总线。
对于具有内存接口的硬件(即,被视为 CPU 的内存范围),您可以使用mmap
.
X11 服务器Xorg
经常映射图形卡。
我认为OP混淆了三件事:
mmap() 是应用程序对页寄存器和/或 MMU 执行某些操作的一种方式。
内存映射 I/O 是一个硬件架构概念:不是为 I/O 提供单独的总线和操作,而是地址空间的某些区域专用于 I/O 操作。(68K 处理器系列使用内存映射 I/O,以及 IBM 的 AIX,IIRC)。
DMA 意味着不仅 CPU,而且 I/O 设备都可以读取和写入(部分)物理内存。
vm_area_struct
包含vm_flags
字段。在特殊映射的情况下,它包含VM_PFNMAP
或VM_IO
标志。请参阅 LXR 中的 struct vm_area_struct、VM_PFNMAP和VM_IO定义。