Cortex-A9 架构

一、Cortex-A 处理器运行模式

Cortex-A9处理器有 9中处理模式,如下表所示:

九种运行模式


在上表中,除了User(USR)用户模式以外,其它8种运行模式都是特权模式,在特权模式下,程序可以访问所有的系统资源。这几个运行模式可以通过软件进行任意切换,也可以通过中断或者异常来进行切换。

大多数的应用程序运行在用户模式,该模式下某些被保护的系统资源是不能被访问的,要想访问这些受限的资源就必须进行模式切换。不过用户模式是不能直接进行切换的,用户模式下需要借助异常来完成模式切换,当要切换模式的时候,应用程序可以产生异常,在异常的处理过程中完成处理器模式切换。

当中断或者异常发生以后,处理器就会进入到相应的异常模式中。每一种异常模式都有一组寄存器供异常处理程序使用,以保证在进入异常模式以后,用户模式下的寄存器不会被破坏。

二、Cortex-A 寄存器组

每一种运行模式都有一组与之对应的寄存器组。本节我们要讲的是 Cortex-A的内核寄存器组,注意不是芯片的外设寄存器。

ARM架构提供了16 个32位的通用寄存器(R0~R15)供软件使用,前15个(R0~R14)可以用作通用的数据存储,R15是程序计数器PC,用来保存将要执行的指令。ARM还提供了一个当前程序状态寄存器CPSR(Current Program Status Register)和一个备份程序状态寄存器SPSR(Saved Program Status Register),SPSR寄存器是CPSR寄存器的备份。这18个寄存器如下图所示:
在这里插入图片描述

Cortex-A 寄存器

Cortex-A的每一种模式可见的寄存器包括15 个通用寄存器(R0~R14)、一个程序状态寄存器和一个程序计数器PC。在这些寄存器中,有些是所有模式共用的同一个物理寄存器,有一些是各模式自己所独立拥有的,各个模式所拥有的寄存器如下图所示:
在这里插入图片描述
九种模式所对应的寄存器

图中浅色字体的是与User模式所共有的寄存器,蓝绿色背景的是各个模式所独有的寄存器。可以看出,在所有的模式中,低寄存器组(R0~R7)是共享同一组物理寄存器的,只是一些高寄存器组在不同的模式有自己独有的寄存器,比如FIQ模式下R8~R14是独立的物理寄存器。假如某个程序在FIQ模式下访问R13寄存器,那它实际访问的是寄存器R13_fiq,如果程序处于SVC模式下访问R13寄存器,那它实际访问的是寄存器R13_svc。可见Cortex-A内核寄存器组成如下:

  1. 34 个通用寄存器,包括 R15 程序计数器(PC),这些寄存器都是 32 位的。
  2. 8 个状态寄存器,包括 CPSR 和SPSR。
  3. Hyp 模式下独有一个 ELR_hyp 寄存器。

1、通用寄存器

R0~R15是通用寄存器,通用寄存器可以分为一下三类:

  1. 未备份寄存器,即R0~R7。
  2. 备份寄存器,即R8~R14。
  3. 程序计数器PC,即R15。

分别来看一下这三类寄存器:

(1)未备份寄存器

未备份寄存器指的是R0~R7这 8个寄存器,因为在所有的处理器模式下这8个寄存器都是同一个物理寄存器,在不同的模式下,这8 个寄存器中的数据就会被破坏。所以这8个寄存器并没有被用作特殊用途。

(2)备份寄存器

备份寄存器中的R8~R12这 5个寄存器有两种物理寄存器,在快速中断模式下(FIQ)它们对应着Rx_irq(x=8~12)物理寄存器,其他模式下对应着Rx(8~12)物理寄存器。FIQ是快速中断模式,看名字就是知道这个中断模式要求快速执行。FIQ模式下中断处理程序可以使用R8~R12寄存器,因为FIQ模式下的R8~R12是独立的,因此中断处理程序可以不用执行保存和恢复中断现场的指令,从而加速中断的执行过程

