国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

鴻蒙輕內(nèi)核A核源碼分析系列之虛實映射(2)虛實映射初始化

開發(fā) 前端
虛實映射其實就是一個建立頁表的過程。MMU支持多級頁表,LiteOS-A內(nèi)核采用二級頁表描述進程空間。首先介紹下一級頁表和二級頁表。

[[438168]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

2、 虛擬映射初始化

在文件kernel/base/vm/los_vm_boot.c中的系統(tǒng)內(nèi)存初始化函數(shù)OsSysMemInit()會調(diào)用虛實映射初始化函數(shù)OsInitMappingStartUp()。該函數(shù)代碼定義在文件arch/arm/arm/src/los_arch_mmu.c,代碼如下。

⑴處函數(shù)使TLB失效,清理虛實映射緩存數(shù)據(jù),涉及些cp15寄存器和匯編,后續(xù)再分析。

⑵處函數(shù)切換到臨時TTB。

⑶處設置內(nèi)核地址空間的映射。下面分別詳細這些函數(shù)代碼。

  1. VOID OsInitMappingStartUp(VOID) 
  2. ⑴   OsArmInvalidateTlbBarrier(); 
  3.  
  4. ⑵   OsSwitchTmpTTB(); 
  5.  
  6. ⑶  OsSetKSectionAttr(KERNEL_VMM_BASE, FALSE); 
  7.     OsSetKSectionAttr(UNCACHED_VMM_BASE, TRUE); 
  8.     OsKSectionNewAttrEnable(); 

2.1 函數(shù)OsSwitchTmpTTB

函數(shù)OsSwitchTmpTTB申請16KiB的內(nèi)存存放L1頁表項數(shù)據(jù),把頁表項數(shù)據(jù)從g_firstPageTable復制到申請的內(nèi)存區(qū)域。⑴處獲取內(nèi)核地址空間。L1頁表由4096個頁表項組成,每個4KiB,共需要16KiB大小。所以⑵處代碼按16KiB對齊申請16KiB大小的內(nèi)存區(qū)域存放L1頁表項。⑶處設置內(nèi)核虛擬內(nèi)存地址空間的轉(zhuǎn)換表基地址TTB。⑷處把g_firstPageTable頁表數(shù)據(jù)復制到內(nèi)核地址空間的轉(zhuǎn)換表區(qū)域。如果復制失敗,則直接使用g_firstPageTable。⑸處設置內(nèi)核虛擬地址空間的TTB轉(zhuǎn)換地址對應的物理內(nèi)存地址,然后調(diào)用函數(shù)OsArmWriteTtbr0寫入MMU寄存器。

  1. STATIC VOID OsSwitchTmpTTB(VOID) 
  2.     PTE_T *tmpTtbase = NULL
  3.     errno_t err; 
  4. ⑴   LosVmSpace *kSpace = LOS_GetKVmSpace(); 
  5.  
  6.     /* ttbr address should be 16KByte align */ 
  7. ⑵   tmpTtbase = LOS_MemAllocAlign(m_aucSysMem0, MMU_DESCRIPTOR_L1_SMALL_ENTRY_NUMBERS, 
  8.                                   MMU_DESCRIPTOR_L1_SMALL_ENTRY_NUMBERS); 
  9.     if (tmpTtbase == NULL) { 
  10.         VM_ERR("memory alloc failed"); 
  11.         return
  12.     } 
  13.  
  14. ⑶  kSpace->archMmu.virtTtb = tmpTtbase; 
  15. ⑷  err = memcpy_s(kSpace->archMmu.virtTtb, MMU_DESCRIPTOR_L1_SMALL_ENTRY_NUMBERS, 
  16.                    g_firstPageTable, MMU_DESCRIPTOR_L1_SMALL_ENTRY_NUMBERS); 
  17.     if (err != EOK) { 
  18.         (VOID)LOS_MemFree(m_aucSysMem0, tmpTtbase); 
  19.         kSpace->archMmu.virtTtb = (VADDR_T *)g_firstPageTable; 
  20.         VM_ERR("memcpy failed, errno: %d", err); 
  21.         return
  22.     } 
  23. ⑸  kSpace->archMmu.physTtb = LOS_PaddrQuery(kSpace->archMmu.virtTtb); 
  24.     OsArmWriteTtbr0(kSpace->archMmu.physTtb | MMU_TTBRx_FLAGS); 
  25.     ISB; 

2.2 函數(shù)OsSetKSectionAttr

內(nèi)部函數(shù)OsSetKSectionAttr用于設置內(nèi)核虛擬地址空間的區(qū)間屬性,分別針對內(nèi)核虛擬地址空間的內(nèi)核區(qū)間[KERNEL_ASPACE_BASE,KERNEL_ASPACE_BASE+KERNEL_ASPACE_SIZE]和未緩存區(qū)間[UNCACHED_VMM_BASE,UNCACHED_VMM_BASE+UNCACHED_VMM_SIZE]進行設置。內(nèi)核虛擬地址空間是固定映射到物理內(nèi)存的,內(nèi)核地址空間的映射包含代碼段、數(shù)據(jù)段、堆棧區(qū)間映射,如下示意圖所示:

鴻蒙輕內(nèi)核A核源碼分析系列五 虛實映射(2)虛實映射初始化-鴻蒙HarmonyOS技術(shù)社區(qū)

⑴處計算相對內(nèi)核虛擬地址空間基地址KERNEL_VMM_BASE的偏移大小。⑵處先計算相對偏移值的text、rodata、data_bss段的虛擬內(nèi)存地址,然后創(chuàng)建這些段的虛實映射關(guān)系數(shù)組mmuKernelMappings。⑶處設置內(nèi)核虛擬地址區(qū)間的虛擬轉(zhuǎn)換基地址TTB和物理轉(zhuǎn)換基地址TTB。然后解除虛擬地址virtAddr的虛實映射,解除映射的長度就是代碼段、只讀數(shù)據(jù)段、數(shù)據(jù)BSS段這些內(nèi)存段的長度。⑷處按指定的標簽flags對text代碼段之前的內(nèi)存區(qū)間進行虛實映射。⑸處映射text代碼段、rodata只讀數(shù)據(jù)段、data_bss數(shù)據(jù)段的內(nèi)存區(qū)間,并調(diào)用函數(shù)LOS_VmSpaceReserve在進程空間中預定地址區(qū)間。⑹是BSS段后面的heap區(qū)、stack區(qū)的映射,映射虛擬地址空間的內(nèi)存堆棧區(qū)間到對應的物理內(nèi)存區(qū)間。

  1. STATIC VOID OsSetKSectionAttr(UINTPTR virtAddr, BOOL uncached) 
  2. ⑴  UINT32 offset = virtAddr - KERNEL_VMM_BASE; 
  3.     /* every section should be page aligned */ 
  4. ⑵  UINTPTR textStart = (UINTPTR)&__text_start + offset; 
  5.     UINTPTR textEnd = (UINTPTR)&__text_end + offset; 
  6.     UINTPTR rodataStart = (UINTPTR)&__rodata_start + offset; 
  7.     UINTPTR rodataEnd = (UINTPTR)&__rodata_end + offset; 
  8.     UINTPTR ramDataStart = (UINTPTR)&__ram_data_start + offset; 
  9.     UINTPTR bssEnd = (UINTPTR)&__bss_end + offset; 
  10.     UINT32 bssEndBoundary = ROUNDUP(bssEnd, MB); 
  11.     LosArchMmuInitMapping mmuKernelMappings[] = { 
  12.         { 
  13.             .phys = SYS_MEM_BASE + textStart - virtAddr, 
  14.             .virt = textStart, 
  15.             .size = ROUNDUP(textEnd - textStart, MMU_DESCRIPTOR_L2_SMALL_SIZE), 
  16.             .flags = VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_EXECUTE, 
  17.             .name = "kernel_text" 
  18.         }, 
  19.         { 
  20.             .phys = SYS_MEM_BASE + rodataStart - virtAddr, 
  21.             .virt = rodataStart, 
  22.             .size = ROUNDUP(rodataEnd - rodataStart, MMU_DESCRIPTOR_L2_SMALL_SIZE), 
  23.             .flags = VM_MAP_REGION_FLAG_PERM_READ, 
  24.             .name = "kernel_rodata" 
  25.         }, 
  26.         { 
  27.             .phys = SYS_MEM_BASE + ramDataStart - virtAddr, 
  28.             .virt = ramDataStart, 
  29.             .size = ROUNDUP(bssEndBoundary - ramDataStart, MMU_DESCRIPTOR_L2_SMALL_SIZE), 
  30.             .flags = VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_WRITE, 
  31.             .name = "kernel_data_bss" 
  32.         } 
  33.     }; 
  34.     LosVmSpace *kSpace = LOS_GetKVmSpace(); 
  35.     status_t status; 
  36.     UINT32 length; 
  37.     int i; 
  38.     LosArchMmuInitMapping *kernelMap = NULL
  39.     UINT32 kmallocLength; 
  40.     UINT32 flags; 
  41.  
  42.     /* use second-level mapping of default READ and WRITE */ 
  43. ⑶  kSpace->archMmu.virtTtb = (PTE_T *)g_firstPageTable; 
  44.     kSpace->archMmu.physTtb = LOS_PaddrQuery(kSpace->archMmu.virtTtb); 
  45.     status = LOS_ArchMmuUnmap(&kSpace->archMmu, virtAddr, 
  46.                               (bssEndBoundary - virtAddr) >> MMU_DESCRIPTOR_L2_SMALL_SHIFT); 
  47.     if (status != ((bssEndBoundary - virtAddr) >> MMU_DESCRIPTOR_L2_SMALL_SHIFT)) { 
  48.         VM_ERR("unmap failed, status: %d", status); 
  49.         return
  50.     } 
  51.  
  52.     flags = VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_WRITE | VM_MAP_REGION_FLAG_PERM_EXECUTE; 
  53.     if (uncached) { 
  54.         flags |= VM_MAP_REGION_FLAG_UNCACHED; 
  55.     } 
  56. ⑷  status = LOS_ArchMmuMap(&kSpace->archMmu, virtAddr, SYS_MEM_BASE, 
  57.                             (textStart - virtAddr) >> MMU_DESCRIPTOR_L2_SMALL_SHIFT, 
  58.                             flags); 
  59.     if (status != ((textStart - virtAddr) >> MMU_DESCRIPTOR_L2_SMALL_SHIFT)) { 
  60.         VM_ERR("mmap failed, status: %d", status); 
  61.         return
  62.     } 
  63.  
  64. ⑸  length = sizeof(mmuKernelMappings) / sizeof(LosArchMmuInitMapping); 
  65.     for (i = 0; i < length; i++) { 
  66.         kernelMap = &mmuKernelMappings[i]; 
  67.         if (uncached) { 
  68.             kernelMap->flags |= VM_MAP_REGION_FLAG_UNCACHED; 
  69.         } 
  70.         status = LOS_ArchMmuMap(&kSpace->archMmu, kernelMap->virt, kernelMap->phys, 
  71.                                  kernelMap->size >> MMU_DESCRIPTOR_L2_SMALL_SHIFT, kernelMap->flags); 
  72.         if (status != (kernelMap->size >> MMU_DESCRIPTOR_L2_SMALL_SHIFT)) { 
  73.             VM_ERR("mmap failed, status: %d", status); 
  74.             return
  75.         } 
  76.         LOS_VmSpaceReserve(kSpace, kernelMap->size, kernelMap->virt); 
  77.     } 
  78.  
  79. ⑹   kmallocLength = virtAddr + SYS_MEM_SIZE_DEFAULT - bssEndBoundary; 
  80.     flags = VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_WRITE; 
  81.     if (uncached) { 
  82.         flags |= VM_MAP_REGION_FLAG_UNCACHED; 
  83.     } 
  84.     status = LOS_ArchMmuMap(&kSpace->archMmu, bssEndBoundary, 
  85.                             SYS_MEM_BASE + bssEndBoundary - virtAddr, 
  86.                             kmallocLength >> MMU_DESCRIPTOR_L2_SMALL_SHIFT, 
  87.                             flags); 
  88.     if (status != (kmallocLength >> MMU_DESCRIPTOR_L2_SMALL_SHIFT)) { 
  89.         VM_ERR("mmap failed, status: %d", status); 
  90.         return
  91.     } 
  92.     LOS_VmSpaceReserve(kSpace, kmallocLength, bssEndBoundary); 

2.3 函數(shù)OsKSectionNewAttrEnable

函數(shù)OsKSectionNewAttrEnable設置虛實地址的轉(zhuǎn)換表基地址TTB并清楚TLB緩存。⑴處獲取內(nèi)核虛擬進程空間,⑵處設置進程空間MMU的虛擬地址轉(zhuǎn)換表基地址TTB,然后查詢到物理內(nèi)存地址并設置物理內(nèi)存地址轉(zhuǎn)換表基地址。⑶處從CP15 C2寄存器讀取TTB地址,取高20位。⑷處將內(nèi)核物理內(nèi)存頁表基地址寫入CP15 c2 TTB寄存器。⑸處清空TLB緩沖區(qū),然后釋放內(nèi)存。涉及到了MMU寄存器,后續(xù)系列會專門詳細講解。

  1. STATIC VOID OsKSectionNewAttrEnable(VOID) 
  2. ⑴  LosVmSpace *kSpace = LOS_GetKVmSpace(); 
  3.     paddr_t oldTtPhyBase; 
  4.  
  5. ⑵  kSpace->archMmu.virtTtb = (PTE_T *)g_firstPageTable; 
  6.     kSpace->archMmu.physTtb = LOS_PaddrQuery(kSpace->archMmu.virtTtb); 
  7.  
  8.     /* we need free tmp ttbase */ 
  9. ⑶  oldTtPhyBase = OsArmReadTtbr0(); 
  10.     oldTtPhyBase = oldTtPhyBase & MMU_DESCRIPTOR_L2_SMALL_FRAME; 
  11. ⑷  OsArmWriteTtbr0(kSpace->archMmu.physTtb | MMU_TTBRx_FLAGS); 
  12.     ISB; 
  13.  
  14.     /* we changed page table entry, so we need to clean TLB here */ 
  15. ⑸  OsCleanTLB(); 
  16.  
  17.     (VOID)LOS_MemFree(m_aucSysMem0, (VOID *)(UINTPTR)(oldTtPhyBase - SYS_MEM_BASE + KERNEL_VMM_BASE)); 

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-12-03 16:22:05

鴻蒙HarmonyOS應用

2021-12-03 16:20:26

鴻蒙HarmonyOS應用

2021-12-01 15:59:22

鴻蒙HarmonyOS應用

2022-03-11 20:23:14

鴻蒙源碼分析進程管理

2022-01-12 10:50:23

鴻蒙HarmonyOS應用

2022-01-10 15:31:44

鴻蒙HarmonyOS應用

2022-04-13 11:02:12

鴻蒙事件模塊事件Event

2022-03-03 18:28:28

Harmony進程任務管理模塊

2021-06-04 09:57:49

鴻蒙HarmonyOS應用

2021-11-08 15:06:15

鴻蒙HarmonyOS應用

2021-05-08 15:14:50

鴻蒙HarmonyOS應用

2021-06-04 14:15:10

鴻蒙HarmonyOS應用

2021-11-05 15:00:33

鴻蒙HarmonyOS應用

2021-05-17 09:28:59

鴻蒙HarmonyOS應用

2022-04-13 11:12:43

鴻蒙輕內(nèi)核信號量模塊操作系統(tǒng)

2021-05-25 09:28:34

鴻蒙HarmonyOS應用

2021-10-20 16:08:57

鴻蒙HarmonyOS應用

2022-01-14 08:39:47

鴻蒙HarmonyOS應用

2021-05-31 20:30:55

鴻蒙HarmonyOS應用

2021-06-17 09:36:07

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲一级黄色av| 欧美一区影院| 免费av一区二区三区| 亚洲国产综合色| 老司机精品在线| 国产又粗又猛又爽又黄的网站| 欧美不卡一区二区三区四区| 在线欧美福利| 国产小视频在线观看| 国产欧美在线观看| 一区二区三区日韩精品视频| 成人动态视频| 538在线视频观看| 久精品免费视频| 久久综合丝袜日本网| 亚洲成人精品综合在线| 日韩小视频在线播放| 日韩中文字幕在线免费观看| 成人高清视频免费观看| 成人在线免费av| 国产精品久久中文字幕| 色诱女教师一区二区三区| 国产91在线看| 久久99国产精品二区高清软件| 亚洲国产精品无码观看久久| 在线电影av不卡网址| 成人天堂资源www在线| 亚洲国产91视频| 91n.com在线观看| 午夜免费日韩视频| 一区二区三区四区在线免费观看| 国产欧美一区二区三区精品观看| 97影院在线观看| 成人精品网站在线观看| 色婷婷精品大视频在线蜜桃视频| 午夜亚洲福利| 国产在线电影| 日韩欧美精品一区二区| 亚洲欧美日韩在线高清直播| 成人午夜激情在线| 欧美午夜网站| 嫩草视频在线观看| 91久久久久久国产精品| 欧美日韩国产免费| 蜜桃精品视频在线观看| 欧美爱爱视频| 免费国产视频| 久久99国产精品| 亚洲欧美中文另类| 久久久欧美精品sm网站| 婷婷成人综合| eeuss影院www在线播放| 亚洲欧洲精品一区| 中文字幕av一区二区三区谷原希美| 91免费观看视频| 国产精品免费不| av在线二区| www.黄色网址.com| 91国语精品自产拍在线观看性色 | 国产精品日韩在线一区| 欧美日韩免费在线观看| 久久99伊人| 欧美网站免费| 特黄国产免费播放| 蜜桃av色综合| 最近2019年好看中文字幕视频| 国产精品国产三级国产专播品爱网 | 欧美激情极品| 都市激情一区| 国产传媒久久久| 国产精品www| 精品国产乱码久久久久久影片| 91在线播放网址| 国产精品久久久久一区二区三区厕所 | 99thz桃花论族在线播放| 国产成人精品视频免费看| 国产精品免费观看在线| 日韩欧美第一区| 972aa.com艺术欧美| 天天久久综合| 一区二区视频免费完整版观看| 可播放的18gay1069| 亚洲人成77777| 97色伦亚洲国产| 91麻豆精品国产91久久久| 久久青草欧美一区二区三区| 伊人成人在线视频| 国产精品一区二区精品视频观看| 欧美日韩国产综合视频 | 欧美一级在线观看| 久久精品视频一区二区| 亚洲精品三级| 久久aimee| 久久亚洲资源| 性色av一区二区| 日韩成人手机在线| 成人黄色在线免费观看| 久久国产精品久久久| 制服丝袜在线91| 中文字幕日韩一区| 国产精品一卡二卡在线观看| 婷婷久久综合| 日韩国产91| 快射视频在线观看| 成人eeuss影院在线观看| 亚洲精品中字| 国产精品欧美日韩久久| 精品国偷自产在线视频| 欧美日韩三级一区二区| 亚洲视频一区二区在线| 国产激情一区二区三区| 国产亚洲精品bv在线观看| 日本三级久久| 国产极品嫩模在线观看91精品| 69久久精品| 超碰97在线免费| 人人妻人人添人人爽欧美一区| 欧美久久综合性欧美| 国产精品96久久久久久又黄又硬| 色婷婷久久av| 日韩一区二区三区高清免费看看| 夜夜爽夜夜爽精品视频| 久久人人超碰精品| 久久se精品一区精品二区| 精品1区2区3区4区| 宅男在线一区| 一区二区日韩| 婷婷激情一区| 伦理在线一区| se在线电影| 日韩精品视频无播放器在线看| 天堂一区在线观看| 俄罗斯av网站| 国产一区一区三区| 久久大片网站| 国产欧美va欧美va香蕉在| 欧美激情二区三区| 久久精品亚洲精品| 亚洲免费一级电影| 欧美成人一区二区三区片免费| 色综合视频在线观看| 亚洲一区免费视频| 国产精品免费人成网站| 99精品国产一区二区三区不卡| 毛片av一区二区三区| 亚洲精品123区| 国产精品99久久精品| 黑人操亚洲人| 欧美激情网址| 国产91精品入| 欧美一区一区| 国产视频一区二| 免费成人高清在线视频| 日韩和的一区二在线| 亚洲男人av| 亚洲美女久久精品| 精品丝袜一区二区三区| 亚洲加勒比久久88色综合| 成人国产精品免费视频| 成人欧美在线观看| 午夜欧美性电影| 最近久乱中文字幕| 在线视频国产区| 香蕉国产精品偷在线观看不卡| 91亚洲精华国产精华精华液| 欧美性xxxxx极品娇小| 91精品欧美福利在线观看| 国产成人8x视频一区二区| 亚洲成av人片观看| 欧美第一页在线| 57pao成人国产永久免费| 中文字幕日韩精品一区二区| 亚洲做受高潮| 国产精品一级二级三级| 日韩欧美在线网址| 久久久亚洲精品视频| 午夜精品久久久久久久无码| 精品一区二区三区中文字幕在线| 亚洲另类春色校园小说| 国产精品综合av一区二区国产馆| 992tv成人免费视频| 亚洲精品天天看| 91蜜桃网址入口| 激情国产一区| 91美女视频网站| 亚洲少妇最新在线视频| 国产精品夫妻自拍| 色诱女教师一区二区三区| 久久久一本精品99久久精品| 国产原创av在线| 自拍欧美日韩| 欧美一区二区在线视频| 成人中心免费视频| 亚洲欧洲成人| 亚洲欧美日韩国产一区二区| 日韩的一区二区| 日韩欧美精品在线不卡 | 伊人久久大香线蕉精品组织观看| 狠狠综合久久av一区二区小说| 麻豆av一区二区|