1、MMU概念介紹
MMU分為兩個(gè)部分: TLB maintenance 和 address translation

MMU的作用,主要是完成地址的翻譯,即虛擬地址到物理地址的轉(zhuǎn)換,無(wú)論是main-memory地址(DDR地址),還是IO地址(設(shè)備device地址),在開(kāi)啟了MMU的系統(tǒng)中,CPU發(fā)起的指令讀取、數(shù)據(jù)讀寫(xiě)都是虛擬地址,在ARM Core內(nèi)部,會(huì)先經(jīng)過(guò)MMU將該虛擬地址自動(dòng)轉(zhuǎn)換成物理地址,然后在將物理地址發(fā)送到AXI總線上,完成真正的物理內(nèi)存、物理設(shè)備的讀寫(xiě)訪問(wèn).
那么為什么要用MMU?為什么要用虛擬地址?以下總結(jié)了三點(diǎn):
多個(gè)程序獨(dú)立執(zhí)行 --- 不需要知道具體物理地址
虛擬地址是連續(xù)的 --- 程序可以在多個(gè)分段的物理內(nèi)存運(yùn)行
允許操作系統(tǒng)管理內(nèi)存 --- 哪些是可見(jiàn)的,哪些是允許讀寫(xiě)的,哪些是cacheable的……
既然MMU開(kāi)啟后,硬件會(huì)自動(dòng)的將虛擬地址轉(zhuǎn)換成物理地址,那么還需要我們軟件做什么事情呢?即創(chuàng)建一個(gè)頁(yè)表翻譯都需要做哪些事情呢?或者說(shuō)啟用一個(gè)MMU需要軟件做什么事情呢?
設(shè)置頁(yè)表基地址VBAR_EL3 (Specify the location of the translation table)
初始化MAIR_EL3 (Memory Attribute Indirection Register)
配置TCR_EL3 (Configure the translation regime)
創(chuàng)建頁(yè)表 (Generate the translation tables)
Enable the MMU
2、虛擬地址空間和物理地址空間
2.1、(虛擬/物理)地址空間的范圍
內(nèi)核虛擬地址空間的范圍是什么?應(yīng)用程序的虛擬地址空間的范圍是什么?以前我們?cè)趯W(xué)習(xí)操作系統(tǒng)時(shí),最??吹降囊痪湓捠牵簝?nèi)核的虛擬地址空間范圍是3G-4G地址空間,應(yīng)用程序的虛擬地址空間的范圍是0-3G地址空間;到了aarch64上,則為 :內(nèi)核的虛擬地址空間是0xffff000000000000 - 0xffffffffffffffff , 應(yīng)用程序的虛擬地址空間是: 0x0000000000000000 - 0x0000ffffffffffff.
做為一名杠精,必需告訴你這句話是錯(cuò)誤的。錯(cuò)誤主要有兩點(diǎn):(1) arm處理器,并沒(méi)有規(guī)定你的內(nèi)核必需要使用哪套地址空間,以上這是Linux Kernel自己的設(shè)計(jì),它設(shè)計(jì)了讓Linux Kernel使用0xffff000000000000 - 0xffffffffffffffff地址區(qū)間,Userspace使用0x0000000000000000 - 0x0000ffffffffffff地址區(qū)間,這里正好可以舉一個(gè)反例,比如optee os,它的kernel mode和user mode使用的都是高位的虛擬地址空間。(2) 高位是有幾個(gè)F(幾個(gè)1)是根據(jù)你操作系統(tǒng)使用的有效虛擬地址位來(lái)決定的,也并非固定的。比如optee中的mode和user mode的虛擬地址空間范圍都是:0x0000000000000000 - 0x00000000ffffffff
其實(shí)arm文檔中有一句標(biāo)準(zhǔn)的描述 :高位是1的虛擬地址空間,使用TTBR1ELx基地址寄存器進(jìn)行頁(yè)表翻譯;高位是0的虛擬地址空間,使用TTBR0ELx基地址寄存器頁(yè)表翻譯。 所以不應(yīng)該說(shuō),因?yàn)槟闶褂昧四膫€(gè)寄存器(TTBR0/TTBR1),然后決定了你使用的哪套虛擬地址空間;應(yīng)該說(shuō),你操作系統(tǒng)(或userspace軟件)使用了哪套虛擬地址空間,決定了使用哪個(gè)哪個(gè)基地址寄存器(TTBR0/TTBR1)進(jìn)行翻譯。
如下便是兩套虛擬地址空間和TTBRn_ELx的對(duì)應(yīng)關(guān)系,其中高位的位數(shù)不是固定的16(即T1SZ和T0SZ不一定等于16)

