上一节中我们学习了ARM汇编指令集的有关知识,这一节我们主要学习ARM架构寄存器的有关知识。在处理器中,寄存器用于保存需要被快速访问的数据,在操作系统中需要特别注意的寄存器主要有栈指针寄存器(SP)、连接寄存器(LR)、程序计数器(PC)以及当前程序状态寄存器(CPSR)和保存程序状态寄存器(SPSR)。本小节主要以ARMv8-A为例介绍ARM架构的寄存器的基本情况。详情可参见文献[1],D1.6小节。

一、AMRv8寄存器简介

在这一小节中,我们主要介绍ARMv8架构中AArch64执行状态下的寄存器使用情况。ARM架构中的寄存器主要有两类,一类用于提供系统控制与状态报告;另一类用于指令运行和异常处理。我们主要讨论第二类。

通用寄存器主要用于基本指令集中的指令运行,通用寄存器共有31个,编号为R0-R31。这些通用寄存器可以被当成31个64bit的寄存器,编号为X0-X30;或者被作为31个32bit的寄存器,编号为W0-W30。

在AArch64执行状态下,除了通用寄存器外,每一个异常级别都会有一个栈指针寄存器(StackPointer Register, SP),栈指针寄存器为SPEL0和SPEL1。异常级别用于区分指令的执行权限,我们将在本章的第四期介绍。如果处理器实现中包含EL2,那么还有SPEL2。如果处理器实现中包含EL3,那么还有SPEL3。详情可参考链接[5]。

SIMD和浮点寄存器共用一系列寄存器,这些寄存器会用于浮点操作、向量操作和其它SIMD有关的标量操作。SIMD指令是能够复制多个操作数、并把它们打包在大型寄存器的一组指令集[3]。以加法指令为例,单指令单数据(SISD)的CPU对加法指令译码后,执行部件先访问内存,取得第一个操作数;之后再一次访问内存,取得第二个操作数;随后才能进行求和运算。而在SIMD型的CPU中,指令译码后几个执行部件同时访问内存,一次性获得所有操作数进行运算。浮点寄存器和SIMD寄存器共包含32个128bit位宽的寄存器,V0-V31。这些寄存器可以作为:

  • 32个双字(64bit)寄存器,D0-D31。

  • 32个单字(32bit)寄存器,S0-S31。

  • 32个半字(16bit)寄存器,H0-H31。

  • 32个单字(8bit)寄存器,B0-B31。

程序状态寄存器(Current Program Status Register,CPSR) 在用户级编程时用于存储条件码。CPSR包含条件码标志,中断禁止位,当前处理器模式以及其他状态和控制信息。

保存程序状态寄存器(SPSR,Saved Program StatusRegister)用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态。在A64中,不再使用单一的CPSR寄存器,来保存当前处理器状态,而是用PSTATE来保存处理器状态,而在A32中依然使用CPSR。有关PSTATE和CPSR的详细信息可参考链接[4]。A64中SPSR 格式的示意图如下图所示:

其中N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以用于决定某条指令是否被执行,其含义如下表所示[8]:

标志位 含义
N 当两个有符号整数运算时:N=1表示运算的结果为负数;N=0表示运算的结果为正数或零。
Z Z=1表示运算的结果为零,Z=0表示运算的结果非零。
C

可以有4种方法设置C的值:

  • 在加法指令中(包括比较指令CMP),当结果产生了进位,则C=1,表示无符号运算发生上溢出;其他情况C=0。

  • 在减法指令中(包括减法指令CMP),当运算中发生借位,则C=0,表示无符号运算数发生下溢出;其他情况下C=1。

  • 对于包含移位操作的非加减运算指令,C中包含最后一次溢出的位的数值。

  • 对于其他非加减运算指令,C位的值通常不受影响。

V 对于加减运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号为溢出,通常其他指令不影响V位。

M[3:0]则用来确定异常级别和SP:

有关SPSR中各个位的详细信息可以参考文献[1] 1.6.4小节。

