鸿蒙轻内核A核源码分析系列六 MMU协处理器(2)
往期知识点记录:
- 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
- 轻内核A核源码分析系列一 数据结构-双向循环链表
- 轻内核A核源码分析系列二 数据结构-位图操作
- 轻内核A核源码分析系列三 物理内存(1)
- 轻内核A核源码分析系列三 物理内存(2)
- 轻内核A核源码分析系列四(1)虚拟内存进程空间编号
- 轻内核A核源码分析系列四(2) 虚拟内存
- 轻内核A核源码分析系列四(3) 虚拟内存
- 轻内核A核源码分析系列五 虚实映射(1)基础概念
- 轻内核A核源码分析系列五 虚实映射(2)虚实映射初始化
- 轻内核A核源码分析系列五 虚实映射(3)虚拟物理内存映射
- 轻内核A核源码分析系列五 虚实映射(5)虚实映射解除
- 轻内核A核源码分析系列五 虚实映射(6)虚拟映射修改转移
- 轻内核A核源码分析系列五 虚实映射(7)虚实映射Flag属性
- 轻内核A核源码分析系列六 MMU协处理器(1)
- 轻内核A核源码分析系列六 MMU协处理器(2)
- 轻内核A核源码分析系列七 进程管理 (1)
- 轻内核A核源码分析系列七 进程管理 (2)
- 轻内核A核源码分析系列七 进程管理 (3)
- 持续更新中……
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;
#endif
OsArmWriteTtbr0(ttbr);
ISB;
OsArmWriteTtbcr(ttbcr);
ISB;
#ifdef LOSCFG_KERNEL_VM
if (archMmu) {
OsArmWriteContextidr(archMmu->asid);
ISB;
}
#endif
}
小结
本文介绍了ARM CP15协处理器的知识,接着介绍下协处理器相关的汇编指令,最后分析下MMU相关汇编代码。
经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?
为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。
《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview
如何快速入门?
1.基本概念
2.构建第一个ArkTS应用
3.……
开发基础知识:
1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……
基于ArkTS 开发
1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……
鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN/733GH/overview
OpenHarmony 开发环境搭建
《OpenHarmony源码解析》:https://gitcode.com/HarmonyOS_MN/733GH/overview
- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……
- 系统架构分析
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……
OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview