内存映射 I/O 是否通过使用 RAM 地址来工作?

问题描述 投票:0回答:2

想象一个能够使用 128 字节 RAM 寻址 8 位范围(我知道这实际上小得离谱)的处理器。还有一些映射到地址 100 的 8 位设备寄存器。为了向其存储值,CPU 是否需要在地址 100 处存储值,或者是否特别需要在 RAM 中的地址 100 处存储值?在伪组装中:

STI 100, value

VS

STI RAM_start+100, value
memory-management io cpu-architecture
2个回答
3
投票

通常,设备的地址是相对于其所在地址空间的开头来指定的。
数据表肯定有更多上下文,并将澄清该地址是否与其他内容相关。

但是,在使用它之前,您必须转换该地址,因为 CPU 会看到它

例如,如果使用

sti
指令可访问的 8 位地址范围被分成两半:

  1. 0-127 => 内存
  2. 128-255 => IO

因为硬件是这样接线的,所以从 CPU 来看,IO 地址范围从 128 开始,所以 x 的 IO 地址可以在 128 + x 处访问。

CPU 数据表通常建立用于给出设备地址和 CPU 内存映射的约定。

地址空间可以是分层的(例如在 PCI 中)或窗口化的(例如 x86 上的传统 PCI 配置空间),可以有别名,它们可能需要特殊指令或重叠(例如读取 ROM、写入 RAM)。

始终参考 CPU 手册/数据表来了解 CPU 内存映射及其地址范围的路由方式。


0
投票

如果访问地址100,你无法分辨它是ram还是I/O地址。

内存映射 I/O 是常态。您特别提到了内存映射。 因此,如果您访问一个用其地址标识的内存位置,您就可以寻址那里的任何内容,无论是 RAM 还是 I/O。

您已经阅读了大量英特尔文档。寻址 I/O 的特殊指令是一个奇怪的发明,只对微小的地址空间有利,类似于为堆栈使用单独的地址空间。

© www.soinside.com 2019 - 2024. All rights reserved.