以下摘自ARM文檔的官方描述:
As Figure shows, for 48-bit VAs:? The address range translated using TTBR0ELx is 0x0000000000000000 to 0x0000FFFFFFFFFFFF.? The address range translated using TTBR1ELx is 0xFFFF000000000000 to 0xFFFFFFFFFFFFFFFF.In an implementation that includes ARMv8.2-LVA and is using Secure EL3 the 64KB translation granule, for 52-bit VAs:? The address range translated using TTBR0ELx is 0x0000000000000000 to 0x000FFFFFFFFFFFFF.? The address range translated using TTBR1ELx is 0xFFF0000000000000 to 0xFFFFFFFFFFFFFFFF.Which TTBRELx is used depends only on the VA presented for translation. The most significant bits of the VA must all be the same value and:? If the most significant bits of the VA are zero, then TTBR0ELx is used.? If the most significant bits of the VA are one, then TTBR1_ELx is used.
2.2、物理地址空間有效位(范圍)
具體每一個(gè)core的物理地址是多少位,其實(shí)都是定死的,虛擬地址是多少位,是編譯或開(kāi)發(fā)的時(shí)候根據(jù)自己的需要自己配置的。如下表格摘出了部分arm core的物理地址有效位,所以你具體使用多少有效位的物理地址,可以查詢core TRM手冊(cè)。

2.2.1、頁(yè)表翻譯相關(guān)寄存器的配置
ID_AA64MMFR0_EL1.PARange: Physical address size : 讀取arm寄存器,得到當(dāng)前系統(tǒng)支持的有效物理地址是多少位

TCR_EL1.IPS: Output address size : 告訴mmu,你需要給我輸出多少位的物理地址

TCR_EL1.T0SZ和TCR_EL1.T1SZ: Input address size : 告訴mmu,我輸入的是多少有效位的虛擬地址

3、Translation regimes
內(nèi)存管理單元 (MMU) 執(zhí)行地址翻譯。MMU 包含以下內(nèi)容:
The table walk unit : 它從內(nèi)存中讀取頁(yè)表,并完成地址轉(zhuǎn)換
Translation Lookaside Buffers (TLBs) :緩存,相當(dāng)于cache
軟件看到的所有內(nèi)存地址都是虛擬的。這些內(nèi)存地址被傳遞到 MMU,它檢查最近使用的緩存轉(zhuǎn)換的 TLB。如果 TLB沒(méi)有找到最近緩存的翻譯,那么翻譯單元將從內(nèi)存中讀取適當(dāng)?shù)囊粋€(gè)或多個(gè)表項(xiàng)目進(jìn)行地址翻譯,如下所示:

Translation tables 的工作原理是將虛擬地址空間劃分為大小相等的塊,并在表中為每個(gè)塊提供一個(gè)entry。Translation tables 中的entry 0 提供block 0 的映射,entry 1 提供block 1 的映射,依此類推。每個(gè)entry都包含相應(yīng)物理內(nèi)存塊的地址以及訪問(wèn)物理地址時(shí)要使用的屬性。

