当前位置: 首页 > news >正文

做 淘宝客最大的网站是叫什么名字广州企业建站找哪家

做 淘宝客最大的网站是叫什么名字,广州企业建站找哪家,新公司做网站怎么做,godaddy托管wordpress虚实映射解除函数LOS_ArchMmuUnmap解除进程空间虚拟地址区间与物理地址区间的映射关系#xff0c;其中参数包含MMU结构体、解除映射的虚拟地址和解除映射的数量count,数量的单位是内存页数。 ⑴处函数OsGetPte1用于获取指定虚拟地址对应的L1页表项数据。⑵处计算需要解除的无效…虚实映射解除函数LOS_ArchMmuUnmap解除进程空间虚拟地址区间与物理地址区间的映射关系其中参数包含MMU结构体、解除映射的虚拟地址和解除映射的数量count,数量的单位是内存页数。 ⑴处函数OsGetPte1用于获取指定虚拟地址对应的L1页表项数据。⑵处计算需要解除的无效映射的数量后文再详细分析该函数。如果页表项映射类型为L1 Section并且虚拟地址1MiB对齐映射的数量超过256则执行⑶解除映射Section后文详细分析函数OsUnmapSection。如果页表项映射类型为Page Table则执行⑷先解除二级页表映射然后尝试解除一级页表映射涉及的2个函数后文详细分析。从虚拟地址开始的需要接触映射的内存页中可能部分是L2映射部分是L1映射。完成L2映射后需要判断是否存在L1映射如果存在也需要解除映射。⑹处函数使TLB失效涉及些cp15寄存器和汇编后续再分析。 STATUS_T LOS_ArchMmuUnmap(LosArchMmu *archMmu, VADDR_T vaddr, size_t count) {PTE_T l1Entry;INT32 unmapped 0;UINT32 unmapCount 0;while (count 0) { ⑴ l1Entry OsGetPte1(archMmu-virtTtb, vaddr);if (OsIsPte1Invalid(l1Entry)) { ⑵ unmapCount OsUnmapL1Invalid(vaddr, count);} else if (OsIsPte1Section(l1Entry)) {if (MMU_DESCRIPTOR_IS_L1_SIZE_ALIGNED(vaddr) count MMU_DESCRIPTOR_L2_NUMBERS_PER_L1) { ⑶ unmapCount OsUnmapSection(archMmu, vaddr, count);} else {LOS_Panic(%s %d, unimplemented\n, __FUNCTION__, __LINE__);}} else if (OsIsPte1PageTable(l1Entry)) { ⑷ unmapCount OsUnmapL2PTE(archMmu, vaddr, count);OsTryUnmapL1PTE(archMmu, vaddr, OsGetPte2Index(vaddr) unmapCount,MMU_DESCRIPTOR_L2_NUMBERS_PER_L1 - unmapCount); ⑸ vaddr unmapCount MMU_DESCRIPTOR_L2_SMALL_SHIFT;} else {LOS_Panic(%s %d, unimplemented\n, __FUNCTION__, __LINE__);}unmapped unmapCount;} ⑹ OsArmInvalidateTlbBarrier();return unmapped; }5.1 函数OsUnmapL1Invalid 函数OsUnmapL1Invalid用于解除无效的映射会把虚拟地址增加映射的数量减少。⑴处的MMU_DESCRIPTOR_L1_SMALL_SIZE表示1MiB大小*vaddr % MMU_DESCRIPTOR_L1_SMALL_SIZE对1MiB取余MMU_DESCRIPTOR_L1_SMALL_SIZE - (*vaddr % MMU_DESCRIPTOR_L1_SMALL_SIZE)表示1MiB大小的内存中分为2部分一部分在虚拟地址vaddr前一部分在虚拟地址后这里取虚拟地址之后的部分。然后向右偏移12位MMU_DESCRIPTOR_L2_SMALL_SHIFT转换为内存页数量再取内存页数的较小的数值。⑵处把解除映射的内存页数量左移12位转换为地址长度然后更新虚拟地址。⑶处减去已经解除映射的数量。 STATIC INLINE UINT32 OsUnmapL1Invalid(vaddr_t *vaddr, UINT32 *count) {UINT32 unmapCount;⑴ unmapCount MIN2((MMU_DESCRIPTOR_L1_SMALL_SIZE - (*vaddr % MMU_DESCRIPTOR_L1_SMALL_SIZE)) MMU_DESCRIPTOR_L2_SMALL_SHIFT, *count); ⑵ *vaddr unmapCount MMU_DESCRIPTOR_L2_SMALL_SHIFT; ⑶ *count - unmapCount;return unmapCount; }5.2 函数OsUnmapSection 函数OsUnmapSection用于解除一级页表的Section映射。⑴处把虚拟地址对应的页表项数据清除为0。⑵处使TLB寄存器失效⑶更新虚拟地址和映射数量虚拟地址增加1MiB大小映射数量减去256。 STATIC UINT32 OsUnmapSection(LosArchMmu *archMmu, vaddr_t *vaddr, UINT32 *count) { ⑴ OsClearPte1(OsGetPte1Ptr((PTE_T *)archMmu-virtTtb, *vaddr)); ⑵ OsArmInvalidateTlbMvaNoBarrier(*vaddr);⑶ *vaddr MMU_DESCRIPTOR_L1_SMALL_SIZE;*count - MMU_DESCRIPTOR_L2_NUMBERS_PER_L1;return MMU_DESCRIPTOR_L2_NUMBERS_PER_L1; }5.3 函数OsUnmapL2PTE 函数OsUnmapL2PTE用于解除L2页表映射。⑴处先调用函数OsGetPte1()计算虚拟内存地址对应的L1页表项然后调用函数OsGetPte2BasePtr()计算虚拟地址对应的L2页表基地址。⑵处获取虚拟地址对应的的L2页表项索引计算方式上文已经讲述。⑶处计算需要解除映射的内存页数量MMU_DESCRIPTOR_L2_NUMBERS_PER_L1 - pte2Index表示虚拟内存地址对应的能解除映射的最大数量使用该值与count取最小值。⑷处依次解除各个二级页表的映射把对应的各个L2页表项设置为0。⑸处使TLB缓存失效。 STATIC UINT32 OsUnmapL2PTE(const LosArchMmu *archMmu, vaddr_t vaddr, UINT32 *count) {UINT32 unmapCount;UINT32 pte2Index;PTE_T *pte2BasePtr NULL;⑴ pte2BasePtr OsGetPte2BasePtr(OsGetPte1((PTE_T *)archMmu-virtTtb, vaddr));if (pte2BasePtr NULL) {LOS_Panic(%s %d, pte2 base ptr is NULL\n, __FUNCTION__, __LINE__);}⑵ pte2Index OsGetPte2Index(vaddr); ⑶ unmapCount MIN2(MMU_DESCRIPTOR_L2_NUMBERS_PER_L1 - pte2Index, *count);/* unmap page run */ ⑷ OsClearPte2Continuous(pte2BasePtr[pte2Index], unmapCount);/* invalidate tlb */ ⑸ OsArmInvalidateTlbMvaRangeNoBarrier(vaddr, unmapCount);*count - unmapCount;return unmapCount; }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));} }看下函数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 }如果大家想更加深入的学习 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
http://www.tj-hxxt.cn/news/233435.html

