ARMv7-A 那些事 - 5.CP15协处理器

news2024/11/30 12:44:00

By: Ailson Jack
Date: 2023.10.01
个人博客:http://www.only2fire.com/
本文在我博客的地址是:http://www.only2fire.com/archives/157.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。

协处理器概述

ARM架构通过支持协处理器来扩展处理器的功能。ARM架构的处理器支持最多16个协处理器,通常称为CP0~CP15。下述的协处理器被ARM用于特殊用途:

  • CP15:提供系统控制功能,主要用于配置MMU、TLB和Cache等功能。
  • CP14:主要用于控制系统Debug功能。
  • CP10、CP11:两个协处理器一起提供了对浮点运算和向量操作的支持,这两个协处理器主要用于控制和配置浮点功能和高级SIMD指令扩展。
  • 其他协处理器被ARM保留用于将来使用。

本文主要说说CP15协处理器。

CP15协处理器总览

CP15是系统控制协处理器,主要用于对ARM处理器核心支持的许多特性功能进行配置。CP15协处理器支持16个32位主寄存器(primary register),命名为c0c15。c0c15主寄存器各自又有多个32位的物理寄存器(physical register)。CP15协处理器的大多数寄存器不能在USR模式下访问,只能在除USR模式外的其他模式下访问。下面列出c0~c15中比较常用的寄存器:

primary registerphysical register描述
c0MIDR主ID寄存器,用于记录版本信息
c0MPIDR多核处理器情况下,提供一种方法来唯一标识集群中的各个核心
c1SCTLR系统控制寄存器
c1ACTLR辅助控制寄存器
c1CPACR协处理器访问控制寄存器,控制访问除了CP14和CP15的协处理器
c1SCR安全配置寄存器,被TrustZone使用
c2、c3TTBR0一级转换页表基址寄存器0
c2、c3TTBR1一级转换页表基址寄存器1
c2、c3TTBCR页表转换控制寄存器
c5、c6DFSR数据异常(Data Fault)状态寄存器
c5、c6IFSR指令异常(Instruction Fault)状态寄存器
c5、c6DFAR数据异常(Data Fault)地址寄存器
c5、c6IFAR指令异常(Instruction Fault)地址寄存器
c7branch predictorcache和分支预测管理功能
c7barrier数据和指令屏障操作
c8TLBTLB操作
c9performance monitors性能监视器
c12VBAR提供非监视模式处理异常的异常基地址
c12MVBAR提供监视模式处理异常的异常基地址
c13CONTEXTIDR上下文ID寄存器
c15CBAR配置基址寄存器,为GIC和本地时钟类型外设提供基地址

在CP15协处理器中,c0~c15每个主处理器下面有多个物理寄存器,上述表格只列出了部分常用的物理寄存器。

协处理器操作指令

ARMv7-A体系结构的处理器提供了MRCMCR指令用于对协处理器进行读写操作。MRC指令用于将CP15协处理器中的寄存器数据读取到ARM通用寄存器中。MCR指令用于将ARM通用寄存器中的数据写入到CP15协处理器的寄存器中。

MRC

MRC指令的语法如下所示:

MRC{cond} coproc, opc1, Rt, CRn, CRm{, opc2}

cond为条件码。

coproc为协处理器名称,CP0CP15协处理器分别对应名称p0p15。

opc1为协处理器要执行的操作码,取指范围为0~7。

Rt为ARM通用寄存器,用于存储读取到的协处理器寄存器数据。

CRn为协处理器寄存器,对于CP15协处理器来说,CRn取值范围为c0~c15。

CRm为协处理器寄存器,对于CP15协处理器来说,通过CRmopc2一起来确定CRn对应的具体寄存器。

opc2为可选的协处理器执行操作码,取指范围为0~7,当不需要的时候要设置为0。

MRC指令使用示例如下:

# 读取主ID寄存器 MIDR 的数据到 R0 中.
MRC p15, 0, R0, c0, c0, 0

MCR

MCR指令的语法如下所示:

MCR{cond} coproc, opc1, Rt, CRn, CRm{, opc2}

cond为条件码。

coproc为协处理器名称,CP0CP15协处理器分别对应名称p0p15。

opc1为协处理器要执行的操作码,取指范围为0~7。

Rt为ARM通用寄存器,用于存储要写入到协处理器寄存器中的数据。

CRn为协处理器寄存器,对于CP15协处理器来说,CRn取值范围为c0~c15。

CRm为协处理器寄存器,对于CP15协处理器来说,通过CRmopc2一起来确定CRn对应的具体寄存器。

opc2为可选的协处理器执行操作码,取指范围为0~7,当不需要的时候要设置为0。

MCR指令使用示例如下:

# 将 R0 中的配置数据写入到 SCTLR
MCR p15, 0, R0, c1, c0, 0

CP15协处理器主寄存器组成