在當(dāng)前的ARMV8/ARMV9體系中(暫不考慮armv9的RME擴(kuò)展), 至少存在以下9類Translation regime:
Secure EL1&0 translation regime, when EL2 is disabledNon-secure EL1&0 translation regime, when EL2 is disabledSecure EL1&0 translation regime, when EL2 is enabledNon-secure EL1&0 translation regime, when EL2 is enabledSecure EL2&0 translation regimeNon-secure EL2&0 translation regimeSecure EL2 translation regimeNon-secure EL2 translation regimeSecure EL3 translation regime
這9類Translation regime的地址翻譯的場(chǎng)景如下圖所示:

Secure and Non-secure地址空間在REE(linux)和TEE(optee)雙系統(tǒng)的環(huán)境下,可同時(shí)開(kāi)啟兩個(gè)系統(tǒng)的MMU.
在secure和non-secure中使用不同的頁(yè)表.secure的頁(yè)表可以映射non-secure的內(nèi)存,而non-secure的頁(yè)表不能去映射secure的內(nèi)存,否則在轉(zhuǎn)換時(shí)會(huì)發(fā)生錯(cuò)誤

Two Stage TranslationsEL1&0 Translation regime處于VM(Virtual Machine)或SP(Secure Partition)時(shí),EL2 enabled的情況下,是需要stage2轉(zhuǎn)換的。對(duì)于EL2 Translation regime 和 EL3 Translation regime是沒(méi)用stage2 轉(zhuǎn)換的。

4、地址翻譯/幾級(jí)頁(yè)表?
4.1、思考:頁(yè)表到底有幾級(jí)?
從以下圖來(lái)看,有的頁(yè)表從L2開(kāi)始,有得從L1開(kāi)始,有的從L0開(kāi)始,還有從L-1開(kāi)始的,都是到L3終止。那么我們的頁(yè)表到底有幾級(jí)呢?

4.2、以4KB granule為例,頁(yè)表的組成方式

除了第一級(jí)index(這里是leve 0 table中的index),每一個(gè)查找table/page的index都是9個(gè)bit,也就是說(shuō)除了第一級(jí)頁(yè)表,后面的每一級(jí)table都是有512個(gè)offset
如果VA_BIT = 39,那么leve 0 table用BIT[38:39]表示,只有1個(gè)offset
如果VA_BIT = 48,那么leve 0 table用BIT[47:39]表示,有512個(gè)offset
如果VABIT > 48,那是不存在的,因?yàn)閍rm規(guī)定,大于48的,只有一個(gè),那就是VABIT=52,并且規(guī)定該情況下的最小granue size=64KB,而我們這里講述的是granue size=4KB的情況
如果VABIT = 32,那么leve 0 table就不用了,TTBRELx指向Level 1 table
另外我們還需注意一點(diǎn),在Level 0 table中,他只能指向DTable,不能指向DBlock
以下針對(duì)虛擬地址是48有效位的情形做了一個(gè)總結(jié):

4.3、optee實(shí)際使用的示例
32位有效虛擬地址、,3級(jí)頁(yè)表查詢(L1、L2、L3),顆粒的位4KB

如下展示是optee os的頁(yè)表結(jié)構(gòu),TTBR0_EL1指向L1 Table,L1 Table中有4個(gè)表項(xiàng),但只用了3個(gè) , 也就對(duì)應(yīng)著3張L2 Table.

配置相關(guān)的代碼如下:

5、頁(yè)表格式(Descriptor format)
5.1、ARMV8支持的3種頁(yè)表格式
AArch64 Long Descriptor:我們只學(xué)習(xí)這個(gè)
Armv7-A Long Descriptor :for Large Physical Address Extension (LPAE)
Armv7-A Short Descriptor
5.2、AArch64 Long Descriptor支持的四種entry
對(duì)于AArch64 Long Descriptor,又分為下面四種entry:
An invalid or fault entry.
A table entry, that points to the next-level translation table.
A block entry, that defines the memory properties for the access.
A reserved format
注意:entry[1:0] 表示該entry屬于哪類entry, Block Descriptor和Page Descriptor是一個(gè)意思。在當(dāng)前架構(gòu)中,reserved也是invalid。

