鸿蒙轻内核A核源码分析系列六 MMU协处理器(2)
3、MMU汇编代码
在arch\arm\arm\include\arm.h文件中,封装了CP15协处理器相关的寄存器操作汇编函数。我们主要看下MMU相关的部分。
3.1 CP15 C2 TTBR转换表基地址寄存器
代码比较简单,结合下图,自行查看即可。该图来自《ARM Cortex-A9 Technical Reference Manual r4p1》CP15 system control registers grouped by CRn order部分。

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寄存器的部分截图。

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 进程标识符寄存器
代码比较简单,结合下图,自行查看即可。

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切到内核空间的ID
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;
#endifOsArmWriteTtbr0(ttbr);ISB;OsArmWriteTtbcr(ttbcr);ISB;
#ifdef LOSCFG_KERNEL_VMif (archMmu) {OsArmWriteContextidr(archMmu->asid);ISB;}
#endif
}
小结
本文介绍了ARM CP15协处理器的知识,接着介绍下协处理器相关的汇编指令,最后分析下MMU相关汇编代码。
如果大家想更加深入的学习 OpenHarmony 开发的内容,不妨可以参考以下相关学习文档进行学习,助你快速提升自己:
OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy

《OpenHarmony源码解析》:https://qr18.cn/CgxrRy
- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……

系统架构分析:https://qr18.cn/CgxrRy
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……

OpenHarmony 设备开发学习手册:https://qr18.cn/CgxrRy

OpenHarmony面试题(内含参考答案):https://qr18.cn/CgxrRy

写在最后
- 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:
https://qr21.cn/FV7h05

