1. 程式人生 > >#SC2440虛擬地址到實體地址的轉換

#SC2440虛擬地址到實體地址的轉換

虛擬地址到實體地址的對映

宣告:本文得出的結論皆來自於《嵌入式linux完全開發手冊》,是在嘗試自己理解其含義之後用自己的語言總結出來的,以便於更好的去理解本節內容。

VA:虛擬地址
WVA:經過轉換後的虛擬地址
PA:實體地址
PID:程序標識號,由CP15的C13取得。

1、 虛擬地址得到轉換後虛擬地址
若VA < 32M,則MVA = VA | (PID << 25),
其他情況VA = MVA。
32M = 2^25,所以PID要左移25位以便得到不重複的實體地址空間。

Tip:那個VA < 32M,至於為什麼是32,我覺得可能是程式執行時的程式碼空間不會超出後面32M的虛擬地址空間。由於這種取得MVA的方法就是為了簡化防止擁有重疊的虛擬地址的不同程序對映到同一實體地址空間所做的工作,而32M之後的虛擬記憶體空間存放系統元件以及動態連結庫等,可以為不同程序所共享,所以就不需要專門去為每個程序區分32M之後的虛擬地址空間所對應的實體地址空間了。

2、 頁表分類

2.1、一級頁表條目
一級頁表

標識低2位 條目型別
00 無效條目
01 粗頁表條目
10 段條目
11 細頁表條目

2.2、二級頁表條目
二級頁表

標識低2位 條目型別
00 無效條目
01 大頁條目
10 小頁條目
11 極小頁條目
3、 各頁表之間關係

頁表關係

3.1、指向關係
指向關係

其中可以理解為段、大頁、小頁、極小頁屬於同一級別,因為由它們可以直接得到實體地址。
粗頁表、細頁表屬於二級頁表,頁表屬於一級頁表。

3.2、包含關係
(1)頁表可以包含有4096個段條目(即段描述符),每個段存放有1M的實體地址空間。

(2)頁表可以包含有4096個粗頁表
1.每個粗頁表包含256個條目,每個條目可以索引4K的實體地址
2.一個大頁可以索引64K實體地址,粗頁表每16個條目可以指向同1個大頁
3.一個小頁可以索引4K的實體地址,粗頁表每1個條目可以指向1個小頁
4.一個極小頁可以索引1K的實體地址,粗頁表不可指向極小頁

(3)頁表可以包含有4096個細頁表
1.每個細頁表包含1024個條目,每個條目可以索引1K的實體地址
2.一個大頁可以索引64K實體地址,細頁表每64個條目可以指向同1個大頁
3.一個小頁可以索引4K的實體地址,細頁表每4個條目可以指向1個小頁
4.一個極小頁可以索引1K的實體地址,細頁表每1個指向1個極小頁

4、索引步驟
(1)段方式
從CP15的C2(頁表基址暫存器)取得一級頁表實體地址(位[31:14]),由MVA的[31:20]位索引到一級頁表中的對應的段描述符,從段描述符的[31:20]位得到對應段的實體地址,由MVA的[19:0]位在該段中索引要操作的實體地址。
(2)粗頁表方式(儲存的是大頁)
從CP15的C2(頁表基址暫存器)取得一級頁表實體地址(位[31:14]),由MVA的[31:20]位索引到一級頁表中的對應的粗頁表描述符,由該粗頁表描述符的[31:10]得到對應粗頁表的實體地址,由MVA的[19:12]位在該粗頁表中索引到一個大頁描述符,從該大頁描述符的[31:16]位得到大頁的實體地址,由MVA的[15:0]位在該大頁中索引到要操作的實體地址。
大頁儲存在細頁表中的索引方式雷同
(3)粗頁表方式(儲存的是小頁)
從CP15的C2(頁表基址暫存器)取得一級頁表實體地址(位[31:14]),由MVA的[31:20]位索引到一級頁表中的對應的粗頁表描述符,由該粗頁表描述符的[31:10]得到對應粗頁表的實體地址,由MVA的[19:12]位在該粗頁表中索引到一個小頁描述符,取出描述符[31:12]得到小頁表的實體地址,然後由MVA的[11:0]索引到小頁表中存放的實體地址。
(4)細頁表(儲存的是極小頁表)
從CP15的C2(頁表基址暫存器)取得一級頁表實體地址(位[31:14]),由MVA的[31:20]位索引到一級頁表中的對應的細頁表描述符,由該細頁表描述符的[31:12]位索引到一個極小頁表的基址,再由MVA的[19:10]索引到該極小頁表中的一個描述符,取出該描述符的[31:10]索引到極小頁的實體地址,再由MVA的[9:0]在該極小頁中索引到要操作的實體地址。
綜述:

段索引:
TTB[31:14] MVA[31:20] 得到段描述符
DUB[31:20] MVA[19:0] 得到實體地址

粗頁表大頁:
TTB[31:14] MVA[31:20] 得到粗頁表描述符
SOB[31:10] MVA[19:12] 得到大頁表描述符
BIB[31:16] MVA[15:0] 得到實體地址

細頁表大頁:
TTB[31:14] MVA[31:20] 得到細頁表描述符
FIB[31:12] MVA[19:12] 得到大頁表描述符
BIB[31:16] MVA[15:0] 得到實體地址

粗頁表小頁:
TTB[31:14] MVA[31:20] 得到粗頁表描述符
SOB[31:10] MVA[19:12] 得到小頁表描述符
SMB[31:12] MVA[11:0] 得到實體地址

細頁表小頁:
TTB[31:14] MVA[31:20] 得到細頁表描述符
FIB[31:12] MVA[19:12] 得到小頁表描述符
SMB[31:12] MVA[11:0] 得到實體地址

細頁表極小頁:
TTB[31:14] MVA[31:20] 得到細頁表描述符
FIB[31:12] MVA[19:10] 得到極小頁描述符
VSB[31:10] MVA[9:0] 得到實體地址

Tip:
SOB: coarse base
FIB: fine base
DUB: section base
SMB: small base
VSB: very small base
BIB: big base