本篇很重要,对CP15协处理所有16个寄存器一一介绍,可能是全网介绍CP15最全面的一篇,鸿蒙内核的汇编部分(尤其开机启动)中会使用,熟练掌握后看汇编代码将如虎添翼。
协处理器
协处理器 (co-processor) 顾名思义是协助主处理器完成工作,例如浮点、图像、音频处理这一类外围工作。角色相当于老板的助理/秘书,咱皇上身边的人,专干些咱皇上又不好出面的脏活累活,您可别小看了这个角色,权利不大但能力大,是能通天的人,而且老板越大,身边这样的人还不止一个。
在 arm 的协处理器设计中,最多可以支持 16 个协处理器,通常被命名为 cp0~cp15,本篇主要说第16号协处理器 cp15
CP15
关于 cp15详细介绍见于 << ARM体系架构参考手册(ARMv7-A/R).pdf >> 的 B3.17。
cp15 一共有 16个32位的寄存器,其编号为C0 ~ C15 ,用来控制cache、TCM和存储器管理。cp15 寄存器都是复合功能寄存器,不同功能对应不同的内存实体,全由访问指令的参数来决定,对于 armv7 架构而言,A 系列和 R 系列是统一设计的,A 系列带有 MMU 相关的控制,而 R 系列带有 MPU 相关控制,针对不同的功能需要做区分,同时又因为协处理器 cp15 只支持 16 个寄存器,而需要支持的功能较多,所以通过同一寄存器不同功能的方式来满足需求。
mcr | mrc 指令
armv7 中对于协处理器的访问,CP15的寄存器只能被MRC和MCR(Move to Coprocessor from ARM Register )指令访问。MCR表示将 arm 核心寄存器中的值的写到 cp15 寄存器中,MRC 从 cp15 寄存器中读到 arm 核心寄存器中,大部分指令都需要在 PL1 以及更高的特权级下才能正常执行,这是因为 cp15 协处理器大多都涉及到系统和内存的设置,user 模式没有操作权限,user 模式仅能访问 cp15 中有限的几个寄存器比如:ISB、DSB、DMB、TPIDRURW、TPIDRURO 寄存器。
从 `cp**` 寄存器中读到 `arm` 核心寄存器中
MRC<cond> <coproc>, <opc1>, <Rt>, <CRn>, <CRm>{, <opc2>}
- cond : 指令后缀,表示条件执行,关于条件执行可以参考 arm状态寄存器
- coproc :协处理器的名称,cp0~cp15 分别对应名称 p0~p15
- opc1 :对于 cp15 而言,这一个参数一般为0。
- Rt :arm 的通用寄存器
- CRn :与 arm 核心寄存器交换数据的核心寄存器名,c0~c15
- CRm :需要额外操作的协处理器的寄存器名,c0~c15,针对多种功能的 cp15 寄存器,需要使用 CRm 和 opc2 来确定 CRn 对应哪个寄存器实体。
- opc2 :可选,与 CRm搭配使用,同样是决定多功能寄存器中指定实体。
啥玩意,太抽象没看懂,后面直接上内核代码就懂了,先看16个寄存器的功能介绍表

c0 寄存器
c0 寄存器提供处理器和特征识别 ,内核宏定义为,可参考图理解
/*!
* Identification registers (c0) | c0 - 身份寄存器
*/
#define MIDR CP15_REG(c0, 0, c0, 0) /*! Main ID Register | 主ID寄存器 */
#define MPIDR CP15_REG(c0, 0, c0, 5) /*! Multiprocessor Affinity Register | 多处理器关联寄存器给每个CPU制定一个逻辑地址*/
#define CCSIDR CP15_REG(c0, 1, c0, 0) /*! Cache Size ID Registers | 缓存大小ID寄存器*/
#define CLIDR CP15_REG(c0, 1, c0, 1) /*! Cache Level ID Register | 缓存登记ID寄存器*/
#

最低0.47元/天 解锁文章


被折叠的 条评论
为什么被折叠?



