新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM存儲管理系統(tǒng)MMU

ARM存儲管理系統(tǒng)MMU

作者: 時間:2016-11-10 來源:網(wǎng)絡 收藏
一、虛擬地址和物理地址的區(qū)別

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

本文引用地址:http://2s4d.com/article/201611/317531.htm

圖1.物理地址示意圖

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


圖2.虛擬地址示意圖

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

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

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

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

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

那么MMU是如何使用頁號索引在頁表中找到對應的地址變換條目呢?MMU會用CP15協(xié)處理其中的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的概念

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

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

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

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

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

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

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

系統(tǒng)協(xié)處理器CP15的寄存器C8就是清除TLB內(nèi)容的相關操作。它是一個只寫的寄存器。

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

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

指令

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

使無效整個數(shù)據(jù)TLB

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

虛擬地址

使無效數(shù)據(jù)TLB中的單個地址變換條目

MCR p15, 0, , c8, c7, 0

0

使無效整個數(shù)據(jù)和指令TLB

MCR p15, 0, , c8, c7, 1

虛擬地址

使無效數(shù)據(jù)和指令TLB中的單個地址變換條目

  • 鎖定TLB的內(nèi)容

2、存儲訪問過程

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

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

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

當?shù)玫搅诵枰牡刂纷兓瘲l目以后,將進行以下操作

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

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


bits[1:0]:
00:相應1M的虛擬空間并沒有被映射到物理空間,因此訪問該存儲空間將會產(chǎn)生地址變換失效信號,所以bits[31:2]的內(nèi)容無效
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個域,每個區(qū)域由兩位構成,這兩位說明了當前內(nèi)存的檢查權限:
00:當前級別下,該內(nèi)存區(qū)域不允許被訪問,任何的訪問都會引起一個domain fault,這時 AP位無效
01:當前級別下,該內(nèi)存區(qū)域的訪問必須配合該內(nèi)存區(qū)域的段描述符中AP位進行權檢查
10:保留狀態(tài)(我們最好不要填寫該值,以免引起不能確定的問題)
11:當前級別下,對該內(nèi)存區(qū)域的訪問都不進行權限檢查。這時AP位無效
所以只有當相應域的編碼為 01時,才會根據(jù)AP位和協(xié)處理器CP15中的C1寄存器的S,R位進行權限檢查

 b、二級映射

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

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

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

細粒度的二級頁表:
當二級頁表為細粒度時,一級頁表中一項的內(nèi)容如下表所示:
因為不論是一級頁表還是二級頁表,頁表中的每一項都是四個字節(jié),所以頁表中每一項的地址都是字對齊的,也就是最低兩位的值都為0。所以因為細粒度的二級頁表的基地址為20位,而偏移量只能為10位,則細粒度的二級頁表中能有1024個項,大小為4KB。而這1024個項要表示1M大小,所以細粒度二級頁表中的每個項要表示1KB的物理空間范圍。
首先討論粗粒度的二級頁表:分頁方式為大頁64KB。上面已經(jīng)說了一個粗粒度的二級頁表中每一項能表示的物理地址范圍只能為4KB,那么64KB的地址范圍怎么表示呢?這時其實已經(jīng)把4KB的地址范圍變?yōu)榱?4KB的地址范圍,也就是頁表中的一項能表示64KB的地址范圍。這時物理地址偏移量要占用二級頁表索引號的bits[15:12] ,這樣才能表示64KB的物理地址范圍。
因為現(xiàn)在二級頁表的一項中存放的是64KB地址范圍的物理基地址,則物理地址偏移量使用的是bits[15:0](占用了二級頁表索引號的bits[15:12]),所以bits[15:12]在0b0000—0bFFFF范圍變化時,物理基地址仍然相同。但是隨著bits[15:12]的變化,二級索引號也會發(fā)生變化,那么得到的項的地址就會變化。所以為了讓物理基地址相同,必須在連續(xù)16個項中都存放相同的內(nèi)容,這樣根據(jù)二級頁表索引號所找到的連續(xù)16個項地址雖然不同,但每一個項中的物理基地址都相同。再與物理地址偏移量(虛擬地址的bits[15:0])相加,就會得到物理地址。
所以當當分頁方式為大頁64KB時,粗粒度二級頁表用16個項對應一頁,
粗粒度二級頁表中一項的詳細內(nèi)容如下表:
大頁基地址:就是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時,細粒度二級頁表的一項正好對應一頁,其地址變換方式與一級映射相似。



評論


技術專區(qū)

關閉