5.3、頁(yè)表的屬性位介紹( Block Descriptor/Page Descriptor )
5.3.1、stage1的頁(yè)表屬性
(Attribute fields in stage 1 VMSAv8-64 Block and Page descriptors)

PBHA, bits[62:59] :for FEAT_HPDS2
XN or UXN, bit[54] :Execute-never or Unprivileged execute-never
PXN, bit[53] :Privileged execute-never
Contiguous, bit[52] :translation table entry 是連續(xù)的,可以存在一個(gè)TLB Entry中
DBM, bit[51] :Dirty Bit Modifier
GP, bit[50] :for FEAT_BTI
nT, bit[16] :for FEAT_BBM
nG, bit[11] :緩存在TLB中的翻譯是否使用ASID標(biāo)識(shí)
AF, bit[10] :Access flag, AF=0后,第一次訪問(wèn)該頁(yè)面時(shí),會(huì)將該標(biāo)志置為1. 即暗示第一次訪問(wèn)
SH, bits[9:8] :shareable屬性
AP[2:1], bits[7:6] :Data Access Permissions bits,
NS, bit[5] :Non-secure bit
AttrIndx[2:0], bits[4:2] :
5.3.2、stage2的頁(yè)表屬性
(Attribute fields in stage 2 VMSAv8-64 Block and Page descriptors)

PBHA[3:1], bits[62:60] :for FEAT_HPDS2
PBHA[0], bit[59] :for FEAT_HPDS2
XN[1:0], bits[54:53] :Execute-never
Contiguous, bit[52] :translation table entry 是連續(xù)的,可以存在一個(gè)TLB Entry中
DBM, bit[51] :Dirty Bit Modifier
nT, bit[16] :for FEAT_BBM
FnXS, bit[11] :for FEAT_XS
AF, bit[10] :Access flag
SH, bits[9:8] :shareable屬性
S2AP, bits[7:6] :Stage 2 data Access Permissions
MemAttr, bits[5:2] :
5.3.3、其它標(biāo)志位的詳細(xì)介紹
(1)、MemAttr指向MAIR_ELx寄存器中的attrn屬性域,表示內(nèi)存的緩存屬性,如cachable、shareable等
(2)、NSNon-secure比特表示轉(zhuǎn)換后的物理地址是secure的還是non-secure的。
(3)、APData access permissions 數(shù)據(jù)訪問(wèn)權(quán)限

(4)、SH
shareable屬性

(5)、AFAccess flag, AF=0后,第一次訪問(wèn)該頁(yè)面時(shí),會(huì)將該標(biāo)志置為1. 即暗示第一次訪問(wèn)(6)、nG對(duì)于 EL0/EL1 虛擬地址空間,Page Descriptor屬性字段中的 nG 位將轉(zhuǎn)換標(biāo)記為Gloabl(G) 或non-Gloabl(nG)。例如,內(nèi)核映射是Gloabl(G)翻譯,應(yīng)用程序映射是non-Gloabl翻譯。Gloabl翻譯適用于當(dāng)前正在運(yùn)的任何應(yīng)用程序。非全局翻譯僅適用于特定應(yīng)用程序
non-Gloabl映射在 TLB 中使用 ASID進(jìn)行標(biāo)記。在 TLB 查找時(shí),將 TLB 條目中的 ASID 與當(dāng)前選擇的 ASID 進(jìn)行比較。如果它們不匹配,則不使用TLB 條目。下圖顯示了內(nèi)核空間中沒(méi)有 ASID 標(biāo)記的全局映射和用戶空間中具有 ASID 標(biāo)記的非全局映射

