10 ARM 体系

news2024/11/14 14:56:26

10 ARM 体系

  • ARM体系
  • 1、基本概念
    • 1.1 常见的处理器
    • 1.2 ARM7三级指令流水线
    • 1.3 初识PC寄存器
  • 2、 ARM核的七种工作模式
  • 3、ARM核七种异常

ARM体系

1、基本概念

1.1 常见的处理器

PowerPC处理器:飞思卡尔MPC系列
DSP:TI达芬奇系列
FPGA:Xilinx赛灵思的ZYNQ系列
ARM:消费类电子:高通,华为,全志
汽车电子:飞思卡尔
网络:博通,Mavell
工控:Atmel
单片机:51,msp430,stm32(低端ARM处理器)

1.2 ARM7三级指令流水线

  • 概念:
    流水线:目的提高运算处理的能力
    指令:给CPU下发的命令,CPU根据不同的命令做不同的数据运算,存在于编译好的二进制可执行文件中,并且是一条一条指令堆积而成,如果将二进制可执行文件下载到内存中运行,那么每条指令必然有对应的内存存储地址,例如:tftp 0x48000000 shell.bin,那么第一条指令的起始地址就是0x48000000
    问:后续的指令,例如第二条指令他们的地址分别是多少呢?
    答:这与ARM处理器的工作状态有关系,ARM有两种工作状态:
    ARM状态:每条指令的长度是4字节大小,也就是说将来每条指令占用4字节内存大小,所有后续的指令地址依次加4,例如:第二条指令的首地址就是0x48000004
    Thumb状态:每条指令的长度是2字节大小,也就是说将来每条指令占用2字节内存大小,所有后续的指令地址依次加2,例如:第二条指令的首地址就是0x48000002
    所以每当go 0x48000000,那么CPU就会跑到0x48000000这个地址取出每条指令挨个运行!所谓的三级指令流水线就是CPU核处理一条指令不会一次性处理完毕,而是分成三步骤来处理!
  • 三步骤:
    • 取指F:CPU核内部的取指器硬件单元从内存中获取指令
    • 解码D:由CPU核内部的解码器硬件单元对指令进行翻译,翻译成CPU能够识别的命令
    • 执行E:CPU核正式处理该指令
      在这里插入图片描述

1.3 初识PC寄存器

PC寄存器是ARM核内部的一个寄存器,也是用来暂存数据, 此寄存器永远只能存储当前要取的那条指令的内存地址
例如:前提是ARM核处于ARM状态
内存存储地址 指令
0x8000 add加法指令
0x8004 sub减法指令
0x8008 and位与指令
注意:CPU核处理是从上往下跑
当取add这条指令时,PC寄存器的值=0x8000
问:当add指令执行的时候,PC寄存器的值=0x8008

2、 ARM核的七种工作模式

工作模式切换场景
SVC管理模式系统复位或者代码调用swi/svc指令
FIQ中断模式外设给CPU核发送FIQ中断电信号
IRQ中断模式外设给CPU核发送IRQ中断电信号
Abort中止模式取指F失败(指令没有)或者访问M失败(地址无权限)
Undef未定义指令模式CPU处理一个不认识的指令,例如:lisi
System系统模式/User用户模式一般应用程序正常运行时,CPU就是处于User用户模式

在这里插入图片描述

ARM寄存器总共有37个,每个寄存器大小为32位,4字节,又细分为31个通用寄存器和6个程序状态寄存器;
31个通用寄存器的名称:r0,r1,r2…r15不区分大小写
其中:
r13又称sp:永远只能保存栈指针
r14又称lr:永远只能保存返回地址(bl指令和中断)
r15又称pc:永远只能存储取指器要取的那条指令的内存存储地址
r0,r1…r12:剩余寄存器随意存储数据
6个程序状态寄存器又分:
1个cpsr:保存当前程序运行的状态信息
5个spsr:备份cpsr的值,保存cpsr,分别是:spsr_svc,spsr_undef,spsr_irq,spsr_fiq,spsr_abort

在这里插入图片描述

3、ARM核七种异常

