Arm 臂式寄存器

Arm 臂式寄存器,arm,cpu-registers,Arm,Cpu Registers,在ARM中有一个银行注册的概念。阅读许多问题及其答案和各种其他资源,了解这里的银行是什么意思。然后我得到了这个定义: 注册银行是指在同一地址提供多份注册副本。并非所有寄存器都可以同时看到 但我这里的问题是如何创建寄存器的多个副本。因为我们的核心只有一个寄存器文件。如果存在另一种模式,则它将获得银行寄存器的新副本,该副本将不包含任何数据,并且不会访问另一种模式寄存器的数据。 那么如何创建此注册表副本 我统计了支持传统arm所需的31个寄存器。几个R13和R14组合用于FIQ模式。首先也是最重要的是

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

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

我统计了支持传统arm所需的31个寄存器。几个R13和R14组合用于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等),根据是否包含*PSR寄存器,有31个或更多

注册银行是指在同一地址提供多份注册副本。并非所有寄存器都可以同时看到

这是正确的。但是,寄存器没有“传统地址”。大多数arm指令或“二进制编码”都有寄存器作为源参数或目标参数。有16个基址寄存器,因此二进制指令中每个寄存器需要4位。典型的指令需要12位(32位中的12位)来描述三个寄存器(两个源和一个目标)。指令中的这些位是上述定义中的“地址”

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

它们不是动态“创建”的。银行寄存器是核心的“寄存器文件”的一部分,始终存在。问题在于,除非发生“模式切换”,否则典型指令无法访问某些存储寄存器。这可能是从用户到IRQ模式,或者从普通到安全的trustzone世界

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

有关如何访问这些不同寄存器的信息,请参阅

较新的ARMv7指令
mrs r2,sp_svc
打破了此存储寄存器规则,允许在不切换模式的情况下直接访问存储寄存器。其目的是允许上下文切换代码轻松访问存储寄存器,以便在无需模式切换的情况下进行保存和恢复

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



银行业务也通过托管区中的CP15系统寄存器完成。任何人都可能对ARM“银行”感兴趣,它在概念上与寄存器银行相同。

但问题是,当发生模式切换时,该模式将获得R13寄存器,该寄存器是银行寄存器。好吗??那么之前保存的内容发生了什么?有几个不同的寄存器,您访问哪一个取决于模式,当您返回到之前的模式时,您就可以访问该存储寄存器的内容,如上面的伪代码所示。如果您写入r14_svc,一些值,然后切换模式,读取/写入r14_irq一段时间,然后返回svc模式,您可以访问保留在存储寄存器中的r14_svc,不管怎么说,我明白你说的数据不会损坏是的,以前的模式数据确实不会损坏,但我无法理解新模式如何通过体系结构而不是编码获得r13寄存器的新副本?引导代码或引导加载程序会遍历每个模式并设置堆栈,是软件做的。对于除用户模式以外的所有模式,您可以写入cpsr以手动更改模式,然后您只需写入r13,将模式写入r13,等。可能是系统和用户模式共享寄存器的一个原因。您的ans消除了我的疑问…我对该寄存器文件包含oly 16寄存器感到困惑…代表:解释中的完全混乱:一个寄存器的多个副本存储在同一地址…您能在汇编中编写此sharabia,以便我们知道涉及哪些部分以及怎么做?根本就没有“地址”。它是操作码二进制中的一个位范围。根据CPU的当前模式,访问不同的“内存”或寄存器。寄存器只是物理上位于CPU逻辑内部的超高速内存。参见链接:获取一些示例代码或TZ链接。还有:它有几个译本。