ARM 银行化寄存器

ARM Banked register

在ARM中有一个Banked Register的概念。在阅读许多问题及其答案以及有关 Banked 在这里的意思的各种其他资源时。然后我得到了这个定义: 寄存器银行是指在同一地址提供寄存器的多个副本。并非所有寄存器都可以一次看到。

但我在这里的问题是如何创建寄存器的多个副本。因为我们的核心中只有一个寄存器文件。如果有另一种模式,那么它将获得不包含任何数据的存储寄存器的新副本,并且不会访问另一个模式寄存器的数据。 那么这个寄存器副本是如何创建的呢?

我数了一下支持传统arm需要31个寄存器。几个 r13s 和 r14s 一堆用于 FIQ 模式。首先,您混淆了任务和模式。在应用程序级别,任务将共享同一组寄存器,那里没有内存,当您切换任务时,您必须保存寄存器,操作系统为此分配内存,并为每个任务切换保存旧任务寄存器并恢复下一个任务登记。

就注册银行而言,例如有多个 r13。对于寄存器的每次访问,寄存器文件中不仅有一个简单的偏移量,它还有其他输入,例如

unsigned int get_r13 ( unsigned int mode )
{
switch(mode)
{
case SYS: return r13_sys;
case SVC: return r13_svc;
case ABT: return r13_abt;
case UND: return r13_und;
case IRQ: return r13_irq;
case FIQ: return r13_fiq;
}
}

但在逻辑上,尽管逻辑看起来很相似,但它们采用模式位并在逻辑上将它们转换为一些地址位并进入寄存器文件或其组合。

单个寄存器文件并不意味着寄存器文件中只有16个寄存器(r0-r15,不算cpsr等),有31个或更多取决于它是否包含*PSR寄存器。

Register banking refers to providing multiple copies of a register at the same address. Not all registers can be seen at once.

这是正确的。但是,寄存器没有 'traditional address'。大多数 arm 指令或 'binary encodings' 都将寄存器作为源或目标参数。有十六个基址寄存器,因此二进制指令中每个寄存器需要四位。一条典型的指令需要 12 位(共 32 位)来描述三个寄存器(两个源和一个目标)。指令中的这些位是上面定义中的'address'。

But my query here is that How multiple copies of registers are created. Because we have single register file in our core. And if there is another mode then it will get the new copy of the banked register that will not contain any data and not going to access the data of another mode register. Then how this copy of register is created?

它们不是 'created' 动态的。分组寄存器是内核 'register file' 的一部分,并且 始终存在 。问题是除非出现 'mode switch',否则典型指令无法访问某些分组寄存器。这可能是从用户到 IRQ 模式,或者是从正常到使用 trustzone 的安全世界。

因此 运行 不同模式下的相同代码最终可能会访问不同的(分组的)寄存器。这样,用户代码永远不会影响 IRQ 堆栈,反之亦然。也许更重要的是,如果在 IRQ 的开始和结束时没有仔细保存上下文,IRQ 代码可能会破坏非分区用户寄存器。

有关如何访问这些不同寄存器的信息,请参阅:Accessing banked registers on ARM

较新的 ARMv7 指令 mrs r2,sp_svc 打破了这种分组寄存器规则,允许直接访问分组寄存器而无需切换模式。目的是让上下文切换代码无需模式切换即可轻松访问存储的寄存器以进行保存和恢复。

传统指令ldm rN, {sp,lr}^允许在不切换模式的情况下保存用户堆栈指针和link寄存器。同样,这有一个特殊的编码(或根据您的定义寻址)。


银行业务也是通过 trustzone 中的 CP15 系统寄存器完成的。 TrustZone monitor mode and banked IFSR... 对于任何关注 ARM 'banking' 的人来说,这在概念上与寄存器组相同。