明确:异常:并不是所有的异常都是不好的,有问题的,有些异常非常棒非常好,当然了有些异常很糟糕!
前提:假设CPU一开始在0x48000000这个内存地址运行(go 0x48000000),就在此时此刻触发以下异常:

异常CPU核要切换到的模式CPU核立马要跳转到的地址触发场景
复位异常SVC管理模式0x00系统复位
Undef未定义指令异常Undef未定义指令模式0x04CPU核执行一个非法指令
软中断异常SVC管理模式0x08代码调用swi/svc指令
取指异常Abort终止模式0x0C取指F失败
数据处理异常Abort终止模式0x10访存M失败
IRQ中断异常IRQ中断模式0x18外设给CPU核发送IRQ中断
FIQ中断异常FIQ中断模式0x1C外设给CPU核发送FIQ中断
ARM核异常处理的流程
明确:CPU核一旦触发异常,必须立马处理异常
前提:一开始CPU核很安静的执行一个QT程序,突然CPU核触发了某种异常,CPU核一旦触发异常,立马开启异常的处理:
首先CPU核硬件上自动做四件事:
1.备份当前被打断的QT程序的cpsr到要切换到的模式下的spsr,即:spsr_mode=cpsr
2.设置cpsr
bit\[4:0\]=xxxxx 表示设置CPU核将来要切换到的工作模式对应的模式位的值,实现工作模式的切换
bit\[5\]=0,强制CPU核切换到ARM状态
bit\[6\]=1,禁止CPU核以后响应FIQ中断信号
bit\[7\]=1,禁止CPU核以后响应IRQ中断信号

3.保存返回地址到要切换到的工作模式下的lr寄存器中(异常处理完毕将来还要回来的,所以要保存返回地址啊)
即:lr_mode = pc - 4 (硬件自动将pc的值减4保存到lr_mode中,注:mode表示要切换到的工作模式,pc此时还在QT程序中)
问:为何pc-4呢?
答:
此时CPU还在QT中运行,对应的汇编代码如下:
指令 内存地址
add 0x48000000
sub 0x48000004
and 0x48000008
… …
当CPU核执行add时,触发了某种异常,CPU核势必要处理异常,将来处理完毕异常还要进行返回,重新返回到QT程序中运行,只需要返回到sub指令即可继续向下运行,也就是只需将sub指令的地址保存到lr_mode中即可:
lr_mode=0x48000004=pc-4=0x48000008 - 4
4.设置pc为某个异常处理的入口地址,即:pc=0x00/0x04/0x08/0x0c/0x10/0x18/0x1c
切记:只要给pc赋值,就是让CPU核立马跑到这个地址去运行指令,就是取指运行
例如:pc=0x1c,就是让CPU核跑到0x1C地址去取指运行指令
pc=uart_init(函数名就是函数的首地址),就是让CPU核跑到uart_init函数去执行
只要咱们前期在这些异常的处理入口地址的地方埋伏好相关的代码,不就是让CPU核继续执行咱们埋伏好的代码吗?这不就是开启了软件进一步处理异常的流程了吗?
例如:触发一个IRQ中断,此时CPU核就会跑到0x18地址去运行埋伏好的代码!
开启软件进一步处理异常,同样四步骤:
1.提前建立异常向量表
问:如何在七种异常的入口地址放置(埋伏)或者关联对应的软件代码呢?
答:目的是将来异常发生,最终让CPU核能够执行处理到对应的异常处理代码,关联的方法就是通过链接器(arm…ld)搞定,链接器在链接的时候就是从文件的开头依次向下,会给每条指令都指定一个地址,见一条指令一个地址,见一条指令一个地址

vim start.s
.text @告诉链接器,代码段从这里开始
.code 32 @汇编指令采用的时arm
.global _start @ global:声明一个全局函数
_start:
	b    reset @b指令的功能不带返回的跳转指令(一去不复返),跳转到reset标签继续运行
	b    undef_function
	b    svc_function
	b    fetch_abort_function
	b    data_abort_function
	b    . @ b . 表示死循环
	b    irq_function
	b    fiq_function
