【问题标题】:Why a 32-bit SoC has registers with size of 1 or 2 bytes?为什么 32 位 SoC 的寄存器大小为 1 或 2 字节?
【发布时间】:2018-06-20 21:09:21
【问题描述】:

我正在阅读网络处理器 SoC 的数据表。它有一个 MIPS32 CPU 内核和许多集成的功能块。当我遇到其中一个块的寄存器映射时,我看到有许多寄存器的大小为 1 或 2 个字节:

一直以为在32位架构下,寄存器大小总是4字节,寄存器地址偏移量总是4的倍数。

我在这里误解了计​​算机体系结构的基本概念吗?

【问题讨论】:

  • x86_64 除了 8 位、16 位和 32 位普通寄存器之外还有许多 16 位段寄存器,而标志寄存器甚至不包含所有 32 位。它还具有 64/128/256/512 位 SIMD 寄存器[

标签: cpu-architecture cpu-registers


【解决方案1】:

这些是memory-mapped I/O registers 用于 SoC 内置的外围设备(在本例中为以太网硬件),不是“CPU 寄存器”

MIPS 具有字节加载/存储指令,因此在这些字节寄存器上使用 MMIO 编写设备驱动程序没有任何障碍。 MIPS's lb instruction 将零扩展字节加载到 32 位 CPU 寄存器中。无论您是一次处理一个字符的字符串,还是编写一个使用内存映射字节寄存器与硬件通信的设备驱动程序,都是一样的。

使用字节寄存器有一个特定的好处,而不仅仅是为不需要更大的寄存器使用更少的地址空间:一个字加载/存储可以原子地访问多个字节 MMIO 寄存器,至少在 CPU 中断方面。 (即 CPU 不必禁用可抢占内核设备驱动程序中的中断来原子地修改多个相关寄存器)。


相关:all modern architectures can natively do byte loads/stores。 Early Alpha AXP 是最近唯一的例外,它有一个特殊的稀疏 I/O 区域,其中字加载/存储映射到字节加载/存储,因此它仍然可以使用具有一些字节寄存器的普通硬件,而不仅仅是能够使用以太网卡设计为仅使用字 I/O 进行编程。

【讨论】:

  • 子字 I/O 寄存器还允许针对中断自动设置多个(可能相关的)寄存器(无需禁用中断)。
  • @PaulA.Clayton:很有趣,谢谢!我不编写设备驱动程序,我不知道它是否通常可以正常工作或不进行与多个 MMIO 寄存器重叠的更广泛的加载/存储。很高兴听到它确实有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-15
  • 2016-09-25
  • 2020-10-29
  • 2011-01-20
  • 2021-04-01
  • 2014-11-18
  • 2021-09-20
相关资源
最近更新 更多