class="hide-preCode-box">

1.2.4 OsTruncPte1函数截取物理地址的高12位

下面代码的宏定义在文件arch\arm\arm\include\los_mmu_descriptor_v6.h中定义。其中MMU_DESCRIPTOR_L1_SMALL_FRAME等于~(0x100000-1)=0xFFF00000即取高12位。所以函数OsTruncPte1截取物理内存地址的高12位。

    #define MMU_DESCRIPTOR_L1_SMALL_SIZE                            0x100000
    #define MMU_DESCRIPTOR_L1_SMALL_MASK                            (MMU_DESCRIPTOR_L1_SMALL_SIZE - 1)
    #define MMU_DESCRIPTOR_L1_SMALL_FRAME                           (~MMU_DESCRIPTOR_L1_SMALL_MASK)
    #define MMU_DESCRIPTOR_L1_SMALL_SHIFT                           20
    #define MMU_DESCRIPTOR_L1_SECTION_ADDR(x)                       ((x) & MMU_DESCRIPTOR_L1_SMALL_FRAME)
    ......
    STATIC INLINE ADDR_T OsTruncPte1(ADDR_T addr)
    {
        return MMU_DESCRIPTOR_L1_SECTION_ADDR(addr);
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

1.2.5 L2页表项连续操作函数

⑴处的函数OsSavePte2设置L2页表项数据,页表项指针地址pte2Ptr指向的内存保存的数据写入页表项数据pte2OsSavePte2Continuous函数用于连续设置L2页表项数据,需要的参数分别有pte2BasePtr页表基地址,index虚拟地址对应的页号作为开始索引,页表项地址pte2和连续的页表项数量count。⑵处设置页表项基地址,然后页表号增加1,页表项数量减1。⑶处更新页表项地址,增加的大小为MMU_DESCRIPTOR_L2_SMALL_SIZE,即4KiB大小,然后统计保存成功的数量加1。⑷处的while循环的条件中的MMU_DESCRIPTOR_L2_NUMBERS_PER_L1等于256(即每1MiB对应的L2页表项的数量)。

函数OsClearPte2Continuous用于清理页表项基地址。

STATIC INLINE VOID OsSavePte2(PTE_T *pte2Ptr, PTE_T pte2)
{
    DMB;
⑴  *pte2Ptr = pte2;
    DSB;
}

STATIC INLINE UINT32 OsSavePte2Continuous(PTE_T *pte2BasePtr, UINT32 index, PTE_T pte2, UINT32 count)
{
    UINT32 saveCounts = 0;
    if (count == 0) {
        return 0;
    }

    DMB;
    do {
⑵      pte2BasePtr[index++] = pte2;
        count--;
⑶      pte2 += MMU_DESCRIPTOR_L2_SMALL_SIZE;
        saveCounts++;
⑷  } while ((count != 0) && (index != MMU_DESCRIPTOR_L2_NUMBERS_PER_L1));
    DSB;

    return saveCounts;
}

STATIC INLINE VOID OsClearPte2Continuous(PTE_T *pte2Ptr, UINT32 count)
{
    UINT32 index = 0;

    DMB;
    while (count > 0) {
        pte2Ptr[index++] = 0;
        count--;
    }
    DSB;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

如果大家想更加深入的学习 OpenHarmony 开发的内容,不妨可以参考以下相关学习文档进行学习,助你快速提升自己:

OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy

《OpenHarmony源码解析》:https://qr18.cn/CgxrRy

系统架构分析:https://qr18.cn/CgxrRy

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

在这里插入图片描述

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

写在最后

data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/maniuT/article/details/139626644","extend1":"pc","ab":"new"}">> id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"> class="blog_extension blog_extension_type2" id="blog_extension"> class="extension_official" data-report-click="{"spm":"1001.2101.3001.6471"}" data-report-view="{"spm":"1001.2101.3001.6471"}"> class="blog_extension_card_left"> class="blog_extension_card_cont"> 鸿蒙开发学习资料领取!!! class="blog_extension_card_cont_r"> 微信名片
注:本文转载自blog.csdn.net的沧海一笑-dj的文章"https://blog.csdn.net/dengjin20104042056/article/details/98888646"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!