reset: @reset标签相关代码
	mov  r0, #0
	...
undef_function:
	mov r1, #1
	...
...
irq_function:
	mov  r0, #0
	mov  r1, #1
	mov  r2, #2
	bl do_irq
...

交叉编译:

arm...as -c -o start.o start.s //用汇编器将汇编文件生成目标文件start.o
arm...ld ... -Ttext=0x00 -o start.elf start.o //链接,注:代码段从0x00地址开始链接
链接的结果是:
地址	指令
0x00	b    reset
0x04	b    undef_function
0x08	b    svc_function
0x0c	b    fetch_abort_function
0x10	b    data_abort_function
0x14	b    . @占坑
0x18	b    irq_function
0x1c	b    fiq_function
...

例如:将来外设UART控制器给CPU核发送一个IRQ中断信号,最终CPU核跑到0x18地址不就是运行,咱们埋伏好的代码:b irq_function这条指令嘛,最终去执行irq_function标签里面的各种代码,开启软件处理IRQ中断异常的流程
结论:最终形成了8行2列的表格,此表又称异常向量表!
2.保护现场
一旦CPU核跑到异常入口地址执行对应的指令(b xxxxx),此指令对应的标签(xxx_function)对应的代码中首先要做保护现场的工作
问:为何要保护现场呢?
答:概念:就是将被打断的程序(例如QT程序)使用的ARM寄存器(r0~r15)的数据备份保存到栈(就是内存)中,保护现场又称压栈保护(push stack)
举例子阐述为何要备份:
一开始CPU核很安静的执行QT程序(运行的地址例如0x48000000),并且QT程序的汇编代码如下:
mov r0, #100
mov r1, #101
mov r2, #102

此时此刻突然UART控制器给CPU核发送一个IRQ中断信号,立马触发IRQ中断异常,CPU核最终跑到0x18地址运行: b irq_function这条指令,而这条指令最终跳转到irq_function标签继续运行,而这个标签里面的汇编代码如下:
irq_function:
mov r0, #0
mov r1, #1
mov r2, #2

显然IRQ中断处理的汇编代码把原先QT程序使用的ARM寄存器值进行了修改,将来CPU核再回到QT程序继续运行时势必出错,所以CPU核执行irq_function标签的代码的时候首先做的第一件事就是保护现场,把QT程序使用的ARM寄存器值r0=100…备份到内存中,将来IRQ中断处理代码随意修改,不怕了,反正有备份!
最终:irq_function标签的代码如下:

irq_function:
	@1.先保护现场,然后后面对ARM寄存器为所欲为
	mov  r0, #0
	mov  r1, #1
	mov  r2, #2
	....

3.一旦现场保护完毕,软件就可以根据用户需求完成对异常的最终处理
专业叫法:调用异常处理函数
例如:触发IRQ中断异常,实现开关灯操作:

irq_function:
	@1.保护现场
	@2.根据用户需求完成开关灯操作,例如:代码如下:
	mov  r0, #0
	mov  r1, #1
	mov  r2, #2
	....
	bl led_on @调用开灯函数
	bl delay @调用延时函数
	bl led_off @调用关灯函数
	bl delay @调用延时函数
	...

4.一旦异常处理完毕,异常处理函数调用完毕,最后让CPU核再回到原先被打断的QT程序继续运行,此过程做三件事:恢复现场,程序状态恢复,跳转返回
恢复现场:又称出栈恢复,将之前栈用保存的QT数据重新恢复到ARM寄存器中供QT使用
例如:r0=100,r1=101,r2=102
程序状态恢复:将之前备份到spsr_mode中的QT的cpsr的值重新恢复到cpsr中供QT使用,cpsr=spsr_mode
跳转返回:就是将之前保存的返回地址直接给pc即可,让CPU核重新回到QT程序继续运行,pc=lr_mode至此一次异常处理完毕!
例如:IRQ中断异常为例,其irq_function标签的代码参考如下:

