0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙轻内核源码分析:MMU 协处理器

王程 来源:jf_75796907 作者:jf_75796907 2024-02-20 14:28 次阅读

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》。

wKgZomXURhaAGcYoAAMU1aaKtPg526.png

wKgaomXURh-AUmc6AAF_vM3IDzA715.png

wKgaomXURjKAZrqSAAHXMTBCZzI662.png


在这些 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.要读取的协处理器寄存器。

3、MMU 汇编代码

在 archarmarmincludearm.h 文件中,封装了 CP15 协处理器相关的寄存器操作汇编函数。我们主要看下 MMU 相关的部分。

3.1 CP15 C2 TTBR 转换表基地址寄存器

代码比较简单,结合下图,自行查看即可。该图来自《ARM Cortex-A9 Technical Reference Manual r4p1》CP15 system control registers grouped by CRn order 部分。

wKgZomXURkuAVcDTAAC0gU-1zPI091.png

STATIC INLINE UINT32 OsArmReadTtbr(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c2,c0,0" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteTtbr(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c2,c0,0" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); } STATIC INLINE UINT32 OsArmReadTtbr0(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c2,c0,0" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteTtbr0(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c2,c0,0" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); } STATIC INLINE UINT32 OsArmReadTtbr1(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c2,c0,1" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteTtbr1(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c2,c0,1" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); } STATIC INLINE UINT32 OsArmReadTtbcr(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c2,c0,2" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteTtbcr(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c2,c0,2" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); }

3.2 CP15 C7 高速缓存寄存器

代码比较简单,结合下图,自行查看即可。该图是 C7 寄存器的部分截图。

wKgZomXURlWASRI-AAD0Y7kcroU999.png

STATIC INLINE UINT32 OsArmReadBpiall(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c7,c5,6" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteBpiall(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c7,c5,6" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); } STATIC INLINE UINT32 OsArmReadBpiallis(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c7,c1,6" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteBpiallis(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c7,c1,6" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); }

3.3 CP15 C13 进程标识符寄存器

代码比较简单,结合下图,自行查看即可。

wKgZomXURl6AMvzCAACc0RjQUio347.png

STATIC INLINE UINT32 OsArmReadContextidr(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c13,c0,1" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteContextidr(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c13,c0,1" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); }

4 MMU 上下文切换

在之前的系列,我们了解到每个用户进程都有独立的进程空间。在进程切换时,MMU 上下文也会切换,相应的函数为 LOS_ArchMmuContextSwitch ()。快速分析下该函数的代码。

⑴处读取 TTBCR 寄存器的状态值,如果传入参数 archMmu 不为空,执行⑵使能 TTBR0,否则执行⑶使其失能 TTBR0。⑷处把内核地址空间的进程空间标识符 asid 写入 C13 寄存器。⑸处更新 TTB 页表基地址和 TTB 状态信息到相应寄存器。⑹处把进程空间的进程标识符写入 C13 寄存器。

