CPU通用寄存器通常是内存映射的吗?

6

我对内存映射和内存映射I/O感到困惑。 例如在ARM架构中,通用寄存器如r0、r1等是否一般是内存映射的?


内存映射寄存器在ARM平台上很常见,因为它们与设备相关。在x86上,有可编程I/O的概念。它最初有两种类型的总线(现在仍然存在吗?)。比较冯·诺伊曼哈佛。从概念上讲,您可以拥有第三个总线,用于I/O与程序存储器(无论是指令还是数据)之间的通信。您需要使用可选总线的CPU指令。ARM还具有使用'mcr'和'mrc'的'协处理器'指令,一些外围设备使用这些指令。 - artless noise
1个回答

16
不,那些寄存器位于实际的CPU内部(或多核CPU的CPU核心内部)。您无法通过对任何内存地址的加载或存储来访问它们。
内存映射寄存器是一种通过地址或指针(在具有指针的语言中)访问的东西。I / O设备通常具有内存映射寄存器,您可以通过写入或读取特定地址来设置或获取信息或数据。换句话说,它们就像任何其他内存(例如RAM)一样被访问。
如评论中所述,确实存在具有内存映射CPU寄存器的CPU。它们几乎全都是在上世纪70年代设计的,现在已经成为历史。这些日子里,你遇到主流CPU(不是微控制器)带有内存映射寄存器的机会很渺茫。
一些微控制器架构仍然使用内存映射寄存器,包括旧设计,比如8051,甚至一些更近期的设计,如PIC微控制器AVR(一个具有32个8位寄存器的8位RISC)。 AVR MCU带有至少128字节的内部SRAM,其中低32字节也是寄存器文件。
特别针对ARM,ARM架构没有内存映射CPU寄存器。但是,包括与CPU在同一SoC上的外围设备在内的外围设备是另一回事:I/O寄存器并不是同样的东西,因为它们不能作为指令的操作数进行访问,除了加载或存储之外。(并且甚至不在运行您的指令的核心内部。)

2
我同意这个答案。在我使用过的几十种CPU架构中,内存映射寄存器非常罕见。PDP-11TI-9900有它们,但是其他的我想不起来了。请注意,这两种架构都来自1970年代。 - wallyk
1
此外,8位PIC设备的RAM非常少,通常从程序员的角度来看,所有RAM都被视为寄存器。但是,这种寄存器和RAM之间缺乏明确区分的情况非常罕见。 - cooperised
@old_timer,8051上唯一未被内存映射的寄存器是PC。而且它还有许多其他早期微处理器时代常见的怪癖。 - Some programmer dude
2
Mitch Alsup的My 66000将寄存器映射到内存地址。虽然没有硬件实现,但ISA设计是现代化的。(我认为ISA仍然是1.0之前的版本。) - user2467198
1
实际上,对于我的66000来说,线程上下文是内存映射的,但这确实允许软件从另一个线程写入寄存器。我不确定同步方面是否已经完全定义(特别是对于线程写入自己的寄存器),但据我所知,正在运行的线程可以从外部源更新其寄存器状态。 - user2467198
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接