CP15协处理器有c0~c15总共16个主寄存器,在每个主寄存器下面,又有多个物理寄存器。下图总结了CP15协处理器的寄存器组织形式:

在这里插入图片描述
上图对于MRCMCR指令所要使用到的一些参数都标明了,对于想要访问CP15协处理器相关寄存器,只需要看图填写好参数就行了。下面具体列一下c0~c15各个主寄存器的组成。

CP15协处理器c0寄存器组成

主寄存器c0主要提供ID相关的功能,c0寄存器的组成如下图所示:

在这里插入图片描述

CP15协处理器c1寄存器组成

主寄存器c1主要提供系统控制相关的功能,c1寄存器的组成如下图所示:

在这里插入图片描述
在CP15协处理器的寄存器中,系统控制寄存器SCTLR是被访问的比较多的寄存器。对SCTLR寄存器的访问需要在PL1或者更高的特权等级。SCTLR寄存器的位关系如下图所示:

在这里插入图片描述

标志说明
30TEThumb异常使能,控制在异常发生时(包括reset),将会进入哪种指令集,0:ARM指令集,1:Thumb指令集
27NMFI不可屏蔽的FIQ支持,0:软件可以通过写CPSR.F位来屏蔽FIQ,1:软件不可以通过写CPSR.F位来屏蔽FIQ
25EE在进入异常处理时的大小端模式配置,0:小端,1:大端
22U表明是否使用对齐模式
21FIFIQ配置使能
13V选择异常向量表基址,0:0x00000000,1:0xffff0000
12I指令cache使能
11Z分支预测使能
2C数据cache使能
1A对齐检查使能
0MMMU使能

CP15协处理器c2 c3寄存器组成

主寄存器c2和c3主要提供内存保护和内存控制相关的功能,c2和c3寄存器的组成如下图所示:

在这里插入图片描述

CP15协处理器c4寄存器组成

在任何基于ARMv7实现的处理器中,协处理器CP15的c4寄存器没有被使用。

CP15协处理器c5 c6寄存器组成

主寄存器c5和c6主要提供内存系统错误上报功能,c5和c6寄存器的组成如下图所示:

在这里插入图片描述

CP15协处理器c7寄存器组成

主寄存器c7主要提供cache维护,地址转换和内存屏障操作相关的功能,c7寄存器的组成如下图所示:

在这里插入图片描述

CP15协处理器c8寄存器组成

主寄存器c8主要提供TLB维护相关的功能,c8寄存器的组成如下图所示:

在这里插入图片描述

CP15协处理器c9寄存器组成

主寄存器c9保留用于分支预测,cache和TCM操作,c9寄存器的组成如下图所示:

在这里插入图片描述

CP15协处理器c10寄存器组成

主寄存器c10主要提供内存重映射和TLB控制相关的功能,c10寄存器的组成如下图所示:

在这里插入图片描述

CP15协处理器c11寄存器组成

主寄存器c11保留用于TCM DMA操作,c11寄存器的组成如下图所示:

在这里插入图片描述

CP15协处理器c12寄存器组成

主寄存器c12提供安全扩展功能,c12寄存器的组成如下图所示:

在这里插入图片描述

CP15协处理器c13寄存器组成

主寄存器c13提供进程ID、上下文ID和线程ID处理功能,c13寄存器的组成如下图所示:

在这里插入图片描述

CP15协处理器c14寄存器组成

主寄存器c14保留用于通用定时器功能,c14寄存器的组成如下图所示:

在这里插入图片描述

CP15协处理器c15寄存器组成

主寄存器c15由处理器实现决定。

这里只是简单的将CP15各个主寄存器的组成列出来了,方便在使用MRCMCR指令配置CP15主寄存器时,查看指令各个参数的设置,以及对照配置的具体寄存器,至于寄存器的具体内容由于篇幅原因就不列出来了,CP15寄存器的细节可以参考ARMv7AR手册的B3.17章节内容。

欢迎关注博主的公众号(微信搜索公众号:嵌入式那些事):

在这里插入图片描述
如果文中有什么问题欢迎指正,毕竟博主的水平有限。

如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^。

排版更好的内容见我博客的地址:http://www.only2fire.com/archives/157.html

注:转载请注明出处,谢谢!^_^

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

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

相关文章

14:STM32-----看门狗

目录 一:看门狗 1:WDG 2:独立看门狗 (IWDG) A:IWDG框图 B:IWDG_KR键寄存器 C:IWDG超时时间 3:窗口看门狗 (WWDG) A:WWDG框图 B:WWDG工作特性 C:WWDG超时时间 4:独立看门狗和窗口看门狗的区别 5:数据手册 二:案例 A:独立看门狗 1:连接图 2:步骤 3:函数介绍 3:代…

网络爬虫——urllib(2)

前言🍭 ❤️❤️❤️网络爬虫专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Python网络爬虫_热爱编程的林兮的博客-CSDN博客 前篇讲解了urllib的基本使用、一个类型六个方法与下载相关内容&#xff0…