备份寄存器R13一共有 8个物理寄存器,其中一个是用户模式(User)和系统模式(Sys)共用的,剩下的7个分别对应 7种不同的模式。R13通常用来做为栈指针SP。基本上每种模式都有一个自己的R13物理寄存器,应用程序会初始化R13,使其指向该模式专用的栈地址,这就是常说的初始化SP指针。

备份寄存器R14一共有 7个物理寄存器,其中一个是用户模式(User)、系统模式(Sys)和超级监视模式(Hyp)所共有的,剩下的6个分别对应6种不同的模式。R14也称为链接寄存器(LR,Link Register),LR寄存器在ARM中主要用作如下两种用途:

  1. 每种处理器模式使用R14(LR)来存放当前子程序的返回地址。如果使用BL或者BLX来调用子函数的话,R14(LR)被设置成该子函数的返回地址,在子函数中,将R14(LR)中的值赋给R15(PC)即可完成子函数返回,比如在子程序中可以使用如下代码:
    MOV PC, LR @寄存器 LR 中的值赋值给 PC,实现跳转
    或者可以在子函数的入口处将LR入栈:
    PUSH {LR} @将LR 寄存器压栈
    在子函数的最后面出栈即可:
    POP {PC} @将上面压栈的LR 寄存器数据出栈给 PC 寄存器
  2. 当异常发生以后,该异常模式对应的R14 寄存器被设置成该异常模式将要返回的地址。另外R14也可以当作普通寄存器使用。

(3)程序计数器 R15

程序计数器R15也叫做PC(program counter),在ARM状态下,R15始终指向当前指令之前的八个字节,在Thumb状态下,它始终指向当前指令之前的四个字节,这是因为ARM的流水线机制导致的。ARM处理器3级流水线:取指->译码->执行,这三级流水线循环执行,比如当前正在执行第一条指令的同时也对第二条指令进行译码,第三条指令也同时被取出存放在R15(PC)中。我们喜欢以当前正在执行的指令作为参考点,也就是以第一条指令为参考点,那么R15(PC)中存放的就是第三条指令,换句话说就是R15(PC)总是指向当前正在执行的指令地址再加上2条指令的地址。对于32位的ARM处理器,每条指令是 4个字节,所以:
R15 (PC)值 = 当前执行的程序位置 + 8 个字节

2、程序状态寄存器

所有的处理器模式都共用一个CPSR物理寄存器,因此CPSR可以在任何模式下被访问。CPSR是当前程序状态寄存器,该寄存器包含了条件标志位、中断禁止位、当前处理器模式标志等一些状态位以及一些控制位。所有的处理器模式都共用一个 CPSR必然会导致冲突,为此,除了User和Sys这两个模式以外,其他 7个模式每个都配备了一个专用的物理状态寄存器,叫做SPSR(备份程序状态寄存器),当特定的异常中断发生时,SPSR寄存器用来保存当前程序状态寄存器(CPSR)的值,当异常退出以后可以用SPSR中保存的值来恢复CPSR。

因为User和Sys这两个模式不是异常模式,所以并没有配备SPSR,因此不能在User和Sys模式下访问SPSR,会导致不可预知的结果。由于SPSR是CPSR的备份,因此SPSR和CPSR的寄存器结构相同,如下图所示:
在这里插入图片描述

