那个网站做搬家推广比较好,一二三四免费观看视频中文版在线,合肥企业网站建设工作室,建筑公司取名参考3、MMU汇编代码
在arch\arm\arm\include\arm.h文件中#xff0c;封装了CP15协处理器相关的寄存器操作汇编函数。我们主要看下MMU相关的部分。
3.1 CP15 C2 TTBR转换表基地址寄存器
代码比较简单#xff0c;结合下图#xff0c;自行查看即可。该图来自《ARM Cortex-A9 Tec…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