ARM体系结构

阅读引言: arm架构处理器的基本知识已在上一篇文章中描述过了, 本文将会从arm的存储模型、异常机制、工作模式、指令集、流水线、arm的寄存器组织方面去描述。

目录

一、ARM处理器概论

1.指令集概述

2.指令分类

3.编译流程

二、ARM的存储模型

1.ARM数据类型

2.字节序

三、ARM工作模式

1.arm有8个基本工作模式

2.不同工作模式的理解

3.ARM工作模式分类

四、ARM寄存器组织

1.寄存器概念

2.ARM寄存器

3.专用寄存器

五、ARM的异常处理

1.异常的概念

2.异常处理机制的概念

3.ARM异常源

4.异常模式

5.ARM异常处理流程

6.异常优先级

7.为什么FIQ比IRQ块

六、ARM微架构和指令流水线


一、ARM处理器概论

1.指令集概述

指令:

    能够指示处理器执行某种运算的命令称为指令(如加、减、乘 ...)

    指令在内存中以机器码(二进制)的方式存在

    每一条指令都对应一条汇编

    程序是指令的有序集合

指令集:

    处理器能识别的指令的集合称为指令集

    不同架构的处理器指令集不同

指令是cpu提供给开发人员的一个接口。

2.指令分类

arm指令:

    所有指令(机器码)都占用32bit存储空间                              

    代码灵活度高、简化了解码复杂度

    执行ARM指令集时PC值每次自增4

thumb指令:

    所有指令(机器码)都占用16bit存储空间

    代码密度高、节省存储空间

    执行Thumb指令集时PC值每次自增2

 Thumb-2指令集:

M3/M4使用的就是该指令集, 集成了Thumb指令集的存储空间小, ARM指令集合的强大, 基于arm指令的拓展。

3.编译流程

机器码(二进制)是处理器能直接识别的语言,不同的机器码代表不同的运算指令,处理器能够识别哪些机器码是由处理器的硬件设计所决定的,不同的处理器机器码不同,所以机器码不可移植

 汇编语言是机器码的符号化,即汇编就是用一个符号来代替一条机器码,所以不同的处理器汇编也不一样,即汇编语言也不可移植

 C语言在编译时我们可以使用不同的编译器将C源码编译成不同架构处理器的汇编,所以C语言可以移植

不同的编译器将c语言编译成对应类型的cpu的指令

二、ARM的存储模型

1.ARM数据类型

基本数据类型:

    Byte               

              

             

 8bits
    Halfword  16bits
  Word     32bits

数据存储:

    Word型数据在内存的起始地址必须是4的整数倍

    Halfword型数据在内存的起始地址必须是2的整数倍

注:即数据本身是多少位在内存存储时就应该多少位对齐

字节对齐目的是高效的访问内存

2.字节序

 大端:低地址存放高位,高地址存放低位,  

小端: 低地址存放低位,高地址存放高位,

注:ARM一般使用小端对齐, 网络中使用大端字节序, 小端方便计算, 大端方便速识别

三、ARM工作模式

1.arm有8个基本工作模式

User      非特权模式,一般在执行上层的应用程序时ARM处于该模式

FIQ          当一个高优先级中断产生后ARM将进入这种模式

IRQ         当一个低优先级中断产生后ARM将进入这种模式

SVC         当复位或执行软中断指令后ARM将进入这种模式

Abort          当产生存取异常时ARM将进入这种模式

Undef         当执行未定义的指令时ARM将进入这种模式

System         使用和User模式相同寄存器集的特权模式, 权限更高

Monitor 为了安全而扩展出的用于执行安全监控代码的模式

2.不同工作模式的理解

不同模式拥有不同权限 、不同模式执行不同代码、 不同模式完成不同的功能

3.ARM工作模式分类

按照权限分类:

    User为非特权模式(权限较低),其余模式均为特权模式(权限较高)

权限低:防止我们修改操作系统, 破环操作系统的运行

按照状态: 

    FIQ、IRQ、SVC、Abort、Undef属于异常模式,即当处理器遇到异常后

会进入对应的模式

四、ARM寄存器组织

1.寄存器概念

概念:

    寄存器是处理器内部的存储器,没有地址, 在C语言中的一种存储类型, 在cpu内部存储, 不能取地址

作用:

    一般用于暂时存放参与运算的数据和运算结果

分类:

    包括通用寄存器、专用寄存器、控制寄存器

2.ARM寄存器

不同的处理器内部的寄存器的数量不同, 40个cortex A9

注:在某个特定模式下只能使用当前模式下的寄存器,一个模式下特有的寄存器其他模式下不可使用

3.专用寄存器

pc寄存器:

    程序计数器,用于存储当前取址指令的地址

lr链接寄存器:

    链接寄存器,一般有以下两种用途:

    > 执行跳转指令(BL/BLX)时,LR会自动保存跳转指令下一条指令的地址

      程序需要返回时将LR的值复制到PC即可实现

    > 产生异常时,对应异常模式下的LR会自动保存被异常打断的指令的下

      一条指令的地址,异常处理结束后将LR的值复制到PC可实现程序返回

sp:

    栈指针,用于存储当前模式下的栈顶地址, 每存储一个变量, 栈指针自动移动到下一个位置, 为存储下一个变量做好准备

当前程序状态寄存器(cpsr):

CPSR寄存器分为四个域,[31:24]为条件域用F表示、[23:16]为状态域用S表示、[15:8]为预留域用X表示、[8:0]为控制域用C表示

Bit[4:0]

    [10000]User    [10001]FIQ     [10010]IRQ     [10011]SVC

    [10111]Abort   [11011]Undef   [11111]System  [10110]Monitor

ARM有两个状态:arm状态和thumb状态

 Bit[5]

    [0]ARM状态     [1]Thumb状态

 Bit[6]

    [0]开启FIQ     [1]禁止FIQ                   //两种不同等级的中断优先级

 Bit[7]

    [0]开启IRQ     [1]禁止IRQ

Bit[28]

    > 当运算器中进行加法运算且产生符号位进位时该位自动置1,否则为0                 //借位和进位影响到了符号位

    > 当运算器中进行减法运算且产生符号位借位时该位自动置0,否则为1

 Bit[29]

    > 当运算器中进行加法运算且产生进位时该位自动置1,否则为0

    > 当运算器中进行减法运算且产生借位时该位自动置0,否则为1

 Bit[30]

    当运算器中产生了0的结果该位自动置1,否则为0

 Bit[31]

    当运算器中产生了负数的结果该位自动置1,否则为0

五、ARM的异常处理

1.异常的概念

 处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生,  这时处理器就要将当前的程序暂停下来转而去处理这个异常的事件,异常事件处理完成之后再返回到被异常打断的点继续执行程序

2.异常处理机制的概念

    不同的处理器对异常的处理的流程大体相似,但是不同的处理器在具体实现的机制上有所不同;比如处理器遇到哪些事件认为是异常事件遇到异常事件之后处理器有哪些动作、处理器如何跳转到异常处理程序如何处理异常、处理完异常之后又如何返回到被打断的程序继续执行等我们将这些细节的实现称为处理器的异常处理机制

3.ARM异常源

概念:  导致异常产生的事件称为异常源

| 中断类型                   | 描述                           |
|--------------------------|------------------------------  -|
| FIQ                        | 快速中断请求引脚有效           |
| IRQ                        | 外部中断请求引脚有效           |
| Reset                      | 复位电平有效                  |
| Software Interrupt         | 执行swi指令                   |
| Data Abort                 | 数据终止                      |
| Prefetch Abort             | 指令预取终止                  |
| Undefined Instruction      | 遇到不能处理的指令            |

4.异常模式

异常模式:在ARM的基本工作模式中有5个属于异常模式,即ARM遇到异常后会切换成对应的异常模式

5.ARM异常处理流程

ARM产生异常后的动作(自动完成)

    1.拷贝CPSR中的内容到对应异常模式下的SPSR_<mode>                #备份

    2.修改CPSR的值                                                                          #修改成对应的异常模式

2.1.修改中断禁止位禁止相应的中断

2.2.修改模式位进入相应的异常模式产生异常

        2.3.修改状态位进入ARM状态

    3.保存返回地址到对应异常模式下的LR_<mode>

    4.设置PC为相应的异常向量(异常向量表对应的地址)

异常向量表: 

异常向量表

    > 异常向量表的本质是内存中的一段代码

    > 表中为每个异常源分配了四个字节的存储空间

    > 遇到异常后处理器自动将PC修改为对应的地址

    > 因为异常向量表空间有限一般我们不会再这里

      写异常处理程序,而是在对应的位置写一条跳

      转指令使其跳转到指定的异常处理程序的入口

    注:ARM的异常向量表的基地址默认在0x00地址

        但可以通过配置协处理器来修改其地址

异常返回: 

 ARM异常返回的动作(自己编写)

    1.将SPSR_<mode>的值复制给CPSR

      使处理器恢复之前的状态

    2.将LR_<mode>的值复制给PC

      使程序跳转回被打断的地址继续执行

6.异常优先级

多个异常同时产生时的服务顺序

7.为什么FIQ比IRQ块

六、ARM微架构和指令流水线

取指、译码、执行。

ARM指令流水线

    ARM7采用3级流水线

    ARM9采用5级流水线

    Cortex-A9采用8级流水线

    注1:虽然流水线级数越来越多,但都是在三级流水线的基础上进行了细分

PC的作用(取指)

    不管几级流水线,PC指向的永远是当前正在取指的指令,而当前正在执行 的指令的地址为PC-8, 译码器这里减4 执行这里也是4

指令流水线机制的引入确实能够大大的提升指令执行的速度但在实际执行程序的过程中很多情况下流水线时是无法形成的比如芯片刚上电的前两个周期、执行跳转指令后的两个周期等所以指令流水线的引入以及优化只能使平均指令周期不断的接近1而不可能真正的达到1,且流水线级数越多芯片设计的复杂程度就越高,芯片的功耗就越高

多核处理器:

    即一个SOC(system on chip)中集成了多个CPU核

 作用:

    不同的线程可以运行在不同的核心中  做到真正的并发运行,

 资源:

    多核处理器共用外设与接口资源

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电商技术揭秘七:搜索引擎中的SEO关键词策略与内容优化技术

文章目录 引言一、关键词策略1.1 关键词研究与选择1. 确定目标受众2. 使用关键词研究工具3. 分析搜索量和竞争程度4. 考虑长尾关键词5. 关键词的商业意图6. 创建关键词列表7. 持续监控和调整 1.2 关键词布局与密度1. 关键词自然分布2. 标题标签的使用3. 首次段落的重要性4. 关键…

C# 分布式自增ID算法snowflake(雪花算法)

文章目录 1. 概述2. 结构3. 代码3.1 IdWorker.cs3.2 IdWorkerTest.cs (测试) 1. 概述 分布式系统中&#xff0c;有一些需要使用全局唯一ID的场景&#xff0c;这种时候为了防止ID冲突可以使用36位的UUID&#xff0c;但是UUID有一些缺点&#xff0c;首先他相对比较长&#xff0c…

pyside6怎么使用Qt Designer设计自定义组件

第一步&#xff0c;新建一个自定义组件的python文件 from PySide6.QtWidgets import QPlainTextEdit from PySide6.QtCore import Signal,Qtclass CustomPlainTextEdit(QPlainTextEdit):enterPressed Signal(str)def __init__(self, parentNone):super().__init__(parent)def…

Vue+node.js蔬菜水果农产品网上商城管理系统

用户能够及时掌握最新的数据&#xff0c;并能有效地提升用户的服务水平。本制度的优势在于&#xff1a; &#xff08;1&#xff09;该系统将蔬菜信息及时地提供给使用者。使用者可以在任何时候登陆该网站查询相关资讯&#xff0c;所有资讯均真实可信&#xff0c;并严肃处理各项…

161 Linux C++ 通讯架构实战15,线程池代码分析

线程池应该使用的地方 和 epoll 技术结合 线程池代码处理数据的地方。 线程池分析&#xff1a; 线程池代码1 threadpool_create //Tencent8888 start threadpool_create函数的目的初始化线程池&#xff0c;对应的struct是 threadpool_t /* 1.先malloc整个线程池的大小 2.这里…

牛客 2024春招冲刺题单 ONT98 牛牛猜节点【中等 斐波那契数列 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/6a3dfb5be4544381908529dc678ca6dd 思路 斐波那契数列参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规…

Unity与CocosCreator对比学习二

一、锚点与适配 1.在Creator中 适配通过锚点、位置和Widget达到适配目的&#xff1b;锚点是节点在其父节点坐标系中坐标对其点&#xff0c;其x,y范围在[0, 1]之间&#xff1b; 锚点为(0, 0)时在节点自身的左下角&#xff0c;节点坐标指其左下角在父节点中的坐标&#xff1b;锚…

贪心算法|53.最大子序和

力扣题目链接 class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) {result count;}if (count < 0) count 0;}return result;} …

[AIGC] Spring Filter 过滤器详解

什么是Spring Filter 在Web应用中&#xff0c;Filter&#xff08;过滤器&#xff09;是在Java Servlet规范中的一种组件&#xff0c;它的主要目的是对HTTP请求或者响应进行处理。Spring Filter则是Spring框架对Java原生Filter的封装版本和扩展。 简单来说&#xff0c;Spring …

物联网实战--驱动篇之(二)Modbus协议

目录 一、modbus简介 二、功能码01、02 三、modbus解析 四、功能码03、04 五、功能码05 六、功能码06 七、功能码16 一、modbus简介 我们在网上查阅modbus的资料发现很多很杂&#xff0c;modbus-RTU ASCII TCP等等&#xff0c;还有跟PLC结合的&#xff0c;地址还分1开…

如果在 Ubuntu 系统中两个设备出现两个相同的端口号解决方案

问题描述&#xff1a; 自己的移动机器人在为激光雷达和IMU配置动态指定的端口时&#xff0c;发现激光雷达和深度相机配置的 idVendor 和 idProduct 相同&#xff0c;但是两个设备都具有不同的ttyUSB号&#xff0c;如下图所示 idVendor&#xff1a;代表着设备的生产商ID,由USB设…

并查集学习(836. 合并集合 + 837. 连通块中点的数量)

//得先加集合个数再合并&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 核心代码&#xff1a; int find(int x){//返回父节点if(x ! p[x]) {p[x] find(p[x]);//路径压缩 } //孩子不等于爸爸&#xff0c;就…

springboot+vue学生宿舍物品存放系统tnozt

需求包括&#xff1a; 三个角色&#xff1a;学生&#xff0c;公寓管理员&#xff08;宿舍管理人员&#xff09;&#xff0c;系统管理员。 本系统基于java语言&#xff0c;结合数据库技术&#xff0c;通过面向对象的设计方法&#xff0c;实现学生信息管理、公寓信息管理、物品存…

STM32外部中断编程相关

一&#xff0c;Nested vectored interrupt controller NVIC即嵌套向量中断控制器&#xff0c;它是内核的器件&#xff0c;M3内核都是支持256个中断&#xff0c;其中包含了16系统中断和240个外部中断&#xff0c;并且具有256级的可编程中断设置。芯片厂商一般不会把内核的这些资…

假期别闲着:REST API实战演练之创建Rest API

1、创建实体类&#xff0c;模拟实体对象 创建一个类&#xff0c;模拟数据数据库来存储数据&#xff0c;这个类就叫Person。 其代码如下&#xff1a; package com.restful;public class Person {private String name;private String about;private int birthYear;public Perso…

MacOS下载和安装HomeBrew的详细教程

在MacOS上安装Homebrew的详细教程如下&#xff1a;&#xff08;参考官网&#xff1a;macOS&#xff08;或 Linux&#xff09;缺失的软件包的管理器 — Homebrew&#xff09; 步骤1&#xff1a;检查系统要求 确保你的MacOS版本至少为macOS Monterey (12) (or higher) 或更高版本…

C语言程序编译全流程,从源代码到二进制

源程序 对于一个最简单的程序&#xff1a; int main(){int a 1;int b 2;int c a b;return 0; }预处理 处理源代码中的宏指令&#xff0c;例如#include等 clang -E test.c处理结果&#xff1a; # 1 "test.c" # 1 "<built-in>" 1 # 1 "&…

【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历

先序遍历&#xff1a;根-左-右中序遍历&#xff1a;左-根-右后序遍历&#xff1a;左-右-根 94. 二叉树的中序遍历 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3…

【ControlNet v3版本论文阅读】

网络部分最好有LDM或者Stable Diffusion的基础&#xff0c;有基础的话会看的很轻松 Abstract 1.提出了一种网络结构支持额外输入条件控制大型预训练的扩散模型。利用预训练模型学习一组不同的条件控制。 2.ControlNet对于小型&#xff08;<50k&#xff09;或大型&#xff…

vue项目使用element ui

目录 1、创建一个vue项目 2、找到element官网&#xff0c;点击指南&#xff0c;找到安装栏 3、 找到使用包管理器&#xff0c;复制命令 4、在main.js中引入element 5、使用element ui 6、找到App.vue&#xff0c;导入Button.vue文件&#xff0c;保存启动项目 1、创建一个vu…