CSPR 寄存器

  • N(bit31):当两个补码表示的有符号整数运算的时候,N=1表示运算对的结果为负数,N=0表示结果为正数。
  • Z(bit30):Z=1表示运算结果为零,Z=0表示运算结果不为零,对于CMP指令,Z=1表示进行比较的两个数大小相等。
  • C(bit29):在加法指令中,当结果产生了进位,则C=1,表示无符号数运算发生上溢,其它情况下C=0。在减法指令中,当运算中发生借位,则C=0,表示无符号数运算发生下溢,其它情况下C=1。对于包含移位操作的非加/减法运算指令,C为移出值的最后一位,对于其它非加/减运算指令,C位的值通常不受影响。
  • V(bit28):对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出,对于其他的非加/减法运算指令,V的值通常不改变。
  • Q(bit27):在ARMv5及以上版本的E系列处理器中,用Q标志位表示增强的DSP运算指令是否发生了溢出,在其他版本的处理器中,Q标志位无意义。
  • IT[1:0](bit26:25):和IT[7:2](bit15:bit10)一起组成IT[7:0],作为IF-THEN指令执行状态。
  • J(bit24):仅ARM_v5TE-J架构支持,J=1表示处于Jazelle状态,此位通常和T(bit5)位一起表示当前所使用的指令集,如下表所示:
指令类型

在这里插入图片描述

  • GE[3:0](bit19:16):SIMD指令有效,大于或等于。
  • IT[7:2](bit15:10):参考IT[1:0]。
  • E(bit9):大小端控制位,E=1表示大端模式,E=0表示小端模式。
  • A(bit8):禁止异步中断位,A=1表示禁止异步中断。
  • I(bit7):I=1禁止IRQ,I=0使能IRQ。
  • F(bit6):F=1禁止FIQ,F=0使能FIQ。
  • T(bit5):控制指令执行状态,表明本指令是ARM指令还是Thumb指令,通常和J(bit24)一起表明指令类型,参考J(bit24)位。
  • M[4:0]:处理器模式控制位,含义如下表所示:
处理器模式位

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149025.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在openwrt dnsmasq DHCP中为客户端分配不同的网关和DNS | 旁路由 禁止上网

环境:openwrt dnsmasq PS4/Switch 问题:为路由器下的设备分配不同的网关和DNS,禁止局域网设备上网 解决办法:修改dnsmasq配置文件 背景:Openwrt 的DHCP服务是使用dnsmasq实现的,他可以给内网的客户端设备…

网络安全工程师考证指南,不看就亏了!!

目前网络安全行业,国内都有哪些证书可以考? 一、CISP-PTE (国家注册渗透测试工程师) CISP-PTE即注册信息安全渗透测试工程师,该证书由中国信息安全测评中心颁发,证书是国内唯一认可的渗透测试认证&#x…

el-menu 导航栏学习(1)

最简单的导航栏学习跳转实例效果: (1)index.js路由配置: import Vue from vue import Router from vue-router import NavMenuDemo from /components/NavMenuDemo import test1 from /components/test1 import test2 from /c…

Redis中Hash类的操作

