新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM存儲(chǔ)管理系統(tǒng)MMU

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

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

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

本文引用地址:http://m.butianyuan.cn/article/201611/317531.htm

圖1.物理地址示意圖

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


圖2.虛擬地址示意圖

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

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

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

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

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

那么MMU是如何使用頁號(hào)索引在頁表中找到對(duì)應(yīng)的地址變換條目呢?MMU會(huì)用CP15協(xié)處理其中的C2寄存器存放的頁表基地址加上虛擬地址的頁號(hào)索引值,然后便得到了頁表中對(duì)應(yīng)的地址變換條目的地址。其實(shí)頁號(hào)索引就是相對(duì)于頁表基地址的一個(gè)偏移量,然后使用基地址加偏移量的方式得到一個(gè)頁表中的地址。

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

虛擬地址的二進(jìn)制碼為00110000 00000000 00000000 00010010 前12位為頁號(hào)索引,后20位為偏移量,因?yàn)?^20 = 1M

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



1、TLB的概念

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

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

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

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

注:TLB中存放的是地址變換條目,相當(dāng)于一個(gè)小頁表。

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

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

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

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

使無效整個(gè)指令TLB

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

虛擬地址

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

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

0

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

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

虛擬地址

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

MCR p15, 0, , c8, c7, 0

0

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

MCR p15, 0, , c8, c7, 1

虛擬地址

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

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

2、存儲(chǔ)訪問過程

a、使能MMU時(shí)的存儲(chǔ)訪問過程。

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

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

當(dāng)?shù)玫搅诵枰牡刂纷兓瘲l目以后,將進(jìn)行以下操作

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

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


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

310

D15

D14

D13

D12

D11

D10

D9

D8

D7

D6

D5

D4

D3

D2

D1

D0

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

 b、二級(jí)映射

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

  一級(jí)頁表要表示4G的地址范圍,一共4096項(xiàng),每一項(xiàng)都表示1M的大小。二級(jí)頁表相當(dāng)于對(duì)一級(jí)頁表這1M的范圍作更詳細(xì)的劃分,所以每個(gè)二級(jí)頁表要表示1M的地址范圍。

對(duì)這1M地址范圍進(jìn)行分頁,有三種分法:
 大頁:將這1M地址范圍分成單位為64KB大小
  小頁:將這1M地址范圍分成單位為4KB大小
  極小頁:將這1M地址范圍分成單位為1KB大小
注:二級(jí)頁表分為兩類:粗粒度的二級(jí)頁表和細(xì)粒度的二級(jí)頁表。
粗粒度的二級(jí)頁表:
當(dāng)二級(jí)頁表為粗粒度時(shí),一級(jí)頁表中一項(xiàng)的內(nèi)容如下表所示:
因?yàn)椴徽撌且患?jí)頁表還是二級(jí)頁表,頁表中的每一項(xiàng)都是四個(gè)字節(jié),所以頁表中每一項(xiàng)的地址都是字對(duì)齊的,也就是最低兩位的值都為0。所以因?yàn)榇至6鹊亩?jí)頁表的基地址為22位,而偏移量只能為8位,則粗粒度的二級(jí)頁表中只能有256個(gè)項(xiàng),大小為1KB。而這256個(gè)項(xiàng)要表示1M大小,所以粗粒度二級(jí)頁表中的每個(gè)項(xiàng)要表示4KB的物理空間范圍。

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



評(píng)論


技術(shù)專區(qū)

關(guān)閉