VOID LOS_ArchMmuContextSwitch(LosArchMmu *archMmu) { UINT32 ttbr; ⑴ UINT32 ttbcr = OsArmReadTtbcr(); if (archMmu) { ⑵ ttbr = MMU_TTBRx_FLAGS | (archMmu->physTtb); /* enable TTBR0 */ ttbcr &= ~MMU_DESCRIPTOR_TTBCR_PD0; } else { ⑶ ttbr = 0; /* disable TTBR0 */ ttbcr |= MMU_DESCRIPTOR_TTBCR_PD0; } #ifdef LOSCFG_KERNEL_VM /* from armv7a arm B3.10.4, we should do synchronization changes of ASID and TTBR. */ ⑷ OsArmWriteContextidr(LOS_GetKVmSpace()->archMmu.asid); ISB; #endif ⑸ OsArmWriteTtbr0(ttbr); ISB; OsArmWriteTtbcr(ttbcr); ISB; #ifdef LOSCFG_KERNEL_VM if (archMmu) { ⑹ OsArmWriteContextidr(archMmu->asid); ISB; } #endif }



审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19265

    浏览量

    229684
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9088

    浏览量

    367412
  • 源码
    +关注

    关注

    8

    文章

    639

    浏览量

    29185
  • MMU
    MMU
    +关注

    关注

    0

    文章

    91

    浏览量

    18283
  • 鸿蒙
    +关注

    关注

    57

    文章

    2345

    浏览量

    42822
收藏 人收藏

    评论

    相关推荐

    赛昉科技发布全新RISC-V处理器内核Dubhe-83

    RISC-V软硬件生态企业赛昉科技近日宣布,正式推出其全新RISC-V处理器内核——Dubhe-83(昉・天枢-83),该内核专为AI应用与高效计算而设计。 Dubhe-83内核采用了
    的头像 发表于 12-13 10:59 161次阅读

    全志T536系列处理器特性概述 集成RISC-V E907处理器

    ,E907处理器,含有2Tops NPU、G2D、VPU 4K高清视频编解码。支持多种多媒体接口MIPI-DSI、Parallel DSI、Dual-LVDS和MIPI-CSI、Parallel
    的头像 发表于 11-18 15:21 918次阅读
    全志T536系列<b class='flag-5'>处理器</b>特性概述 集成RISC-V E907<b class='flag-5'>协</b><b class='flag-5'>处理器</b>

    使用TMS320C6416处理器:Turbo处理器(TCP)

    电子发烧友网站提供《使用TMS320C6416处理器:Turbo处理器(TCP).pdf》资料免费下载
    发表于 10-23 10:16 0次下载
    使用TMS320C6416<b class='flag-5'>协</b><b class='flag-5'>处理器</b>:Turbo<b class='flag-5'>协</b><b class='flag-5'>处理器</b>(TCP)

    使用TMS320C6416处理器:Viterbi处理器(VCP)

    电子发烧友网站提供《使用TMS320C6416处理器:Viterbi处理器(VCP).pdf》资料免费下载
    发表于 10-21 09:36 0次下载
    使用TMS320C6416<b class='flag-5'>协</b><b class='flag-5'>处理器</b>:Viterbi<b class='flag-5'>协</b><b class='flag-5'>处理器</b>(VCP)

    TMS320C6416处理器和误码率

    电子发烧友网站提供《TMS320C6416处理器和误码率.pdf》资料免费下载
    发表于 10-17 10:35 0次下载
    TMS320C6416<b class='flag-5'>协</b><b class='flag-5'>处理器</b>和误码率

    【开源鸿蒙】使用QEMU运行OpenHarmony量系统

    本文将会介绍如何从源码安装QEMU 6.2.0,以及如何使用QEMU运行OpenHarmony量系统。通过本文,你将会对QEMU和OpenHarmony量系统又一个初步的认知,并对如何使用QEMU又一个初步的理解和体会。
    的头像 发表于 09-14 08:51 547次阅读
    【开源<b class='flag-5'>鸿蒙</b>】使用QEMU运行OpenHarmony<b class='flag-5'>轻</b>量系统

    欢创播报 华为宣布鸿蒙内核已超越Linux内核

    1 华为宣布鸿蒙内核已超越Linux内核   6月21日,在华为开发者大会上, HarmonyOS NEXT(鸿蒙NEXT)——真正独立于安卓和iOS的
    的头像 发表于 06-27 11:30 831次阅读

    请问ESP32s3 ULP RISC-V处理器是否支持ADC的读取?

    我在ULP RISC-V处理器的例程中,没有发现有对ADC的操作,请问RISC-V处理器目前还不支持吗?使用的IDF版本为4.4.2。 我想在ULP模式下,通过ADC来读取外部器件
    发表于 06-14 07:38

    中软国际与河南软企业家共同探讨鸿蒙生态新未来

    近日,河南软企业家交流会——“鸿蒙千帆启航 创新提质生产”主题活动在郑州举行
    的头像 发表于 05-08 09:24 478次阅读

    AOSP源码定制-内核驱动编写

    有时候为了分析一些壳的检测,需要在内核层面对读写相关的操作进行监控,每次去修改对应的内核源码编译重刷过于耗时耗力,这里就来尝试编写一个内核
    的头像 发表于 04-23 11:15 1204次阅读
    AOSP<b class='flag-5'>源码</b>定制-<b class='flag-5'>内核</b>驱动编写

    什么是嵌入式微处理器?嵌入式微处理器有哪些?

    嵌入式微处理器是指嵌入到特定应用系统中的微处理器,它是整个嵌入式系统的核心,由通用处理器演变而来,具有体积小、重量、成本低、可靠性高等优点。与通用
    的头像 发表于 03-29 11:39 1020次阅读

    国产GPU搭配国产处理器平台主机

    处理器gpu
    GITSTAR 集特工控
    发布于 :2024年03月27日 14:11:32

    骁龙X Elite处理器在AI生成图片性能超群,英特尔亦被超越

    高通公司称,该款处理器内置AI处理器(NPU),性能达到惊人的45 TOPS(每秒万亿次运算)。视频通过实例对比英特尔酷睿 Ultra 7同样具有NPU的处理器
    的头像 发表于 02-28 14:09 811次阅读

    鸿蒙内核源码分析:Newlib C

    使用 Musl C 库的时候,内核提供了基于 LOS_XXX 适配实现 pthread、mqeue、fs、semaphore、time 等模块的 posix 接口(//kernel/liteos_m
    的头像 发表于 02-18 15:41 700次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>轻</b><b class='flag-5'>内核</b><b class='flag-5'>源码</b><b class='flag-5'>分析</b>:Newlib C

    BlueNRG系列处理器实战经验简介

    BlueNRG 系列芯片从最早的一代 BlueNRG-MS 开始就支持处理器模式。
    的头像 发表于 01-05 18:16 1859次阅读
    BlueNRG系列<b class='flag-5'>协</b><b class='flag-5'>处理器</b>实战经验简介