irq_function:
	@1.保护现场(QT中的ARM寄存器值保存到栈中)
	@2.根据用户需求完成开关灯操作
	mov  r0, #0
	mov  r1, #1
	mov  r2, #2
	....
	bl led_on @调用开灯函数
	bl delay @调用延时函数
	bl led_off @调用关灯函数
	bl delay @调用延时函数
	....
	@3.软件最后处理三步骤:
	@3.1.恢复现场(将栈中保存的数据恢复到ARM寄存器中),供QT使用
	@3.2.状态恢复:cpsr = spsr_irq,供QT使用
	@3.3.跳转返回:pc = lr_irq = QT程序的某个地址,至此IRQ中断异常处理完毕,CPU核又回到了QT程序继续运行,静静地带着下一次异常的触发和处理!

ARM异常处理流程的终极总结:
ARM核硬件上自动做四件事:
1.备份cpsr:spsr_mode=cpsr
2.设置cpsr:cpsr[7:0]=110xxxxx
3.保存返回地址:lr_mode=pc-4
4.设置pc=0x00/0x04/0x08/0x0c/0x10/0x18/0x1c,开启软件的处理四步骤
软件处理的四件事:
1.提前建立异常向量表
2.保护现场
3.根据用户需求调用异常处理函数
4.恢复现场,状态恢复(cpsr=spsr_mode),跳转返回(pc=lr_mode)

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

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

相关文章

python小游戏之摇骰子猜大小

最近学习Python的随机数,逻辑判断,循环的用法,就想找一些练习题,比如小游戏猜大小,程序思路如下: 附上源代码如下: 摇骰子的函数,这个函数其实并不需要传任何参数,调用后…

理性看待、正确理解 AI 中的 Scaling “laws”

编者按:LLMs 规模和性能的不断提升,让人们不禁产生疑问:这种趋势是否能一直持续下去?我们是否能通过不断扩大模型规模最终实现通用人工智能(AGI)?回答这些问题对于理解 AI 的未来发展轨迹至关重…

独立开发者,技术只是其一

刚开始做独立开发者时,总是想着追究技术的深度。我的软件用了特别牛的技术,我的软件这个功能技术花了很多个日日夜夜才实现!真的好有成就感啊! “额,请问一下,你技术这么牛,卖出去多少钱啦&…

linux如何配置主机间免密ssh连接

1. 生成key 其实就是配置从本地节点到远程主机之间基于key(无密码的方式)的SSH连接: # 生成ssh keyssh-keygen2. 拷贝key到远端主机 # 拷贝ssh key到远程主机,ssh的时候就不需要输入密码了# ssh-copy-id remoteuserremoteserve…

通过电影之镜,提升生活之美

在快节奏的现代生活中,电影不仅是娱乐的载体,更是提升审美情趣、拓宽视野的窗口。三部各具特色的经典之作——《布达佩斯大饭店》、《花样年华》与《天使爱美丽》,以其独特的视觉风格、深刻的情感表达与细腻的艺术构思,为我们展示…

三十九、【人工智能】【机器学习】【监督学习】- 多项式朴素贝叶斯分类器(Multinomial Naive Bayes)

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

追踪团贷网第1968天:重磅!派生科技的股权准备拍卖!合计8.51亿

周五晚,聊聊团贷网最新消息。 继续关注团贷网涉案资产的拍卖。 这周又有重大进展,派生科技的股权与股票,终于要开始拍卖了。 (来自京东拍卖网) (来自京东拍卖网) 目前正在预热阶段,将会在9月18日集中拍卖,而且拆分成…

Visual C++ 2010 学习版

这个版本很好用。 在这里放一个链接,做个备份。 这个版本是承前启后的版本,非常的重要。 一、使用VC2010 这个版本创建的解决方案可以在VS2010~VS2022版本中打开,反之也行。 二、使用VC2010 可以编绎VC6.0 ~VC2008的项目。可以使用现成的…

让护眼旗舰体验全面普及!书客L2 PRO凭借医学养护眼爆火受追捧!

为了满足消费者日益增长的健康需求,书客宣布推出其最新款护眼台灯——[书客L2 PRO护眼台灯]。书客作为深耕照明领域多年的品牌,八年间始终坚持着医护级“护眼更养眼”的理念,这一款[养眼更护眼]的巅峰力作备受业界的瞩目与期待。书客L2 PRO护…

