電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 593|回復(fù): 0
收起左側(cè)

鴻蒙內(nèi)核源碼分析:虛擬地址與物理地址之間是如何映射的

[復(fù)制鏈接]

2607

主題

2607

帖子

7472

積分

高級會員

Rank: 5Rank: 5

積分
7472
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-11-19 11:57:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
鴻蒙內(nèi)核源碼分析:虛擬地址與物理地址之間是如何映射的,   
MMU的本質(zhì) 虛擬地址(VA): 就是線性地址, 鴻蒙內(nèi)存部分全是VA的身影, 是由編譯器和鏈接器在定位程序時分配的,每個應(yīng)用程序都使用相同的虛擬內(nèi)存地址空間,而這些虛擬內(nèi)存地址空間實際上分別映射到不同的實際物理內(nèi)存空間上。CPU只知道虛擬地址,向虛擬地址要數(shù)據(jù),但在其保護模式下很悲催地址信號在路上被MMU攔截了,MMU把虛擬地址換成了物理地址,從而拿到了真正的數(shù)據(jù)。

物理地址(PA):程序的指令和常量數(shù)據(jù),全局變量數(shù)據(jù)以及運行時動態(tài)申請內(nèi)存所分配的實際物理內(nèi)存存放位置。

MMU采用頁表(page table)來實現(xiàn)虛實地址轉(zhuǎn)換,頁表項除了描述虛擬頁到物理頁直接的轉(zhuǎn)換外,還提供了頁的訪問權(quán)限(讀,寫,可執(zhí)行)和存儲屬性。 MMU的本質(zhì)是拿虛擬地址的高位(20位)做文章,低12位是頁內(nèi)偏移地址不會變。也就是說虛擬地址和物理地址的低12位是一樣的,本篇詳細(xì)講述MMU是如何變戲法的。

MMU是通過兩級頁表結(jié)構(gòu):L1和L2來實現(xiàn)映射功能的,鴻蒙內(nèi)核當(dāng)然也實現(xiàn)了這兩級頁表轉(zhuǎn)換的實現(xiàn)。本篇是系列篇關(guān)于內(nèi)存部分最滿意的一篇,也是最不好理解的一篇, 強烈建議結(jié)合源碼看, 鴻蒙內(nèi)核源碼注釋中文版 【 Gitee倉 | CSDN倉 | Github倉 | Coding倉 】內(nèi)存部分的注釋已經(jīng)基本完成 。


一級頁表L1 L1頁表將全部的4G地址空間劃分為4096個1M的節(jié),頁表中每一項(頁表項)32位,其內(nèi)容是L2頁表基地址或某個1M物理內(nèi)存的基地址。虛擬地址的高12位用于對頁表項定位,也就是4096個頁面項的索引,L1頁表的基地址,也叫轉(zhuǎn)換表基地址,存放在CP15的C2(TTB)寄存器中,鴻蒙內(nèi)核源碼分析(內(nèi)存匯編篇)中有詳細(xì)的描述,自行翻看。 L1頁表項有三種描述格式,鴻蒙源碼如下:

  • /* L1 descriptor type */
  • #define MMU_DESCRIPTOR_L1_TYPE_INVALID                          (0x0 << 0)
  • #define MMU_DESCRIPTOR_L1_TYPE_PAGE_TABLE                     (0x1 << 0)
  • #define MMU_DESCRIPTOR_L1_TYPE_SECtiON                          (0x2 << 0)
  • #define MMU_DESCRIPTOR_L1_TYPE_MASK                             (0x3 << 0)
      
第一種:Fault(INVALID)頁表項,表示對應(yīng)虛擬地址未被映射,訪問將產(chǎn)生一個數(shù)據(jù)中止異常。 第二種:PAGE_TABLE頁表項,指向L2頁表的頁表項,意思就是把1M分成更多的頁(256*4K) 第三種:SECTION頁表項 ,指向1M節(jié)的頁表項
回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表