相关文章:
鸿蒙轻内核A核源码分析系列六 MMU协处理器(2)
3、MMU汇编代码 在arch\arm\arm\include\arm.h文件中,封装了CP15协处理器相关的寄存器操作汇编函数。我们主要看下MMU相关的部分。 3.1 CP15 C2 TTBR转换表基地址寄存器 代码比较简单,结合下图,自行查看即可。该图来自《ARM Cortex-A9 Tec…...
C# 集合(一) —— Array类
总目录 C# 语法总目录 集合一 Array 集合1. Array 类1.1 搜索1.2 排序1.3 翻转1.4 转换 集合 1. Array 类 //创建方式 //方式一 Array arr Array.CreateInstance(typeof(string), 3); arr.SetValue("lisi", 0); arr.SetValue("zhangsan", 1); arr.SetVa…...
World Map Globe Edition 2
只需点击几下,World Political Map - Globe Edition 2就会在场景添加一个美丽且交互式的3D世界地图。将地球预制件拖动到场景中并自定义外观。 完整的资产,具有强大的可视化功能、示例和丰富的API,适用于构建VR、桌面和移动游戏和应用程序。 主要功能: - 在不访问互联网的情…...
人类重启计划---19500630
一、引言 随着人类社会的发展,我们面临着诸多全球性挑战,如气候变化、资源匮乏、疾病爆发等。为了应对这些挑战,确保人类的生存和发展,我们提出人类重启计划。该计划旨在建立一个可持续、安全和繁荣的新世界。 二、目标 建立可持续发展的社会经济模式,确保资源的有效利用…...
苹果WWDC 2024 带来的 AI 风暴:从生产力工具到个人助理,AI 将如何融入我们的生活?
2024年6月5日,苹果WWDC 2024全球开发者大会如约而至,带来了众多令人兴奋的新功能和新产品。其中,AI 技术的全面融入无疑是最引人注目的亮点。从 iOS、iPadOS 到 macOS,再到 Siri 和开发者工具,苹果正在将 AI 融入到其生…...
SE语法总结博文(附思维导图)
Java中的规范 注释 //单行注释 /*多行注释 */ /**文档注释 */命名规范 命名时可以包含:字母、数字以及 下划线和 $ 符号等等。 但是不能以数字开头,也不能是关键字,且严格区分大小写。 类名:每个单词的首字母大写(大驼峰)&…...
STM32面试题
STM32面试题通常涉及STM32微控制器的特性、功能、应用以及编程知识。以下是一些可能的面试问题: STM32微控制器的基本介绍: STM32微控制器是由哪家公司生产的?STM32微控制器主要应用于哪些领域?STM32的特性和功能: STM32微控制器有哪些主要特性?请描述STM32的GPIO(通用输…...
【单片机】DS2431芯片,读写128个字节,程序
ds2431pt&r stm32读写程序: 部分程序: #include "sys.h" #include "delay.h" #include "usart.h"#include <stdio.h> #include <stdlib.h> #include <string.h>#include "sys.h" #incl…...
[DDR4] DDR 简史
依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR4》 存和硬盘,这对电脑的左膀右臂,共同扛起了存储的重任。内存以其超凡的存取速度闻名,但一旦断电,内存中的数据也会消失。它就像我们的工作桌面&…...
前端 CSS 经典:在 Vue3 中使用渐进式图片
1. 什么是渐进式图片 当我们网站会加载很多图片的时候,有些图片尺寸很大,加载就会很慢,会导致页面长时间陷入白屏状态,用户体验很不好。所以可以使用渐进式图片,先给用户展示模糊图,这些图尺寸小ÿ…...
毕业了校园卡怎么改套餐?
毕业了校园卡怎么改套餐? 毕业生校园卡99元套餐变更8元保号套餐教程 学弟学妹们恭喜毕业呀🎓 校园卡绑定了好多东西注销不掉又不想交高额月租的看过来。 今天一招教你更改校园卡套餐。 中国移动/电信/联通App 打开App,在首页右上角点击人工…...
每一个男人都曾有一个机器人的梦想
每一个男人都曾有一个机器人的梦想 我也有 每一个男人都曾有一个机器人的梦想。对于我来说,这个梦想始于童年时代,那时变形金刚风靡一时,几乎所有80后的孩子都为之疯狂。我是80后中的一员,那时候的科技还远没有如今这般发达&#…...
中望CAD 2025 (ZW3D2025) 简体中文修改版
名称:中望CAD 2025 (ZW3D2025) 简体中文修改版 描述:一款三维CAD设计工具,运行破解补丁ZW3D2025-2024-Patch执行修补。 链接:夸克网盘分享 📁 大小:3.2GB 🏷 标签:#PC软件 #CAD #设…...
CAN 通讯
波特率 波特率(Baud Rate)是指数据通信中每秒传输的符号(或脉冲)的数量。在CAN(Controller Area Network)通信中,波特率通常表示每秒传输的位数(bit per second,bps&…...
第零篇——数学到底应该怎么学?
目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 宏观讲解数学定位,数学学习方式方法,再次详细学习…...
Spring Boot顶层接口实现类注入项目的方法
1、背景 在项目中,我们通常会具有同一特性的业务类定义一个顶层接口,让业务类实现这个接口,通过接口规范来管理这些类。我们将这些实现接口的业务类交托给Spring容器接口后,有时候需要根据业务类型来选择动态选择对应的业务类阿里…...
JDBC介绍-AI问答(通义千问)
一、JDBC介绍 介绍JDBC JDBC(Java Database Connectivity)是Java中用于连接和操作关系型数据库的标准API(应用程序编程接口)。它是由Sun Microsystems(现在是Oracle的一部分)开发,并随Java Deve…...
Spring AI探索
Spring AI概述 该Spring AI项目旨在简化包含人工智能功能的应用程序的开发,避免不必要的复杂性。 该项目从著名的 Python 项目(例如 LangChain 和 LlamaIndex)中汲取灵感,但 Spring AI 并非这些项目的直接移植。该项目的成立基于…...
【代码随想录算法训练Day39】LeetCode 62.不同路径、LeetCode 63.不同路径II
Day39 动态规划第二天 LeetCode 62.不同路径 二维dp数组的含义:走到位置为(i,j)的格子的走法为dp[i][j]种。 递推公式:dp[i][j]dp[i-1][j]dp[i][j-1]。 初始化:dp[i][0]和dp[0][j]都赋值为1. 递归顺序:从左往右,从上…...
浙大版PTA Python程序设计 题目与知识点整理(综合版)
目录 第一章 一、高级语言程序的执行方式 二、变量赋值与内存地址 三、字符编码 3.1 Unicode 3.2 ASCII(American Standard Code for Information Interchange) 四、编程语言分类按照编程范式分类 4.1 面向过程语言 4.2 面向对象语言 五、原码…...
STM32F103 Bootloader跳转失败?别急着怀疑Boot,先检查你的裸机APP中断向量表
STM32F103 Bootloader跳转失败?别急着怀疑Boot,先检查你的裸机APP中断向量表 当你的STM32F103项目采用HAL库Bootloader搭配裸机应用程序(APP)时,如果遇到Bootloader能正常启动HAL版本的APP却无法跳转裸机APP的情况&…...
vLLM实战:手把手教你用LLMEngine构建高效推理服务(附代码解析)
vLLM实战:从零构建高性能大模型推理服务的工程指南 当大语言模型从实验室走向生产环境时,如何实现高吞吐、低延迟的推理服务成为工程化落地的关键挑战。vLLM作为当前最受关注的开源推理框架之一,其核心组件LLMEngine的设计理念值得每一位AI工…...
SEO_详解SEO核心关键词的研究与布局方法(455 )
<h2>SEO核心关键词的研究与布局方法详解</h2> <p>在当前的互联网时代,搜索引擎优化(SEO)已经成为了各个企业和网站提升网络曝光率、吸引更多流量的重要手段。其中,核心关键词的研究与布局是SEO的重要组成部分。…...
Java 四种安全加载 P12 证书的方案
文章目录从文件绝对路径加载【最常用、最稳定】从 resources 目录加载从 byte [] 字节数组加载从 Base64 字符串加载如果文章对您有用,请关注点赞加收藏,博主会持续更新相关的专栏笔记🫡 从文件绝对路径加载【最常用、最稳定】 适合…...
计算机毕业设计springboot彝族民族文化宣传网站 基于SpringBoot的彝族非物质文化遗产数字化展示平台 SpringBoot框架下彝族传统风俗文化传播系统
计算机毕业设计springboot彝族民族文化宣传网站l36tn9 (配套有源码 程序 mysql数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联xi 可分享 在当今数字化浪潮席卷全球的背景下,少数民族文化的保护与传承面临着前所未有…...
OpenClaw镜像体验报告:GLM-4.7-Flash云端部署3大优势
OpenClaw镜像体验报告:GLM-4.7-Flash云端部署3大优势 1. 为什么选择云端体验OpenClaw 上周我在本地笔记本上折腾OpenClaw时,经历了所有开发者都熟悉的"依赖地狱"——Node.js版本冲突、Python环境污染、系统权限问题接踵而至。当终于看到open…...
4个步骤让普通用户实现黑苹果EFI自动生成:OpCore Simplify智能工具全解析
4个步骤让普通用户实现黑苹果EFI自动生成:OpCore Simplify智能工具全解析 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 如何用智能工具解…...
ROS2接口实战:从传感器数据到自定义消息的完整开发流程(附Python示例)
ROS2接口实战:从传感器数据到自定义消息的完整开发流程(附Python示例) 在机器人开发领域,数据的高效传递与标准化处理是系统稳定运行的关键。ROS2作为新一代机器人操作系统,其接口系统提供了强大的数据交换能力&#x…...
CTP行情接口避坑指南:从‘不合法的登录’到稳定接收tick数据的5个关键步骤
CTP行情接口实战避坑手册:从登录异常到稳定接收tick的深度解决方案 当你在深夜调试CTP行情接口时,突然看到控制台跳出"不合法的登录"错误提示,而距离第二天开盘只剩3小时——这种场景恐怕不少量化开发者都经历过。本文将分享5个关键…...
ComfyUI实战:如何加载基于Flux.1微调的LoRA模型并优化推理流程
最近在项目里用 ComfyUI 部署基于 Flux.1 微调的 LoRA 模型,踩了不少坑。从模型加载失败到推理时显存爆炸,问题层出不穷。经过一番折腾,总算梳理出一套比较稳定的流程,这里把实战经验记录下来,希望能帮到有同样需求的同…...
