当前位置: 首页 > 科技观察

鸿蒙之光内核A核心源码解析系列之虚拟现实映射(四)虚拟现实映射查询

时间:2023-03-22 11:16:04 科技观察

更多内容请访问:鸿蒙技术社区https://harmonyos.51cto.com与华为官方共建4.虚拟RealityMapping查询函数LOS_ArchMmuQuery给定一个虚拟内存地址,可以查询其映射到的物理内存地址,也可以查询映射标签属性信息。LOS_ArchMmuQuery函数负责完成这些信息的查询。4.1LOS_ArchMmuQuery函数LOS_ArchMmuQuery函数用于获取进程空间虚拟地址对应的物理地址和映射标签属性。输入参数为虚拟内存地址vaddr,输出参数为物理内存地址*paddr和标签属性*flags。(1)获取虚拟地址对应的页表项。(2)如果虚拟地址对应的页表项描述符类型无效,则返回错误码。(3)如果页表项描述符类型为L1页表Section类型映射,则执行(4)获取映射后的物理地址,其中MMU_DESCRIPTOR_L1_SECTION_ADDR(l1Entry)为L1页表项的高12位,(vaddr&(MMU_DESCRIPTOR_L1_SMALL_SIZE-1))是虚拟地址的低20位,即页中的偏移值。对应上面学到的知识,物理内存地址的计算方式是页表项的高12位加上虚拟内存地址的低20位,如下图所示。(5)获取映射的标签属性,将MMU标签转换为内存区标签。如果虚拟地址对应的页表项描述符类型为PageTable,则执行(6),调用内联函数OsGetPte2BasePtr()计算L2页表项的基地址。计算方法是:取L1页表项的高22位,低Position10为0,得到L2页表项的物理内存基地址,然后转换成虚拟内存基地址L2页表项。(7)计算虚拟地址对应的L2页表项的值。由上可知,L2页表项的指针地址为页表项的基地址加上虚拟内存地址的高20位。该地址的数据是二级页表项数据。如果L2页表项描述符类型为小页,则执行(8)计算物理内存地址,其中MMU_DESCRIPTOR_L2_SMALL_PAGE_ADDR(l2Entry)为L2页表项的高20位;vaddr&(MMU_DESCRIPTOR_L2_SMALL_SIZE-1)是虚拟地址的低12位,如下图。然后计算对应的标签值。⑼表示当前lightkernel不支持hugepage类型。status_tlos_archmmuquery(constlosarchmmu*Archmmu,vaddr_tvaddr,paddr_t*paddr,uint32*flags){⑴pte_tl1entry=osgetPte1(archmmu->firtttb,vaddr)(OsIsPte1Section(l1Entry)){if(paddr!=NULL){⑷*paddr=MMU_DESCRIPTOR_L1_SECTION_ADDR(l1Entry)+(vaddr&(MMU_DESCRIPTOR_L1_SMALL_SIZE-1));}if(flags!=NULL){⑸OsCvtSecAttsToFlags,flagl1};}elseif(OsIsPte1PageTable(l1Entry)){l2Base=OsGetPte2BasePtr(l1Entry);if(l2Base==NULL){returnLOS_ERRNO_VM_NOT_FOUND;}⑺l2Entry=OsGetPte2(l2Base,vaddr);if(OsIsPte2SmallPage(l2Entry)||OsIsPageXNtry)(l2SmallPageXNtry)如果(paddr!=NULL){⑻*paddr=MMU_DESCRIPTOR_L2_SMALL_PAGE_ADDR(l2Entry)+(vaddr&(MMU_DESCRIPTOR_L2_SMALL_SIZE-1));}if(flags!=NULL){OsCvtPte2AttsToFlags(l1Entry,l2Entry,flags);}⑼}elPagete(2OsLargePagete(2(l2Entry)){LOS_Panic("%s%d,largepageunimplemented\n",__FUNCTION__,__LINE__);}else{returnLOS_ERRNO_VM_NOT_FOUND;}}returnLOS_OK;}更多内容请访问:https://harmonyos.51cto.com,与华为共建的鸿蒙技术社区