首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARM银行寄存器

ARM银行寄存器
EN

Stack Overflow用户
提问于 2017-03-15 13:04:05
回答 2查看 4K关注 0票数 2

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-16 15:05:53

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

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

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

它们不是动态地“创建”的。存储寄存器是核心的“寄存器文件”的一部分,总是存在。问题是,除非发生“模式切换”,否则典型的指令无法访问某些存储寄存器。这可能是从用户到IRQ模式,或从正常的安全世界与信任区。

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

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

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

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

银行业务也是在trustzone中使用CP15系统寄存器完成的。TrustZone monitor mode and banked IFSR...也许对任何一个看“银行业务”的人来说都很有趣,因为它在概念上和注册银行一样。

票数 3
EN

Stack Overflow用户

发布于 2017-03-15 13:46:58

我计算了支持传统手臂所需的31个寄存器。几个r13s和r14s一堆FIQ模式。首先也是最重要的,你是令人困惑的任务和模式。在应用程序级别,所有任务都将共享相同的寄存器集,没有银行业务,当您切换必须保存寄存器的任务时,操作系统将为此分配内存,而对于每个任务开关,将保存旧的任务寄存器并恢复下一个任务寄存器。

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

代码语言:javascript
复制
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个或更多寄存器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42810627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档