我正在阅读网络处理器SoC的数据表。它有一个MIPS32 CPU内核和许多集成功能块。当我遇到其中一个块的寄存器映射时,我看到有许多寄存器的大小为1或2个字节:
我一直认为在32位架构中,寄存器大小总是4个字节,寄存器的地址偏移量总是4的倍数。
我是否误解了计算机体系结构的基本概念?
答案 0 :(得分:2)
对于SoC内置的外设(本例中为以太网硬件),不是“CPU寄存器”,这些是memory-mapped I/O registers。
MIPS具有字节加载/存储指令,因此在这些字节寄存器上使用MMIO写入设备驱动程序没有障碍。 MIPS's lb
instruction将零扩展字节加载到32位CPU寄存器中。无论您是一次处理一个字符串,还是编写一个与具有内存映射字节寄存器的硬件对话的设备驱动程序,它都是一样的。
使用字节寄存器有一个特别的好处,除了使用较少的地址空间用于不需要更大的寄存器:字加载/存储可以原子方式访问多字节MMIO寄存器,至少就CPU中断而言。 (即,CPU不必在可抢占的内核设备驱动程序中禁用中断,以原子方式修改多个相关寄存器)。
相关:all modern architectures can natively do byte loads/stores。早期的Alpha AXP是最近的唯一例外,它有一个特殊的稀疏I / O区域,其中字加载/存储映射到字节加载/存储,因此它仍然可以使用具有一些字节寄存器的普通硬件,而不是仅能够使用以太网卡设计为只用字I / O编程。