Visual Studio 2022 无法打开源文件atlimage.h

最近在搞tcp socket 通信demo,网上抄了一下源码(代码参考:C中的Socket编程使用协议发送图片_快速传输 照片 c-CSDN博客),还没开始编译就提示 无法打开源文件atlimage.h,全局搜了一下没有这个文件&#xff0…

(七)Activiti-modeler中文支持

1、修改app.js,51行 注意第3步,之前已经访问过,缓存到cookie了,这里要么注释该方法,要么去浏览器手动删除对应cookie才能使用下面的zh-CN.json 2、i18n\en.json中添加zh-CN.json (以下代码片断为网上获得…

进阶岛【闯关任务】探索 InternLM 模型能力边界

一、任务介绍 在 CompassArena 中选择双模型对话,与InternLM2.5及另外任意其他模型对话,收集 5 个 InternLM2.5 输出结果不如其他模型的对话案例,以及 InternLM2.5 的 5 个 Good Case。 任务地址:Docs 二、评测指标 可以从评测…

CSS小玩意儿:文字适配背景

一&#xff0c;效果 二&#xff0c;代码 1&#xff0c;搭个框架 添加一张背景图片&#xff0c;在图片中显示一行文字。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" conte…

怎么等比例调整图片尺寸大小?调整图片尺寸的8个方法

在数字时代&#xff0c;图片已成为我们日常生活与工作中不可或缺的一部分。从社交媒体分享到专业设计项目&#xff0c;图片的质量和外观直接影响着信息的传达与接收。因此&#xff0c;在处理图片时&#xff0c;保持其原始的纵横比&#xff0c;即等比例调整图片尺寸&#xff0c;…

数字媒体产业发展现状剖析,洞悉数字产业园的创新之举

在当今数字化时代&#xff0c;数字媒体产业发展迅猛&#xff0c;呈现出一片繁荣景象。然而&#xff0c;在这繁荣的背后&#xff0c;数字媒体产业发展现状也存在着诸多挑战与机遇。 数字媒体产业发展现状的一个显著特点是技术的快速更新换代。从虚拟现实&#xff08;VR&#xf…

智能驾驶时代的中控屏UI设计创新

当前&#xff0c;汽车交互设计领域正蓬勃发展&#xff0c;其中以中控屏的交互设计尤为突出。这种设计现状显示了其在汽车行业中的广泛应用和重要性。中控屏的设计不仅提升了驾驶体验&#xff0c;还增强了车辆的功能性与安全性。利用通用的中控屏 UI 设计模板能够快速设计出一个…

【ubuntu】ROS(1)

1 ROS安装 基于 ubuntu 20.04 ubuntu 镜像下载地址&#xff1a;Index of / 1.1 设置安装源 设置ROS源 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list 设置密钥 sudo apt-key…

c语言---文件

这一节我准备分三个部分来带领大家了解文件 ——一、有关文件的基础知识 ————二、文件的简单操作 ————————三、文件结束的判定 ————————————四、文件缓冲区 一、文件的基础知识&#xff1a; 首先在了解文件之前&#xff0c;我们需要了解C/C程序内存…

17.session不共享问题

问题 多台Tomcat并不共享session存储空间&#xff0c;当请求切换到不同的tomcat服务时导致数据丢失问题。 考虑到以后微服务部署多个项目&#xff0c;也就是多个tomcat就会出现session不共享问题。 替代方案满足条件 1.数据共享 2.内存存储&#xff0c;因为session就是基于内…

NVDLA专题10:具体模块介绍——Planar Data Processor

概述 平面数据处理器(Planar Data Processor, PDP)沿宽x高的前两个维度平面执行操作&#xff0c;在NVDLA版中&#xff0c;PDPD旨在实现池化层&#xff0c;module定义在NV_NVDLA_pdp.v。支持最大、最小和平均池化方法。平面内的几个相邻输入元素将被发送到非线性函数来计算一个…