【问题标题】:Are memory mapped registers separate registers on the bus?内存映射寄存器是总线上的独立寄存器吗?
【发布时间】:2021-12-29 18:50:04
【问题描述】:

我将以TM4C123 Arm 微控制器/板为例。

它的大部分 I/O 寄存器都是内存映射的,因此您可以使用以下方法获取/设置它们的值 常规内存加载/存储指令。

我的问题是,总线上某处的 cpu 之外是否有某种类型的寄存器映射到内存,并且您使用内存区域读取/写入它,该内存区域基本上在寄存器和内存上具有重复值,或者内存是寄存器本身吗?

【问题讨论】:

  • 有 CPU,并且有外围模块(又名 IP 模块/IP 内核)通过“内存”总线(例如 AXI 总线,或任何特定 CPU 所具有的)连接到该 CPU。读/写这些 IP 块是硬件连接的地址是与这些块交互的一种方式。从 CPU 的角度来看,这些 IP 块是“内存映射”的。 CPU 没有“单独的寄存器”来访问它们。 IP 块具有“接口寄存器”,CPU 可以通过读取/写入内存值来读取/写入。但是“CPU 寄存器”和“IP 块寄存器”是完全不同的东西。
  • 所以我的问题是,IP blocks registers 实际上只是内存地址空间的一部分,还是它们是 cpu 之外的实际寄存器,它们使用内存作为桥接器进行通信?
  • 两者或都不取决于您的定义... IP 块是内存地址空间的一部分,IP 块寄存器是从 IP 块的角度来看的实际寄存器(从 CPU 方面来看,它们只是内存中的另一个词)。例如 'CPU registers' != 'IP block registers' 虽然两者都有 'registers' 的名称。
  • 是的,我只是想确认在 cpu 之外存在一个实际的寄存器,即i/o registers 不仅仅是对一块内存进行裁判,没有其他任何内容。跨度>

标签: arm cpu-registers memory-mapping


【解决方案1】:

即使在 MCU 中也有很多总线。一辆接一辆又一辆的巴士像树上的树枝一样分裂。 (有时甚至不像一棵树那样合并)。

它可能早于英特尔/摩托罗拉之战,但肯定在那个时间范围内,您有分段寻址与平面寻址,并且您有 I/O 映射 I/O 与内存映射 I/O,因为摩托罗拉(和其他)没有独立的 I/O 总线(还有一个额外的...地址...信号)。

查看 arm 架构文档和芯片文档(arm 使 IP 不是芯片)。您有对地址进行操作的加载和存储指令。芯片的文档(在某种程度上 ARM 提供了 cortex-m 地址空间的规则)为事物提供了一长串地址。作为程序员,您只需将加载和存储的地址以及正确的指令排成一行。

有些营销人员可能仍然会使用诸如内存映射 I/O 之类的术语,因为英特尔 x86 仍然存在(如何????),有些人会继续使用这些术语。作为程序员,它们只是进入寄存器的位,而对于单个指令来说,这些位是地址。如果你想给它添加形容词,那就去吧。

如果您使用的基于芯片和内核文档的地址指向 sram,那么这是对内存的读取或写入。如果它是一个闪存地址,那么那就是闪存。 uart,uart。定时器 5,然后是定时器 5 控制和状态寄存器。等等……

这些 mcus 中有一些地址指向两三个东西,但不是同时指向的。 (地址 0x00000000 和之后的一些千字节数)。但是,同样,不是同时。并且这种重叠至少在许多这些 cortex-m mcus 中,这些特殊地址空间不会与“内存”和外围设备 (I/O) 重叠。但取而代之的是您可以启动芯片并运行一些代码的地方。使用这些 cortex-ms,我认为您甚至不能使用那种 mmu 来混合这些空间。是的,在全尺寸手臂和其他架构中,您可以使用完全炸毁的 MCU 来混合地址空间,并拥有一个位于不同类型物理地址空间的虚拟地址空间。

【讨论】:

  • 哇,这是很多信息,谢谢。你提到了Memory is memory, you dont send a write to a control register also to a memory, nor through the normal memory space. If you look at the memory map, the sram blocks are that address space.。那么地址空间是实际的“寄存器”本身而不是网桥?那为什么叫“内存映射”呢,根本就没有映射。我也知道这是一个很大的话题,它因平台而异,正如这篇文章所说:superuser.com/a/695508,即内存可能是“寄存器”本身,也可能是一座桥梁。
  • 对,但是该地址空间中的数据是如何被使用的呢?假设打印机需要数据,打印机会将数据复制到其内部寄存器还是内存充当寄存器本身?我认为答案是“视情况而定”。有些可能直接使用内存,有些可能会将其复制到内部寄存器,对吗?
  • 好吧,如果我们以原来的 Arm 板为例,I/O 寄存器,你是说它们实际上不是寄存器吗?只是记忆?
  • 术语“内存”映射只是为了将它与那些似乎认为重要的人的头脑中的术语 I/O 映射区分开来。它定义了一条总线或一组控制信号,用于确定各个项目所在的“地址空间”(闪存、SRAM、外围设备、处理器控制寄存器)。在这个手臂的情况下,您有三个总线,icode、dcode 和系统。我怀疑继续使用术语内存映射的原因是为了避免 I/O 映射 I/O 的污名。并不是说 I/O 映射的 I/O 曾经很糟糕(至少在 8088/86 上不是与内存分开的总线)。
  • 这里的要点是停止试图为这些术语赋予含义,它们大多是模糊的或不正确的,但我们已经使用它们很长时间了,人们只知道它们的意思。它们并不意味着单词所说的内容,您在内部将它们翻译成它们的真正含义。在这种情况下,这只是系统的地址映射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
相关资源
最近更新 更多