文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

鸿蒙轻内核A核源码分析系列之虚实映射(4)虚实映射查询

2024-12-02 14:52

关注

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

4、虚实映射查询函数LOS_ArchMmuQuery

给定一个虚拟内存地址,可以查询其映射到的物理内存地址,还可以查询映射标签属性信息,函数LOS_ArchMmuQuery负责完成这些信息的查询。

4.1 函数LOS_ArchMmuQuery

函数LOS_ArchMmuQuery用于获取进程空间虚拟地址对应的物理地址以及映射标签属性,其中输入参数为虚拟内存地址vaddr,输出参数为物理内存地址*paddr和标签属性*flags。⑴处获取虚拟地址对应的页表项。⑵处如果虚拟地址对应的页表项描述符类型无效,返回错误码。⑶处如果页表项描述符类型为L1页表Section类型映射,则执行⑷获取映射的物理地址,其中MMU_DESCRIPTOR_L1_SECTION_ADDR(l1Entry)为L1页表项的高12位,(vaddr & (MMU_DESCRIPTOR_L1_SMALL_SIZE - 1))为虚拟地址的低20位,即页内偏移值。可以和上文了解到的知识相对应,物理内存地址的计算方式为页表项的高12位加上虚拟内存地址的低20位,如下图所示。⑸处获取映射的标签属性,把MMU标签转换为内存区域标签。


如果虚拟地址对应的页表项描述符类型为页表Page Table,则执行⑹调用内联函数OsGetPte2BasePtr()计算L2页表项基地址,计算方法为:取L1页表项的高22位,低10位置0,得到L2页表项物理内存基地址,然后转化为L2页表项虚拟内存基地址。⑺处计算虚拟地址对应的L2页表项数值,从上文可知,L2页表项的指针地址在页表项基地址加上虚拟内存地址的高20位,取该地址的数据即为L2页表项数据。如果L2页表项描述符类型为小页,则执行⑻计算物理内存地址,其中MMU_DESCRIPTOR_L2_SMALL_PAGE_ADDR(l2Entry)为L2页表项的高20位;vaddr & (MMU_DESCRIPTOR_L2_SMALL_SIZE - 1)为虚拟地址的低12位,如下图所示。然后计算相应的标签值。⑼处表示当前轻内核还不支持大页类型。


  1. STATUS_T LOS_ArchMmuQuery(const LosArchMmu *archMmu, VADDR_T vaddr, PADDR_T *paddr, UINT32 *flags) 
  2. ⑴  PTE_T l1Entry = OsGetPte1(archMmu->virtTtb, vaddr); 
  3.     PTE_T l2Entry; 
  4.     PTE_T* l2Base = NULL
  5.  
  6. ⑵  if (OsIsPte1Invalid(l1Entry)) { 
  7.         return LOS_ERRNO_VM_NOT_FOUND; 
  8. ⑶  } else if (OsIsPte1Section(l1Entry)) { 
  9.         if (paddr != NULL) { 
  10. ⑷          *paddr = MMU_DESCRIPTOR_L1_SECTION_ADDR(l1Entry) + (vaddr & (MMU_DESCRIPTOR_L1_SMALL_SIZE - 1)); 
  11.         } 
  12.  
  13.         if (flags != NULL) { 
  14. ⑸          OsCvtSecAttsToFlags(l1Entry, flags); 
  15.         } 
  16.     } else if (OsIsPte1PageTable(l1Entry)) { 
  17. ⑹      l2Base = OsGetPte2BasePtr(l1Entry); 
  18.         if (l2Base == NULL) { 
  19.             return LOS_ERRNO_VM_NOT_FOUND; 
  20.         } 
  21. ⑺      l2Entry = OsGetPte2(l2Base, vaddr); 
  22.         if (OsIsPte2SmallPage(l2Entry) || OsIsPte2SmallPageXN(l2Entry)) { 
  23.             if (paddr != NULL) { 
  24. ⑻               *paddr = MMU_DESCRIPTOR_L2_SMALL_PAGE_ADDR(l2Entry) + (vaddr & (MMU_DESCRIPTOR_L2_SMALL_SIZE - 1)); 
  25.             } 
  26.  
  27.             if (flags != NULL) { 
  28.                 OsCvtPte2AttsToFlags(l1Entry, l2Entry, flags); 
  29.             } 
  30. ⑼      } else if (OsIsPte2LargePage(l2Entry)) { 
  31.             LOS_Panic("%s %d, large page unimplemented\n", __FUNCTION__, __LINE__); 
  32.         } else { 
  33.             return LOS_ERRNO_VM_NOT_FOUND; 
  34.         } 
  35.     } 
  36.  
  37.     return LOS_OK; 

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

来源:鸿蒙社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