鸿蒙轻内核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

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

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

相关文章

JavaFX HBox

JavaFX API具有将UI控件显示到场景图上的布局类。HBox布局类将JavaFX子节点放在水平行中。 新的子节点附加到右侧的末尾。默认情况下,HBox布局尊重子节点的首选宽度和高度。 当父节点不可调整大小时,例如Group节点,HBox的行高度设置为子节点的…

【工作】计算机行业相关的十六类工作简介

本文简单介绍了计算机行业相关的工作类别,共16种,包括常见招聘要求与平均工资。平均工资信息来源:米国企业点评职场社区glassdoor(https://www.glassdoor.com/index.htm) (一)软件工程师 软件…

图书馆图书可视化分析+大屏

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 目录 摘要前言技术栈开发环境数据说明 正文数据获取数据存储数据清理数据分析数据挖掘关联规则二分类预测 数据可视化书籍价格区间柱状图书籍评…

质疑标普,理解标普,加入标普

上周我在文章里提到过,标普信息科技LOF(161128)出现套利机会。每天申购卖出,到现在一个账户56*6336润。 得益于美股七巨头轮流领涨,161128依旧坚挺,每天溢价都是10%,成交量1个多亿,场内新增份额才400万份&…

路由器虚拟服务器有什么作用

现如今在IPv4时代,由于公网IP地址的匮乏,约有70%的电脑都处于内网中,上网需要通过路由器。如果反过来想要访问身处内网的电脑,我们就需要在路由器里开放相应的端口才能实现。而这开放端口的功能,在路由器里就叫做虚拟服…

NASA数据:南极海洋生物资源

Antarctic Marine Living Resources (AMLR) program 南极海洋生物资源许可证 南极海洋生物资源保护委员会公约区受到管制。任何打算从该区域捕获海洋生物的人都必须获得许可证。 简介 美国是南极海洋生物资源保护委员会(Commission for the Conservation of Anta…

JVM面试重点-2

16. 吞吐量优先和响应时间优先的回收器是哪些? 吞吐量优先:Parallel Scavenge Parallel Old(多线程并行)->简称: PSPO -> JDK1.8默认响应时间优先:ParNew CMS(并发回收垃圾&#xff09…

VMware 桥接网络突然无法上网

VMware 桥接网络突然无法上网 0. 问题1. 解决方法 0. 问题 昨天,VMware 桥接网络正常使用,今天突然无法上网。 1. 解决方法 打开VMware的虚拟网络编辑器,将桥接模式的网络从“自动”改成你要使用的网卡,问题解决。 完成&#…

通过命令行启动MySQL

通过命令行启动MySQL 右击,选择管理员运行 停止MySQL net stop你的服务名称 net stop MySQL启动MySQL net start你的服务名称 net start MySQL

ElasticSearch地理空间数据了解

ElasticSearch地理空间数据了解 使用场景 Elasticsearch 的地理空间数据处理功能在现代社会中有着广泛的应用,以下是一些常见的使用场景和方向: 1. 位置搜索和导航 本地服务发现:应用程序可以使用 Elasticsearch 查找用户附近的餐馆、商店…

【java分布式计算】分布式计算程序设计基础

期末复习 自留 重点只抓考点 目录 基本技术 SOCKETS网络套接字 多线程 数据序列化 Java I/O流 集合容器 范型 内部类、匿名类、Lambda(代码) 项目构建管理工具 高级技术 注解(代码) 反射(代码)…

C语言笔记第15篇:文件操作

1、为什么使用文件? 如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化…

【PL理论】(29) OOP:面向对象编程 | 案例研究:C++ 中的类 | 继承 | 继承和指针 | Object-oriented Programming

💭 写在前面:本章我们将进入 Object-oriented Programming,面向对象编程的讲解,探讨 C 中的类,继承等。 目录 0x00 面向对象编程 0x01 C语言中的结构体 0x02 案例研究:C 中的类 0x03 术语 0x04 继承&…

PHP调用阿里云OSS的SDK封装成服务的完整指南与问题解决

在现代Web开发中,使用云存储来管理和存储大量的静态文件已经成为常态。阿里云OSS(对象存储服务)是其中一个非常受欢迎的选择。在这篇文章中,我们将详细讲解如何在PHP项目中集成并使用阿里云OSS SDK。 #### 一、前期准备 在开始之…

vue3轮播图怎么做

先看效果 实现代码 <n-carouseleffect"card"dot-type"line"draggable:autoplay"!isHovered":current-index"currentIndex"prev-slide-style"transform: translateX(-150%) translateZ(-450px);opacity:1"next-slide-st…

【MySQL】(基础篇十三) —— 联结

联结 本文介绍什么是联结&#xff0c;为什么要使用联结&#xff0c;如何编写使用联结的SELECT语句。介绍如何对被联结的表使用表别名和聚集函数。 SQL最强大的功能之一就是能在数据检索查询的执行中联结&#xff08;join&#xff09;表。联结是利用SQL的SELECT能执行的最重要…

springboot+vue+mybatis教师工作审核系统+PPT+论文+讲解+售后

随着社会不断进步与发展&#xff0c;生活节奏不断加快&#xff0c;信息已经成为我们生活中不可缺少的一部分&#xff0c;很多学校需要掌握大量的信息来了解特定学生的需求&#xff0c;传统的做法是组织大量的人力物力对学生散发调查表&#xff0c;然后对收集的信息进行统计并得…

基于Matlab的BP神经网络的车牌识别系统(含GUI界面)【W7】

简介&#xff1a; 本系统结合了图像处理技术和机器学习方法&#xff08;BP神经网络&#xff09;&#xff0c;能够有效地实现车牌的自动识别。通过预处理、精确定位、字符分割和神经网络识别&#xff0c;系统能够准确地识别各种车牌图像&#xff0c;并在智能交通管理、安防监控等…

LeetCode 338.比特位计数

各位朋友们&#xff0c;大家好啊&#xff0c;今天此题我用的方法比较好理解&#xff0c;但时间复杂度比较高如果大家觉得可以的话&#xff0c;不妨给个免费的赞吧&#xff0c;谢谢了^ _ ^ 1.题目要求如图所示: 2.做题步骤: 1.先计算总共多少个数: int count 0;int number 0;…

25 avl树

目录 底层结构avl树的概念节点定义插入旋转验证删除全性能 1. 底层结构 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;在其文档介绍中发现&#xff0c;这几个容器有几个共同点是&#xff1a;其底层都是按照二叉搜索树来实现的&#xff0c;但是二叉搜索树有自…