内存映射I/O地址和RAM地址有关系吗?

Are memory mapped I/O address and RAM address related?

我在 How ram addresses are differentiated from memory map address 上阅读了类似问题的答案,但我仍然感到困惑。

假设一个系统连接了 4GB RAM 并连接了一些内存映射外围设备,那么我唯一可以使用的 RAM space 是 4GB 减去内存映射量 space?

比如GPIO映射到地址0x500,那么RAM地址0x500就没有办法使用了吗?如果 MMU 存在并启用,我相信这是可能的(希望如此?),但除此之外我不知道。

你标记的arm和其他处理器不一定不同。

通常,地址 space 的一部分被分配给内存映射 I/O、gpio、uart、nvic 等。有了 arm,你会有一些内部地址 space没有进入芯片供应商的 axi/amba 总线。

因此,如果您想使用带有 32 位地址总线的 arm,那么连接 4GB 的内存是浪费时间。你当然可以连接更多(我有一个 24GB 的 arm11))但它不是线性的你必须有一个像 PCIe hsa 这样的地址方案,你指向地址 space 的 window 你可以得到进入一个地址 space 之外(再次考虑 PCIe 但现实不是他们试图在 x86 中呈现的幻觉)。

但是你把这个复杂化了。特别是对于所有记录在案的 ARM。你有一个核心你是一个芯片供应商你购买这个核心它有一个地址总线(参见 amba/axi 文档)你连接到那个地址总线如果它是一个 cortex-m 他们有一些关于在哪里的指导方针把 ram 和 rom 放在这里,不要挡路。对于全尺寸手臂来说,这是最公平的游戏,您将基地址提供给映射某些外围设备的内核(想想 nvic、定时器等)。而不是像 cortex-m 那样,系统定时器基地址在设计中被硬编码,您将地址 space 中的基地址提供给核心,其中内部项目使用 PERIPHBASE 或类似的 signal/bus 名称)。除此之外,芯片供应商关于如何划分该地址 space 的心血来潮,手臂通常可以在两个地址之一启动,但当然您可以根据需要拥有任意多的地址层,并且对于每层都有一个 conversion/translation 到那个地址 space。这包括外围设备、内存 (ram/rom/flash) usb、pcie 等地址 spaces 等

所以它可能就像一台 pc,其中 pcie window 在同一 space 带走一两个 ram,你只是失去了那个记忆,但在那种情况下你是想想有点不对,因为它们是不同的地址spaces/layers。有些 pc 曾经是 64 位的,而 32 位的,即使 32 位还没有完全死掉,但我们现在可以拥有默认为 64 位的 bioses,并允许 pcie window 位于内存之上,而不是在内存上开一个洞。

购买像 arm 或 mips 这样的内核的好处是,即使不完全设计地址,您也可以在某种程度上 space 但是您喜欢,不必符合任何东西,等等。

您的问题没有一个答案,您需要指定特定的芯片和电路板(以及该系统的版本)才能进行此对话,如果它是真实可用的产品,除非有是一个 windowed 地址方案。人们喜欢认为段偏移量很糟糕,但它仍然存在于大多数可用的系统中,我们只是不能再使用这些术语了,我们并不总是有段寄存器,但我们仍然有地址 space 和 window编辑。 MMU 使地址 space 的分段变得容易得多,但使它们看起来是线性的。