内存映射 io 和 io 映射 io 有啥区别

Posted

技术标签:

【中文标题】内存映射 io 和 io 映射 io 有啥区别【英文标题】:what is the difference between memory mapped io and io mapped io内存映射 io 和 io 映射 io 有什么区别 【发布时间】:2011-04-22 20:57:56 【问题描述】:

请解释一下内存映射IO和IO映射IO的区别

【问题讨论】:

这似乎更像是一个机器架构问题,而不是一个编程问题。 尝试在 ServerFault.com 上提问 @DOK:你怎么会认为这是一个科幻问题? @Pointy:至少在编写驱动程序时这是一个问题。目前尚不清楚 kabhay 是否在该级别上工作,但是... 这个问题的答案对于任何为 x86 构建驱动程序的人来说都非常重要。因此,我会说它属于这里。 【参考方案1】:

嗯,……除非我误解了,否则你说的是两个完全不同的东西。我会给你两个非常简短的解释,这样你就可以用谷歌搜索你现在需要的东西了。

内存映射 I/O 是指将 I/O 硬件设备的内存映射到主内存映射中。也就是说,计算机内存中的地址实际上并不对应于您的 RAM,而是对应于内部寄存器和外围设备的内存。这就是 Pointy 所说的机器架构。

还有映射 I/O,这意味着获取(比如说)一个文件,并让操作系统将其部分加载到内存中,以便以后更快地访问。在 Unix 中,这可以通过mmap() 来完成。

我希望这会有所帮助。

【讨论】:

您的回答内容丰富,但您没有解释 IO 映射的 IO。 “计算机内存中的地址实际上并不对应于您的 RAM,而是对应于内部寄存器和外围设备的内存。”拥有映射到 RAM 的内部寄存器和内存(例如:打印机可以有 4 个寄存器,而网络摄像头有 7 个寄存器),还是所有设备都必须实现标准数量的寄存器和内存? 每个设备都是不同的,无论是内部还是接口方面。可以使用或不使用内存映射。它高度依赖设备【参考方案2】:

在 x86 上,有两种不同的地址空间,一种用于内存,另一种用于 I/O 端口。

端口地址空间限制为 65536 个端口,使用 IN/OUT 指令访问。

例如,可以使用某些 I/O 端口访问视频卡的 VGA 功能,但帧缓冲区是内存映射的。

其他 CPU 架构只有一个地址空间。在这些架构中,所有设备都是内存映射的。

【讨论】:

【参考方案3】:

内存映射 I/O 映射到与程序内存和/或用户内存相同的地址空间,并以相同的方式访问。

端口映射 I/O 使用单独的专用地址空间,并通过一组专用微处理器指令进行访问。

由于 16 位处理器将逐渐过时并在一般使用中被 32 位和 64 位取代,因此为 I/O 保留内存地址空间范围不再是问题,因为处理器的内存地址空间通常比系统中所有内存和 I/O 设备所需的空间大得多。

因此,利用内存映射 I/O 的优势变得更加实用。

这种方法的缺点是必须对每个设备的整个地址总线进行完全解码。例如,具有 32 位地址总线的机器需要逻辑门来解析所有 32 条地址线的状态,以正确解码任何设备的特定地址。这增加了向机器添加硬件的成本。

IO Mapped IO 系统的优势在于解码离散地址所需的逻辑更少,因此向机器添加硬件设备的成本更低。但是可能需要更多说明。

参考:-Check This link

【讨论】:

【参考方案4】:

两者之间还有一个更明显的区别。内存映射 I/O 设备是在 IO/M 为低电平时响应的 I/O 设备。而 I/O(或外设)映射的 I/O 设备是在 IO/M 为高时响应的设备。

【讨论】:

【参考方案5】:

内存映射 I/O 映射到与程序内存和/或用户内存相同的地址空间,并以相同的方式访问。

I/O 映射 I/O 使用单独的专用地址空间,并通过一组专用微处理器指令进行访问。

这两种方案之间的差异发生在微处理器/微控制器中。在大多数情况下,英特尔在其微处理器中使用了 I/O 映射方案,而摩托罗拉则使用了内存映射方案。

https://techdhaba.com/2018/06/16/memory-mapped-i-o-vs-i-o-mapped-i-o/

【讨论】:

对于 8 位复古类型,6502 使用内存映射,Z80 使用 IO 映射。

以上是关于内存映射 io 和 io 映射 io 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

内存映射 IO - 它是如何完成的?

存储映射IO

内存和 IO 带宽有啥区别,我们如何衡量每一个?

内存映射文件原理探索

在 iOS 中删除内存映射文件 - 幕后发生了啥?

内存映射文件原理探索