Redis中Hash类型是键值对的形式保存数据,其中键被称为字段(field),值称为字段值(value)。在一个key中,字段不能重复,而值可以重复。无论是字段还是值都是无序的(保存的次…

mysql双主+双从集群连接模式

架构图: 详细内容参考: 结果展示: 178.119.30.14(主) 178.119.30.15(主) 178.119.30.16(从) 178.119.30.17(从)

添加驱动模块到内核的两种方法

添加驱动模块到内核的两种方法 1. 放在内核源代码树中 步骤总结: 新建文件夹编写Makefile、编写Kconfig修改上层Kconfig执行make menuconfig执行make zImage 或 make modules 1.1 源码放入文件夹 例如:添加一个按键字符设备模块 在内核目录下的 dri…

【推荐系统】多任务学习模型

介绍一些多任务学习模型了解是如何处理多任务分支的。 ESSM, Entire Space Multi-Task Model 阿里提出的ESSM全称Entire Space Multi-Task Model,全样本空间的多任务模型,有效地解决了CVR建模(转化率预估)中存在的两个非常重要…

MATLAB中plot3函数用法

目录 语法 说明 向量和矩阵数据 表数据 其他选项 示例 绘制三维螺旋图 绘制多个线条 使用矩阵绘制多个线条 指定等间距刻度单位和轴标签 将点绘制为不带线的标记 自定义颜色和标记 指定线型 在绘图后修改线条 绘制表中的数据 在 x 和 y 轴上绘制多个表变量 指…

10.2 调试事件获取DLL装载

理解了如何通过调试事件输出当前进程中寄存器信息,那么实现加载DLL模块也会变得很容易实现,加载DLL模块主要使用LOAD_DLL_DEBUG_EVENT这个通知事件,该事件可检测进程加载的模块信息,一旦有新模块被加载或装入那么则会触发一个通知…

Qt扫盲-QSqlTableModel理论总结

QSqlTableModel理论总结 一、概述二、使用1. 与 view 视图绑定2. 做中间层,不显示 三、常用函数 一、概述 QSqlTableModel是用于从单个表读写数据库记录的高级接口。它构建在较低级的QSqlQuery之上,可用于向QTableView 等视图类提供数据。这个主要是对单…

苹果V3签名是什么?优势是什么?什么场合需要应用到?该怎么部署?

v3签名,或称为Apple Developer Program v3签名,是苹果公司在2021年6月推出的一种签名格式,用于对应用程序进行签名和验证。 它是取代了之前的v2签名格式,用于增强应用程序的安全性和完整性。 v3签名能够做到以下几点:…

【Linux基础】Linux发展史

👉系列专栏:【Linux基础】 🙈个人主页:sunny-ll 一、前言 本篇主要介绍Linux的发展历史,这里并不需要我们掌握,但是作为一个合格的Linux学习者与操作者,这些东西是需要了解的,而且…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(五)

思维导图 Bom操作 一、Window对象 1.1 BOM(浏览器对象模型) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"vi…

k8s集群-6(daemonset job cronjob控制器)

Daemonset 一个节点部署一个节点 当有节点DaemonSet 确保全部 (或者某些) 节点上运行一个 Pod 的副本。加入集群时&#xff0c;也会为他们新增一个 Pod 。当有节点从集群移除时&#xff0c;这些Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 DaemonSet 的典型用…

Boost程序库完全开发指南:1.1-C++基础知识点梳理

主要整理了N多年前&#xff08;2010年&#xff09;学习C的时候开始总结的知识点&#xff0c;好长时间不写C代码了&#xff0c;现在LLM量化和推理需要重新学习C编程&#xff0c;看来出来混迟早要还的。 1.shared_ptr 解析&#xff1a;shared_ptr是一种计数指针&#xff0c;当引…

数字电路逻辑与设计 之循环码和 移存码

有发现错误的能力&#xff0c;不能纠正 只能检查单次的错误&#xff0c;不能完全抗干扰 可以按照上面的方法来循环构造 移存码可以通过前推后推来实现

pycharm配置python3.8版本专门用于undecteded_chromedriver测试

pycharm配置python3.8版本专门用于undecteded_chromedriver测试 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://pay.xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、Pycharm及python环境的配置 1.安装python-3.8.7rc1-amd64.e…

MySQL进阶_3.性能分析工具的使用

文章目录 第一节、数据库服务器的优化步骤第二节、查看系统性能参数第三节、 慢查询日志第四节、 查看 SQL 执行成本第五节、 分析查询语句&#xff1a;EXPLAIN5.1 基本语法5.2 EXPLAIN各列作用 第一节、数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;可…

十三、Django之添加用户(原始方法实现)

修改urls.py path("user/add/", views.user_add),添加user_add.html {% extends layout.html %} {% block content %}<div class"container"><div class"panel panel-default"><div class"panel-heading"><h3 c…

全志ARM926 Melis2.0系统的开发指引①

全志ARM926 Melis2.0系统的开发指引① 1. 编写目的2. Melis2.0 系统概述3. Melis2.0 快速开发3.1. Melis2.0 SDK 目录结构3.2. Melis2.0 编译环境3.3. Melis2.0 固件打包3.4. Melis2.0 固件烧录3.5.串口打印信息3.6. Melis2.0 添加和调用一个模块3.6.1. 为什么划分模块&#xf…