class="hide-preCode-box">

5.4 OsTryUnmapL1PTE函数

函数OsTryUnmapL1PTE()用于解除L1页表映射,其中参数需要MMU结构体、虚拟内存地址vaddr、页表项索引scanIndex和要解除映射的内存页数scanCount。调用该函数时,页表项索引传入参数scanIndex的实参为OsGetPte2Index(vaddr) + unmapCount,即虚拟内存对应的L2页表项索引加上解除映射的页数量;要解除映射的内存页数量参数的实参为MMU_DESCRIPTOR_L2_NUMBERS_PER_L1 - unmapCount,即256减去已经解除映射的数量。回忆上文调用该函数OsTryUnmapL1PTE()的代码处,先调用OsUnmapL2PTE()函数解除unmapCount个映射,然后调用该函数解除映射MMU_DESCRIPTOR_L2_NUMBERS_PER_L1 - unmapCount个映射。

⑴处先执行函数OsGetPte1(archMmu->virtTtb, vaddr)获取页表项,然后执行函数OsGetPte2BasePtr()获得L2页表项基地址。⑵处执行循环检测是否存在可以解除映射的页表映射。⑶当scanIndex等于256时,置为0。⑷处当L2页表项不为0时,此时存在L2页表映射,跳出while循环。⑸处页数减1,不为0时则继续while循环。

当可以解除映射的数量为0时,执行⑹处代码,先获取L1页表项索引l1Index,然后获取对应的页表项l1Entry。执行⑺清零页表项,然后清理TLB缓存。⑻处调用函数OsPutL2Table()释放L2页表项内存,其中第3个实际参数MMU_DESCRIPTOR_L1_PAGE_TABLE_ADDR(l1Entry)是L2y页表物理基地址。下面会详细看下函数的代码。

STATIC VOID OsTryUnmapL1PTE(const LosArchMmu *archMmu, vaddr_t vaddr, UINT32 scanIndex, UINT32 scanCount)
{
    /*
     * Check if all pages related to this l1 entry are deallocated.
     * We only need to check pages that we did not clear above starting
     * from scanIndex and wrapped around SECTION.
     */
    UINT32 l1Index;
    PTE_T l1Entry;
    PTE_T *pte2BasePtr = NULL;

⑴  pte2BasePtr = OsGetPte2BasePtr(OsGetPte1(archMmu->virtTtb, vaddr));
    if (pte2BasePtr == NULL) {
        VM_ERR("pte2 base ptr is NULL");
        return;
    }

⑵  while (scanCount) {
⑶      if (scanIndex == MMU_DESCRIPTOR_L2_NUMBERS_PER_L1) {
            scanIndex = 0;
        }
⑷      if (pte2BasePtr[scanIndex++]) {
            break;
        }
⑸      scanCount--;
    }

⑹  if (!scanCount) {
        l1Index = OsGetPte1Index(vaddr);
        l1Entry = archMmu->virtTtb[l1Index];
        /* we can kill l1 entry */
⑺      OsClearPte1(&archMmu->virtTtb[l1Index]);
        OsArmInvalidateTlbMvaNoBarrier(l1Index << MMU_DESCRIPTOR_L1_SMALL_SHIFT);

        /* try to free l2 page itself */
⑻      OsPutL2Table(archMmu, l1Index, MMU_DESCRIPTOR_L1_PAGE_TABLE_ADDR(l1Entry));
    }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

看下函数OsPutL2Table()的实现。⑴处遍历检查是否存在有L1页表项指向此L2页表,如果存在则返回。否则,需要释放L2页表项占用的内存。如果开启虚拟内存,则执行⑵获取物理内存对应的内存页,然后释放内存页。如果没有开启虚拟内存,则执行⑶调用函数LOS_MemFree()释放物理内存。

STATIC VOID OsPutL2Table(const LosArchMmu *archMmu, UINT32 l1Index, paddr_t l2Paddr)
{
    UINT32 index;
    PTE_T ttEntry;
    /* check if any l1 entry points to this l2 table */
    for (index = 0; index < MMU_DESCRIPTOR_L1_SMALL_L2_TABLES_PER_PAGE; index++) {
⑴      ttEntry = archMmu->virtTtb[ROUNDDOWN(l1Index, MMU_DESCRIPTOR_L1_SMALL_L2_TABLES_PER_PAGE) + index];
        if ((ttEntry &  MMU_DESCRIPTOR_L1_TYPE_MASK) == MMU_DESCRIPTOR_L1_TYPE_PAGE_TABLE) {
            return;
        }
    }
#ifdef LOSCFG_KERNEL_VM
    /* we can free this l2 table */
⑵  LosVmPage *vmPage = LOS_VmPageGet(l2Paddr);
    if (vmPage == NULL) {
        LOS_Panic("bad page table paddr %#x\n", l2Paddr);
        return;
    }

    LOS_ListDelete(&vmPage->node);
    LOS_PhysPageFree(vmPage);
#else
⑶  (VOID)LOS_MemFree(OS_SYS_MEM_ADDR, LOS_PaddrToKVaddr(l2Paddr));
#endif
}
 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/139635934","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/99115812"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!