连接寄存器LR(R14)的主要作用有两个:

1. 保存子程序返回地址,用MOVE指令或BX指令可以用于实现返回,如MOV PC、LR或BXLR。若子程序中还需要调用子程序,则可以写为:

第一条指令将LR中的内容入栈,最后一条将栈中保存的LR寄存器的内容存入PC中用于返回。

2. 当异常发生时,异常模式的LR用于保存异常返回地址,将LR内容入栈可以处理嵌套中断。

PC是程序计数器,其中保存的是正在被加载的指令,而不是正在被执行的指令。例如,若指令长度为4byte,则PC指向当前正在被执行的指令的地址+8byte的地址。关于LR和PC的详细内容可参考文献[6]和[7]。

以下是异常级别EL3中使用的寄存器的例图:

ARM架构中处理器有不同的运行模式,因此同一个功能的寄存器在不同的运行模式下可能对应不同的物理寄存器,这些寄存器被称为备份寄存器。如SPSR_svc表示svc模式下使用的SPSR寄存器。ARM架构中常用的运行模式如下表所示[9]:

处理器模式

描述

用户模式(User, usr)

正常程序执行的模式

快速中断模式(FIQ, fiq)

用于高速数据传输和通道处理

外部中断模式(IRQ, irq)

用于通常的中断处理

特权模式(Supervisor, svc)

供操作系统使用的一种保护模式

数据访问中止模式(Abort, abt)

当数据或指令预取中止时进入该模式,用于虚拟存储及存储保护

未定义指令中止模式(Undefined, und)

当执行未定义指令时进入该模式,用于支持通过软件仿真硬件的协处理器

系统模式(System, sys)

用于运行特权级的操作系统任务

ARMv8-A架构还有Monitor(mon)工作模式,用于处理器安全状态与非安全状态的切换,Hypervisor(hyp)模式则用于对虚拟化有关功能的支持。有关安全状态的详细内容在后续的文章中会介绍。

二、结语

本小节中我们简要介绍了有关ARMv8-A架构中操作系统里常用的寄存器的使用情况,需要注意的是寄存器的使用与处理器的异常级别也是息息相关的。我们将在下一期介绍ARMv8-A架构的异常级别。


引用

[1]ARM® Architecture Reference ManualARMv8, for ARMv8-A architectureprofile

[2]https://www.cnblogs.com/smartjourneys/p/6845078.html

[3]https://baike.baidu.com/item/SIMD/3412835?fr=aladdin

[4]http://www.lujun.org.cn/?p=1676

[5]https://www.cnblogs.com/pengdonglin137/p/10259971.html

[6]https://blog.csdn.net/layuetian2011/article/details/52039328

[7]https://blog.csdn.net/allan0508/article/details/52624618

[8]https://blog.csdn.net/myarrow/article/details/9701499

[9]《ARM体系结构与编程(第二版)》,杜春雷主编。

【华为云技术分享】ARM体系结构基础(2)相关推荐

  1. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 1

    前言 以互联网为代表的信息技术的迅猛发展对整个经济体系产生了巨大的影响.信息技术的发展一方面使知识的积累和传播更加迅速,知识爆炸性的增长:另一方面,使信息的获取变得越来越容易,信息交流的强度逐渐增加, ...

  2. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 3

    4. 微观层面 4.1 个体动机 在开源软件发展之初, 商业组织的投入很少甚至没有, 完全是靠Richard Stallman 或者 linus Torvalds 这样的个人在努力推动开源软件艰难前行 ...

  3. 【华为云技术分享】三大前端技术(React,Vue,Angular)探密(下)

    [华为云技术分享]三大前端技术(React,Vue,Angular)探密(上) [Angular] Angular(通常被称为 "Angular 2+"或 "Angula ...

  4. 【华为云技术分享】直播回顾丨激发数据裂变新动能,HDC.Cloud云数据库前沿技术解读

    3月24日14:00-17:00,HDC.Cloud开发者沙龙系列云数据库专场直播线上开启,此次华为云数据库通过三场直播从NoSQL数据库新技术.数据库迁移.行业解决方案等方面对云端数据库进行深度解读 ...

  5. 【华为云技术分享】ARM体系结构基础(1)

    鲲鹏处理器采用ARM架构,欧拉系统可以运行在鲲鹏架构的服务器上,想要了解欧拉操作系统对硬件的支持,首先需要了解一些ARM架构的基础知识.操作系统中硬件相关的部分集中体现在汇编指令和对寄存器的操作中,因 ...

  6. 【华为云技术分享】为什么越来越多企业正在往ARM平台迁移?

    架构变迁 说到CPU架构,我们可能必然会提到CISC(复杂指令集,比如桌面端采用的X86系列)和RISC(精简指令集,比如移动端广泛采用的ARM系列).理论上,RISC 相比于 CISC(Intel ...

  7. 【华为云技术分享】从 Cloud 1.0 到 2.0,云计算的“多元架构命题”

    今天,我们处于 Cloud 2.0 时代.1.0 时代,企业接触云计算,开始上云:2.0 时代,企业云化加深,核心业务上云.然而,在 2.0 时代,我们看到云计算正在进入多元架构时代. 什么是多元架构 ...

  8. 【华为云技术分享】解析:物联网数据分析服务如何做?

    [摘要] 物联网设备正在产生大量的数据,如何为开发者提供简单有效的数据分析服务,简化开发过程,提升开发效率,让IoT数据快速变现是一个摆在我们面前的问题. 没有疑问,我们已经身处物联网时代了,每天都有 ...

  9. 【华为云技术分享】AI 开发路漫漫,什么才是真正的极客精神?

    摘要:AI开发看上去很美,实践起来却不是一件容易的事.一个聪明的开发者知道借助工具提升开发效率,一个智能的平台则会站在开发者的立场,为用户提供贴心服务. "理想很丰满,现实很骨感." ...

最新文章

  1. 拼多多二面:Mybatis是如何执行一条SQL命令的?
  2. Sql Server中Case函数的使用(上篇)----转载
  3. hashmap java 便利_java遍历HashMap的高效方法
  4. java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher
  5. 漫话:是时候说说到底什么是 IPv4 和 IPv6 了!
  6. pyspark指定schema
  7. ApplicationContext.xml配置文件
  8. fisco bcos transaction交易结构 源代码位置
  9. idea的文件可以mysql运行吗,终于将tiny-sdpm+intellij idea+mysql+jettyt运行成功
  10. Spring核心框架体系结构
  11. boost库中thread多线程中的thread_specific_ptr
  12. 计算机打开管理闪退,win10任务管理器闪退怎么解决-解决win10任务管理器闪退的方法 - 河东软件园...
  13. 定了!AI视觉泰斗朱松纯教授归国就任北大人工智能研究院院长
  14. Python:数据导出到Excel(使用xlwt)
  15. ps如何增加可撤回的步数
  16. 机器学习在无线信道建模中的应用现状与展望
  17. 2016年7月17日学习 scratch 小兔子偷胡萝卜的故事
  18. 响应式网站-- css媒体查询 字体大小
  19. 2021年中国百货零售行业发展现状及发展趋势分析:百货店仍是时尚和品质消费的主渠道[图]
  20. 期间成本法与销售成本法

热门文章

  1. 在c语言中利用链表常见问题,C语言,链表中遇到棘手有关问题
  2. isdigit()、isalpha()、isalnum() 三个函数的区别和注意点
  3. sublime text3 插件安装
  4. 自制割接(平滑过滤)实验大全
  5. Android Studio系列教程一--下载与安装
  6. javascript的Foreach语法
  7. VS2008(C#)子页嵌套母版页的控件访问方法(二)
  8. oracle 系统检查点,检查点(Checkpoint)优化及故障排除指南
  9. php b+树,PHP利用b+树概念实现树形数组
  10. 集成电路查询软件_软件著作权登记的法律意义