鸿蒙轻内核A核源码分析系列六 MMU协处理器(1) 原创 精华

zhushangyuan_
发布于 2021-12-9 23:53
浏览
2收藏

鸿蒙轻内核A核源码分析系列六 MMU协处理器

【#本文正在参与优质创作者激励#】

在前面系列分析虚实映射时,涉及到了一些MMU协处理器与相关的汇编代码没有深入讲解。本文来专门分析那些协处理器与汇编代码。

本文中所涉及的源码,以OpenHarmony LiteOS-A内核为例,均可以在开源站点https://gitee.com/openharmony/kernel_liteos_a 获取。如果涉及开发板,则默认以hispark_taurus为例。MMU相关的操作函数主要在文件arch/arm/arm/src/los_arch_mmu.c中定义。

本系列首先了解下ARM CP15协处理器的知识,接着介绍下协处理器相关的汇编指令,最后分析下MMU相关汇编代码。

1、 ARM C15 协处理器

在ARM嵌入式应用系统中, 很多系统控制由ARM CP15协处理器来完成的。CP15协处理器包含编号0-15的16个32位的寄存器。例如,ARM处理器使用C15协处理器的寄存器来控制cache、TCM(Tightly-Coupled Memory)和存储器管理。CP15的各个寄存器的概要信息如下图,图片来自官方资料《ARM® Cortex™-A Series Version: 4.0 Programmer’s Guide》。

鸿蒙轻内核A核源码分析系列六 MMU协处理器(1)-鸿蒙开发者社区
鸿蒙轻内核A核源码分析系列六 MMU协处理器(1)-鸿蒙开发者社区鸿蒙轻内核A核源码分析系列六 MMU协处理器(1)-鸿蒙开发者社区

在这些C15寄存器中和MMU关系较大的有C2、C7、C17寄存器,这些寄存器的作用,从上图可以看出,分别是:

  • CP15 C2寄存器

    Memory protection and control registers,内存保护和控制寄存器,包含Translation Table Base Register 0 (TTBR0)、Translation Table Base Register 1 (TTBR1)和Translation Table Base Control Register (TTBCR)。TTBR0、TTBR1是L1转换页表的基地址,TTCR控制TTBR0和TTBR1的使用。

  • CP15 C7寄存器

    Cache and branch predictor maintenance functions、Data and instruction barrier operations用于高速缓存和写缓存控制。

  • CP15 C13寄存器

    Context ID Register (CONTEXTIDR)、Software thread ID registers用于保存进程标识符(asid地址空间编号)。

2、ARM C15 协处理器汇编指令

访问CP15寄存器的指令主要是MCR和MRC这两个指令。本小节详细介绍下这2个汇编指令。先看下指令的含义,MCR是ARM处理器寄存器到协处理器寄存器的数据传送指令,英文为Move CPU register to coprocessor register,MRC是协处理器寄存器到ARM处理器寄存器的数据传送指令,英文为Move from coprocessor register to CPU register。这2个指令的语义格式如下,可以看出语义格式是一样的,但是读取写入含义会有差异。MCR是读取Rt寄存器写入协处理器寄存器CRn、CRm,而MRC是读取协处理器寄存器CRn、CRm写入Rt寄存器。

MCR{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2}
MRC{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2}

MCR详细的语义介绍如下:

Syntax
MCR{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2}

where:
cond
is an optional condition code. 可选的条件码。
coproc
is the name of the coprocessor the instruction is for. The standard name is pn, where n is an integer in the range 0 to 15.协处理器的名称,标准名称为pn,其中n为0-15,例如p14、p15。
opcode1
is a 3-bit coprocessor-specific opcode. 3位的操作码。
opcode2
is an optional 3-bit coprocessor-specific opcode.可选的3位操作码。
Rt
is an ARM source register. Rt must not be PC. 要读取的ARM寄存器,不能为PC寄存器。
CRn, CRm
are coprocessor registers.要写入的协处理器寄存器。

MRC详细的语义介绍如下:

Syntax
MRC{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2}

where:
cond
is an optional condition code.  可选的条件码。
coproc
is the name of the coprocessor the instruction is for. The standard name is pn, where n is an integer in the range 0 to 15.协处理器的名称,标准名称为pn,其中n为0-15,例如p14、p15。
opcode1
is a 3-bit coprocessor-specific opcode.3位的操作码。
opcode2
is an optional 3-bit coprocessor-specific opcode.可选的3位操作码
Rt
is the ARM destination register. Rt must not be PC.要写入的ARM寄存器,不能为PC寄存器。
Rt can be APSR_nzcv. This means that the coprocessor executes an instruction that changes the value of the condition flags in the APSR. Rt也可以为APSR_nzcv。
CRn, CRm
are coprocessor registers.要读取的协处理器寄存器。

【#本文正在参与优质创作者激励#】

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2021-12-9 23:56:11修改
2
收藏 2
回复
举报
回复
    相关推荐