在ARM中,存在Banked Register的概念。在阅读许多问题及其答案以及有关 Banked 的各种其他资源时,请参阅此处。然后我得到了这个定义: 注册银行业务是指在同一地址提供注册的多个副本。并非所有寄存器都可以一次看到。
但我的问题是如何创建多个寄存器副本。因为我们的核心有单个寄存器文件。如果有另一种模式,那么它将获得不包含任何数据且不会访问另一模式寄存器数据的存储寄存器的新副本。 那么如何创建这个寄存器副本?
答案 0 :(得分:1)
我计算了支持传统手臂所需的31个寄存器。几个r13和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寄存器。
答案 1 :(得分:1)
寄存器银行业务是指在同一地址提供寄存器的多个副本。并非所有寄存器都可以一次看到。
这是正确的一些。但是,该登记册没有传统的地址'。大多数手臂指令或二进制编码'已注册为源或目标参数。有十六个基址寄存器,因此二进制指令中的每个寄存器需要四个位。典型指令需要12位(32位中的一位)来描述三个寄存器(两个源和一个目标)。指令中的这些位是'地址'在上面的定义中。
但我的问题是如何创建多个寄存器副本。因为我们的核心有单个寄存器文件。如果有另一种模式,那么它将获得不包含任何数据且不会访问另一模式寄存器数据的存储寄存器的新副本。那么如何创建这个寄存器副本?
他们没有被创造出来#39;动态。存储寄存器是“寄存器文件”的一部分。核心和始终存在。问题是典型的指令不能访问某些存储寄存器,除非模式切换'发生。这可能是从用户到IRQ模式,或者从可信区到正常到安全的世界。
因此,在不同模式下运行相同的代码可能最终访问不同的(存储区)寄存器。这样,用户代码永远不会影响IRQ堆栈,反之亦然。也许更重要的是,如果在IRQ的开始和结束时没有进行仔细的上下文保存,IRQ代码可能会破坏非存储用户寄存器。
有关如何访问这些不同寄存器的信息,请参阅:Accessing banked registers on ARM。
较新的ARMv7指令mrs r2,sp_svc
打破了这种分组寄存器规则,允许直接访问分组寄存器而无需切换模式。目的是允许上下文切换代码轻松访问存储寄存器,以便在没有模式切换的情况下进行保存和恢复。
传统指令ldm rN, {sp,lr}^
允许在不切换模式的情况下保存用户堆栈指针和链接寄存器。同样,这有一个特殊的编码(或按照你的定义寻址)。
银行业也通过Trustzone中的CP15系统寄存器完成。对于那些关注ARM'银行业务的人来说,TrustZone monitor mode and banked IFSR...可能很有趣。这在概念上与注册银行业务相同。