新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM存儲管理系統MMU

        ARM存儲管理系統MMU

        作者: 時間:2016-11-10 來源:網絡 收藏
        一、虛擬地址和物理地址的區別

        CPU通過地址來訪問內存中的單元,地址有虛擬地址和物理地址之分。如果CPU沒有MMU(Memory Management Unit,內存管理單元),或者有MMU但沒有啟用,CPU在訪問內存時發出的地址將直接傳送到地址總線上,使具有相同地址的物理存儲器被讀寫。這稱為物理地址(Physical Address,以下簡稱PA),如下圖所示:

        本文引用地址:http://www.104case.com/article/201611/317531.htm

        圖1.物理地址示意圖

        如果CPU啟用了MMU,CPU核發出的地址將被MMU截獲,從CPU到MMU的地址稱為虛擬地址(Virtual Address,以下簡稱VA),而MMU將這個地址翻譯成真正的物理地址發送到地址總線上,也就是將虛擬地址映射成物理地址,如下圖所示:


        圖2.虛擬地址示意圖

        二、虛擬地址映射物理地址原理

        頁表是實現虛擬地址到物理地址轉換的一個重要手段。我們在使用MMU以前,需要在內存中新建一個頁表。表中的每一行(即一個字的大?。┐娣诺氖且粋€物理內存頁的基地址,該頁的訪問權限和緩沖特性等,這里將頁表中這樣的一行稱為一個地址變換條目。頁表存放在內存中,CP15的C2寄存器用來存放頁表的基地址。

        多數使用虛擬存儲器的系統都使用一種稱為分頁(paging)。虛擬地址空間劃分成稱為頁(page)的單位。而相應的物理地址空間也被進行劃分,單位是頁框(frame).頁和頁框的大小必須相同。

        虛擬地址被MMU分為兩部分,,第一部分是頁號索引(page Index),第二部分則是相對該頁首地址的偏移量(offset)

        當CPU訪問一個地址時,該地址是虛擬地址,于是該地址被送到MMU,MMU再根據虛擬地址的高幾位作為頁號索引,在頁表中尋找對應的地址變換條目。從地址變換條目中找到物理地址的頁基地址,再加上虛擬地址中的偏移量,便得到了真正的物理地址,然后由MMU將物理地址發送到地址總線上,訪問物理內存。

        那么MMU是如何使用頁號索引在頁表中找到對應的地址變換條目呢?MMU會用CP15協處理其中的C2寄存器存放的頁表基地址加上虛擬地址的頁號索引值,然后便得到了頁表中對應的地址變換條目的地址。其實頁號索引就是相對于頁表基地址的一個偏移量,然后使用基地址加偏移量的方式得到一個頁表中的地址。

        例:如圖所示,如果分頁大小為1M,虛擬地址為0x30000012,

        虛擬地址的二進制碼為00110000 00000000 00000000 00010010 前12位為頁號索引,后20位為偏移量,因為2^20 = 1M

        前12位頁號索引為00110000 0000 = 768,所以在頁表中找到相對于頁表基地址的偏移量為768的地址,然后得到地址變換條目。于是0x0300 << 20位,便得到了物理頁基地址,再加上虛擬地址中的偏移位0000 00000000 00010010 = 0x12,便得到了真正的物理地址0x30000012。



        1、TLB的概念

        從虛擬地址到物理地址的變換過程其實就是查詢頁表的過程,由于頁表存放在內存中,這個查詢過程通常代價很大。而程序在執行過程中具有局部性,也就是說,一段時間內,對頁表的訪問只是局限在少數幾個單元中。根據這個特點,采用一個容量更小、訪問速度更快的存儲器來存放當前訪問需要的地址變換條目。這個小容量的頁表稱為快表,也稱TLB.

        當CPU訪問內存時,現在TLB中查找需要的地址變換條目。如果該條目不存在,CPU從位于內存的頁表中查詢,并把相應的結果添加到TLB中。這樣,當CPU下一次又需要該地址變換條目時,可以從TLB中直接得到,從而使地址變換的速度大大加快。

        當內存中的頁表內容改變,或者通過修改CP15中的寄存器C2使用新的頁表時,TLB的內容需要全部清除。MMU提供了相關的硬件支持這種操作。CP15中的寄存器C8用來 控制清除TLB內容的相關操作。

        MMU可以將某些地址變換條目鎖定在TLB中,從而使得進行與該地址變換條目相關的地址變換速度保持很快。在MMU中C10用于控制TLB內容的鎖定。

        注:TLB中存放的是地址變換條目,相當于一個小頁表。

        • 使無效TLB內容
        當內存中的頁表內容改變,或者通過修改協處理器CP15的寄存器來使用新的頁表時,TLB中的內容需要全部或者部分使無效。所謂使無效是指將TLB中的某個地址的地址變換條目表示成無效,從而在TLB中找不到該地址變換條目,而需要到內存頁表中重新查找該地址變換條目。如果不進行TLB的使無效操作,可能造成同一個虛擬地址對應于不同的物理地址(TLB中保存的還是舊的地址映射關系,而內存中的頁表已經存了新的地址映射關系)。

        有時候頁表可能只是部分內容改變了,只影響了很少的地址映射關系,這種情況下,可以只使無效TLB對應的單個地址變換條目可能會提高系統性能。

        系統協處理器CP15的寄存器C8就是清除TLB內容的相關操作。它是一個只寫的寄存器。

        MCR p15,0,Rd,c8,CRm,opcode_2

        Rd中為要寫入C8寄存器的內容,CRm和opcode_2的不同組合決定指令執行的不同操作。

        指令

        Rd

        含義

        MCR p15, 0, Rd, c8, c5, 0

        0

        使無效整個指令TLB

        MCR p15, 0, Rd, c8, c5, 1

        虛擬地址

        使無效指令TLB中的單個地址變換條目

        MCR p15, 0, Rd, c8, c6, 0

        0

        使無效整個數據TLB

        MCR p15, 0, Rd, c8, c6, 1

        虛擬地址

        使無效數據TLB中的單個地址變換條目

        MCR p15, 0, , c8, c7, 0

        0

        使無效整個數據和指令TLB

        MCR p15, 0, , c8, c7, 1

        虛擬地址

        使無效數據和指令TLB中的單個地址變換條目

        • 鎖定TLB的內容

        2、存儲訪問過程

        a、使能MMU時的存儲訪問過程。

        ARM處理器請求存儲訪問時,首先在TLB中查找虛擬地址。如果系統中數據TLB和指令TLB是分開的,在取指令時,從指令TLB查找相應的虛擬地址,對于其他內存訪問操作,從數據TLB中查找相應的虛擬地址。

        如果虛擬地址對應的地址變換條目不在TLB中,CPU從位于內存的頁表中查詢,并把相應的結果添加到TLB中。如果TLB已經滿了,還需要根據一定的淘汰算法進行替換。這樣,當CPU下一次又需要該地址變換條目時,可以從TLB中直接得到,從而使地址變換的速度大大加快。

        當得到了需要的地址變化條目以后,將進行以下操作

        (1)得到該虛擬地址對應的物理地址
        (2)根據條目中的C(cache)控制位和B(Bufferable)控制位決定是否緩存該內存訪問的結果
        (3)根據存取權限控制位和域訪問控制位確定該內存訪問是否被允許。如果該內存訪問不被允許,CP15向ARM處理器報告存儲訪問中止。
        (4)對于不允許緩存的存儲訪問,使用步驟(1)中得到的物理地址訪問內存。對于允許緩存的存儲訪問,如果在cache命中,則忽略物理地址;如果cache沒有命中,使用步驟(1)中得到的物理地址訪問內存,并把該塊數據讀取到cache中。

        b、禁止MMU時存儲訪問過程
        • 禁止MMU時,是否支持cache和write buffer由各個具體芯片的設計確定。如果芯片規定禁止MMU時禁止cache和write buffer,則存儲訪問將不考慮C、B控制位。如果芯片規定當禁止MMU時可以使能cache和write buffer,則數據訪問時,C=0,B=0;指令讀取時,如果使用分開的TLB則C=1,如果使用統一的TLB則C=0;
        • 存儲訪問不進行權限控制,MMU也不會產生存儲訪問中止信號
        • 所有的物理地址和虛擬地址相等,即使用平板模式
        c、禁止/使能MMU時應注意的問題
        • 在使能MMU之前,要在內存中建立頁號表,同時CP15中的各相關寄存器必須完成初始化。
        • 如果使用的不是平板存儲模式(物理地址和虛擬地址相等),在禁止/使能MMU時,虛擬地址和物理地址的對應關系會發生改變,這時應該清除cache中的當前地址變換條目
        • 如果完成禁止/使能MMU的代碼的物理地址和虛擬地址不相同,則禁止/使能MMU時會造成很大麻煩,因此強烈建議完成禁止/使能 MMU的代碼的物理地址和虛擬地址最好相同
        3、MMU中的地址變換過程
        在ARM中,虛擬地址到物理地址的映射有兩種方式,一級映射和二級映射。
          
          a、一級映射
        當使用一級映射時,只會用到一張頁表,我們將它稱為一級頁表,用L1表示。一級映射時,虛擬空間被劃分成段的單位,每段的大小為1M。而相應的物理空間也被進行這樣的劃分,單位是段框,段和段框的大小必須相同。
        于是,首先在內存中建立一張頁表(這個頁表由我們自己建立),頁表中的每一項存放的是一個物理段基地址,該頁的訪問權限和緩沖特性等。頁表中每一項的大小為4字節,所以每一項的地址是字對齊。我們將頁表中的每一格稱為一個項。
          因為ARM的可尋址范圍為4G,且虛擬空間的每段大小為1M,所以如圖所示,頁表有4096個項。每一項對應一個段,每一項中存放的是一個物理段基地址,該頁的訪問權限和緩沖特性等。
        虛擬地址被MMU分為兩部分,第一部分為頁索引號(bits[31:20]),第二部分是相對物理地址的偏移量(bits[0:19])。
         所以當訪問一個地址時,此地址是虛擬地址。MMU會用協處理器CP15的C2寄存器中的頁表基地址+頁索引號便查到了頁表中對應的一項,從頁表中相應的項中找到物理段基地址,然后:物理段基地址 + 偏移量(這個是虛擬地址的第二部分) = 物理地址。
        注:虛擬空間并不真實存在,只是為方便理解才這么說。
        例:
        CPU要訪問0x300008的地址,此地址為虛擬地址。MMU會根據頁索引號(也就是0x3)找到相對頁表基地址偏移量為0x3的項。這個項中的物理段基地址為0x006。
        物理地址?。健。?x006<<20)+0x8=0x600008 
         
        一級頁表中一項的詳細內容如下表所示:
        段基地址:也就是物理空間的段首地址,1M大小對齊
        AP:   訪問控制位Access Permission
        域:    標明了當前段屬于哪個域。Domain與AP配合使用,對訪問權限進行檢查
        C:    如下表所示
        B:     如下表所示


        bits[1:0]:
        00:相應1M的虛擬空間并沒有被映射到物理空間,因此訪問該存儲空間將會產生地址變換失效信號,所以bits[31:2]的內容無效
        10:這是一個一級映射的地址變換,所以存儲的是要訪問的物理段基地址
        01:這是一個二級映射的地址變換,所以存儲的是粗粒度的二級頁表的基地址(后面會講)11:這是一個二級映射的地址變換,所以存儲的是細粒度的二級頁表的基地址(后面會講)
        域標明了當前段屬于哪個域。然后該段便具有了和該域一樣的訪問權限。
        CP15的寄存器C3:

        310

        D15

        D14

        D13

        D12

        D11

        D10

        D9

        D8

        D7

        D6

        D5

        D4

        D3

        D2

        D1

        D0

        在CP15的C3寄存器中,劃分了16個域,每個區域由兩位構成,這兩位說明了當前內存的檢查權限:
        00:當前級別下,該內存區域不允許被訪問,任何的訪問都會引起一個domain fault,這時 AP位無效
        01:當前級別下,該內存區域的訪問必須配合該內存區域的段描述符中AP位進行權檢查
        10:保留狀態(我們最好不要填寫該值,以免引起不能確定的問題)
        11:當前級別下,對該內存區域的訪問都不進行權限檢查。這時AP位無效
        所以只有當相應域的編碼為 01時,才會根據AP位和協處理器CP15中的C1寄存器的S,R位進行權限檢查

         b、二級映射

        當使用二級映射時,一級頁表L1仍然存在,但是一級頁表中不再存放物理段基地址了,而是存放了二級頁表的基地址,也就是二級頁表的首地址。

          一級頁表要表示4G的地址范圍,一共4096項,每一項都表示1M的大小。二級頁表相當于對一級頁表這1M的范圍作更詳細的劃分,所以每個二級頁表要表示1M的地址范圍。

        對這1M地址范圍進行分頁,有三種分法:
         大頁:將這1M地址范圍分成單位為64KB大小
          小頁:將這1M地址范圍分成單位為4KB大小
          極小頁:將這1M地址范圍分成單位為1KB大小
        注:二級頁表分為兩類:粗粒度的二級頁表和細粒度的二級頁表。
        粗粒度的二級頁表:
        當二級頁表為粗粒度時,一級頁表中一項的內容如下表所示:
        因為不論是一級頁表還是二級頁表,頁表中的每一項都是四個字節,所以頁表中每一項的地址都是字對齊的,也就是最低兩位的值都為0。所以因為粗粒度的二級頁表的基地址為22位,而偏移量只能為8位,則粗粒度的二級頁表中只能有256個項,大小為1KB。而這256個項要表示1M大小,所以粗粒度二級頁表中的每個項要表示4KB的物理空間范圍。

        細粒度的二級頁表:
        當二級頁表為細粒度時,一級頁表中一項的內容如下表所示:
        因為不論是一級頁表還是二級頁表,頁表中的每一項都是四個字節,所以頁表中每一項的地址都是字對齊的,也就是最低兩位的值都為0。所以因為細粒度的二級頁表的基地址為20位,而偏移量只能為10位,則細粒度的二級頁表中能有1024個項,大小為4KB。而這1024個項要表示1M大小,所以細粒度二級頁表中的每個項要表示1KB的物理空間范圍。
        首先討論粗粒度的二級頁表:分頁方式為大頁64KB。上面已經說了一個粗粒度的二級頁表中每一項能表示的物理地址范圍只能為4KB,那么64KB的地址范圍怎么表示呢?這時其實已經把4KB的地址范圍變為了64KB的地址范圍,也就是頁表中的一項能表示64KB的地址范圍。這時物理地址偏移量要占用二級頁表索引號的bits[15:12] ,這樣才能表示64KB的物理地址范圍。
        因為現在二級頁表的一項中存放的是64KB地址范圍的物理基地址,則物理地址偏移量使用的是bits[15:0](占用了二級頁表索引號的bits[15:12]),所以bits[15:12]在0b0000—0bFFFF范圍變化時,物理基地址仍然相同。但是隨著bits[15:12]的變化,二級索引號也會發生變化,那么得到的項的地址就會變化。所以為了讓物理基地址相同,必須在連續16個項中都存放相同的內容,這樣根據二級頁表索引號所找到的連續16個項地址雖然不同,但每一個項中的物理基地址都相同。再與物理地址偏移量(虛擬地址的bits[15:0])相加,就會得到物理地址。
        所以當當分頁方式為大頁64KB時,粗粒度二級頁表用16個項對應一頁,
        粗粒度二級頁表中一項的詳細內容如下表:
        大頁基地址:就是64KB頁的首地址
        一個大頁分為4個子頁:
        AP0子頁1的訪問控制權限位
        AP1 子頁2的訪問控制權限位
        AP2子頁3的訪問控制權限位
        AP3子頁4的訪問控制權限位
        C:    如下表所示
        B:     如下表所示
        bits[1:0] :當前頁表的分頁方式:01:大頁 10:小頁 11:極小頁
        當分頁方式為小頁4KB時,粗粒度二級頁表的一項正好對應一頁。其地址變換方式和一級映射相似。
        當分頁方式為極小頁1KB時,粗粒度二級頁表無法表示。
        接下來是細粒度的二級頁表:
        因為細粒度二級頁表的一項只能表示1KB的物理地址范圍,所以:
        當分頁方式為大頁64KB時,細粒度二級頁表的64個項對應一頁。其地址變換方式參考粗粒度二級頁表的大頁變換方式
        當分頁方式為小頁4KB時,細粒度二級頁表的4個項對應一頁。其地址變換方式參考粗粒度二級頁表的大頁變換方式
        當分頁方式為極小頁1KB時,細粒度二級頁表的一項正好對應一頁,其地址變換方式與一級映射相似。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 岳阳县| 乐安县| 拉孜县| 葫芦岛市| 璧山县| 婺源县| 定襄县| 南澳县| 防城港市| 遵义市| 二连浩特市| 廉江市| 中卫市| 台东县| 阳东县| 调兵山市| 岳阳县| 岳普湖县| 涡阳县| 达州市| 城口县| 大新县| 桑植县| 茶陵县| 毕节市| 醴陵市| 松江区| 兴安盟| 兴化市| 洪洞县| 毕节市| 宁远县| 大丰市| 黔西| 益阳市| 广平县| 龙川县| 兴城市| 新宁县| 渭源县| 潞城市|