相关文章:

  • 网站速度慢wordpress福建龙岩昨天发生的新闻
  • 做木材生意的外贸网站网站建设设计技术方案模板下载
  • 广州购物网站建设关于公司建设网站的意义
  • 电子商务网站建设的评估工具机顶盒做网站
  • 中国建设银行黄冈分行网站织梦怎么制作网站
  • 电脑网站与手机的区别.net做网站之前设置
  • 发表评论的wordpress网站模板腾讯云物联网开发平台
  • 网站开发公司云鲸互创实惠做柜子比较好看的网站
  • php完整网站开发案例四川华地建设工程公司网站
  • 租赁公司网站源码新媒体运营需要具备哪些能力
  • 在常州 做兼职上什么网站模板网站 怎么做优化
  • 为什么用asp做网站网站制作排版注意事项
  • 帮忙做ppt赚钱的网站辽阳银梦网站建设
  • 山西企业模板建站服务营销
  • 中国城乡与住房建设部网站装修设计图网站排名
  • 城市分站cmswordpress加速之gzip
  • php做小公司网站用什么框架厦门建设局网站
  • 宁波seo推广推荐公司aso优化技术
  • 长春建站怎么做cf小号自助购买网站
  • 网站整体地图怎么做做网站是否用数据库
  • 网站建设课设总结自助建网站哪个便宜
  • h5模板网站免费有哪些做兼职的设计网站有哪些
  • 深圳网站设计兴田德润简介wordpress需要备案
  • dede网站搬家更换空间重新安装普通话考试最后一题万能模板
  • 2014 网站建设wordpress加文字水印
  • 遂宁网站建设跨境o2o网站建设方案
  • 国外公司建站系统wordpress mylife
  • 网站充值功能怎么做在线考试系统网站开发
  • 拼多多网站建设框架图可以做外贸私单的网站
  • 网站推广无锡番禺网站建设番禺网络营销