《深入浅出OCR》第二章:OCR技术发展与分类

✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 👨‍💻面向对象: 本篇前言知识主要介绍深度学习知识,全面总结知知识…

Python3数据科学包系列(一):数据分析实战

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 认识下数据科学中数据处理基础包: (1)NumPy 俗话说: 要学会跑需先…

C++核心编程--多态篇

4.7、多态 4.7.1、多态的基本概念 多态是C面向对象三大特征之一 多态分为两类 静态多态:函数重载和运算符重载属于静态多态,复用函数名动态多态:派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早…

Eclipse 主网即将上线迎空投预期,Zepoch 节点或成受益者?

目前,Zepoch 节点空投页面中,模块化 Layer2 Rollup 项目 Eclipse 出现在其空投列表中。 配合近期 Eclipse 宣布了其将由 SVM 提供支持的 Layer2 主网架构,并将在今年年底上线主网的消息后,不免引发两点猜测:一个是 Ecl…

springcloud:四、nacos介绍+启动+服务分级存储模型/集群+NacosRule负载均衡

nacos介绍 nacos是阿里巴巴提供的SpringCloud的一个组件,算是eureka的替代品。 nacos启动 安装过程这里不再赘述,相关安装或启动的问题可以见我的另一篇博客: http://t.csdn.cn/tcQ76 单价模式启动命令:进入bin目录&#xff0…

某房产网站登录RSA加密分析

文章目录 1. 写在前面2. 抓包分析3. 扣加密代码4. 还原加密 1. 写在前面 今天是国庆节,首先祝福看到这篇文章的每一个人节日快乐!假期会老的这些天一直在忙事情跟日常带娃,抽不出一点时间来写东西。夜深了、娃也睡了。最近湖南开始降温了&…

SimpleCG动画示例--汉诺塔动画演示

前言 SimpleCG的使用方法在前面已经介绍了许多,有兴趣的同学如果有去动手,制作一些简单动画应该没多大问题的。所以这次我们来演示一下简单动画。我们刚学习C语言的递归函数时,有一个经典例子相信很多同学都写过,那就是汉诺塔。那…

【算法优选】双指针专题——壹

文章目录 😎前言🌴[移动零](https://leetcode.cn/problems/move-zeroes/)🚩题⽬描述:🚩算法思路🚩算法流程🚩代码实现 🍀[复写零](https://leetcode.cn/problems/duplicate-zeros/)&…

深入浅出线程池

一、线程 1、什么是线程 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际 运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线 程并行执行不同的任务。 2、如…

2023-10-01 LeetCode每日一题(买卖股票的最佳时机)

2023-10-01每日一题 一、题目编号 121. 买卖股票的最佳时机二、题目链接 点击跳转到题目位置 三、题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一…

Python Appium 安卓自动化测试 基本使用 - Phone Spider

Python Appium 安卓自动化测试 基本使用 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 文章目录 Python Appium 安卓自动化测试 基本使用前言一、环境安装1.1 Python Pip…

【接口技术】输入输出接口习题

1:图1所示电路PC/XT系统板上的接口控制电路的端口地址译码电路。写出8237A,8259A,8253,8255A的端口地址范围 解答: 【G1A非】和【G2B非】为低电平有效,因此A80,A90 74ls138中,是按…

python代码混淆与代码打包

0x00 背景 自己写的项目,又想保护源码,自己做个混淆是最方便的了。 0x01 实践 这里使用开源工具 GitHub - astrand/pyobfuscate: pyobfuscate,虽然git上才500多star,但是很好用。它的使用场景是混淆单个py文件。很多事物有开始就…

六、vpp 流表

草稿!!! vpp node其实就是三个部分 1、plugin init 2、set command 3、function 实现功能,比如这里的流表 这里的function函数有个返回值,根据返回值决定下一个节点走哪里 flowtable_getinfo这里处理函数返回2 &#…

Nodejs沙箱逃逸

一、基本概念 JavaScript和Nodejs之间有什么区别 JavaScript用在浏览器前端,后来将Chrome中的v8引擎单独拿出来为JavaScript单独开发了一个运行环境,因此JavaScript也可以作为一门后端语言,写在后端(服务端)的JavaScr…

什么是博弈论?

什么是博弈?字面描述中,博弈由两个字构成:博 和 弈。博弈是一种双方(多方)的对抗(比赛),对抗总是在一定的规则下进行,参与者必然会考虑应用相应的策略(计谋&a…

防火墙基础之H3C防火墙分支与分支之间双向地址转换

分支与分支之间双向地址转换 原理概述: 防火墙(英语:Firewall)技术是通过有机结合各类用于安全管理​与筛选的软件和硬件​设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资…

leetCode 376.摆动序列 动态规划 + 图解 + 状态转移

376. 摆动序列 - 力扣(LeetCode) 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如…