(7)、XN or UXN特權(quán)和非特權(quán)不可從該memory-region中執(zhí)行指令的標(biāo)志位:Execute-neverUnprivileged execute-never
6、地址翻譯指令介紹
address translation的指令大約14個(gè):

總結(jié)一下:

7、地址翻譯相關(guān)的系統(tǒng)寄存器總結(jié)
地址轉(zhuǎn)換由系統(tǒng)寄存器的組合控制:
7.1 SCTLR_ELx


系統(tǒng)控制寄存器,控制著MMU、I-cache、D-cache的打開(kāi)與關(guān)閉,也控制著translation table walks訪問(wèn)內(nèi)存的大小端。
M - Enable Memory Management Unit (MMU).
C - Enable for data and unified caches.
EE - Endianness of translation table walks.
7.2 TTBRn_ELx


BADDR : 基地址
ASID :TLB entry區(qū)分user程序所用的ASID
7.3 TCR_ELx
在ARM Core中(aarch64),有三個(gè)Translation Control Register 寄存器:


| 比特位 | 功能 | 說(shuō)明 |
|---|---|---|
| ORGN1、IRGN1、ORGN0、IRGN0 | cacheable屬性 | outer/inner cableability的屬性(如直寫(xiě)模式、回寫(xiě)模式) |
| SH1、SH0 | shareable屬性 | cache的共享屬性配置(如non-shareable, outer/inner shareable) |
| TG0/TG1 | Granule size | Granule size(其實(shí)就是頁(yè)面的大小,4k/16k/64k) |
| IPS | 物理地址size | 物理地址size,如32bit/36bit/40bit |
| EPD1、EPD0 | - | TTBREL1/TTBREL0的enable和disable |
| TBI1、TBI0 | - | top addr是ignore,還是用于MTE的計(jì)算 |
| A1 | - | ASID的選擇,是使用TTBREL1中的,還是使用TTBREL0中的 |
| AS | - | ASID是使用8bit,還是使用16bit |
7.3 MAIR_ELx
內(nèi)存屬性寄存器,分為8個(gè)Attrn,所以一個(gè)core,最多只支持8中內(nèi)存屬性。頁(yè)表中的每一個(gè)entry,都會(huì)指向一個(gè)Attr域。

審核編輯 :李倩
-
處理器
+關(guān)注
關(guān)注
68文章
20339瀏覽量
255346 -
MMU
+關(guān)注
關(guān)注
0文章
92瀏覽量
19292 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5610瀏覽量
124654
原文標(biāo)題:armv8-armv9 MMU深度學(xué)習(xí)
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
如何調(diào)出 IPv6 地址?
Linux內(nèi)核大塊內(nèi)存申請(qǐng):從場(chǎng)景到落地全解析
RK平臺(tái)Linux IOMMU開(kāi)發(fā):從原理到實(shí)戰(zhàn)
【「Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)」閱讀體驗(yàn)】+讀深入理解Linux內(nèi)核內(nèi)存分配
直流高壓發(fā)生器主要用處在哪里?
FLASH中的代碼是如何得到運(yùn)行的呢
誰(shuí)有3566+電池+POE充電的方案,有個(gè)項(xiàng)目需要用該功能的主板
Vishay / Beyschlag MMU 0102 VG03薄膜可靠MELF電阻器數(shù)據(jù)手冊(cè)
請(qǐng)問(wèn)e203定義的地址空間是虛擬地址還是物理地址?
關(guān)于系統(tǒng)鏈接腳本的介紹
直流高壓發(fā)生器的主要用途是什么?
振動(dòng)傳感器主要用于哪些設(shè)備的監(jiān)測(cè)?
芯片清洗要用多少水洗
為什么光刻要用黃光?
TECS OpenStack資源池虛擬機(jī)網(wǎng)絡(luò)二層地址無(wú)法互通的問(wèn)題處理
為什么要用MMU?為什么要用虛擬地址?
評(píng)論