我記得有一次我去應聘arm-linux軟體工程師。結果被問到arm中的虛擬記憶體是怎麼管理的。由於我只對x86平台下的mmu了解,所以我被問倒了。原來我所學的只是皮毛。還有很多東西值得我去深入。要做arm-linux下的驅動,熟悉虛擬記憶體應該是必須的。
arm9中的虛擬記憶體是怎麼實現的呢?以下是我的學習總結。
arm920t核是通過cp15來實現mmu機制的。
1. 關於位址
1)va,是程式中的邏輯位址,0x00000000~0xffffffff。
2)mva,由於多個程序執行,邏輯位址會重合。所以,跟據程序號將邏輯位址分布到整個記憶體中。mva = (pid << 25) | va
3)pa,mva通過mmu轉換後的位址。
pid是存放在cp15協處理器的c13暫存器的高7位。
2. 關於虛擬記憶體轉換
cp15從c2中獲得頁基址(ttb)。將 mva 的高12位作為頁表索引值。獲得頁表項:ttb [ mva >> 20 ]。注意:頁表項是32位的。
從上可知,乙個頁表最多有4096個頁表項,也就是4k。那麼,每個頁表項可以表示1mb的位址空間。
得來的項表項分三種:
1)段頁描述符,直接指向1mb的記憶體空間。
2)粗頁描述符,有256個二級頁表項,每個二級頁表項指向4kb的記憶體空間。
3)細頁描述符,有1024個二級頁表項,每個二級頁表項指向1kb的記憶體空間。
## 粗頁描述符中存放的是粗頁表二級表的基址。 將mva的[19~12]位用來進行二級頁表查尋。粗頁表二級表分兩種:
1)大頁描述符,乙個描述符可以對應64kb的記憶體位址,但16個二級描述符對應同一塊記憶體。
2)小頁描述符,乙個描述符只對應4kb的記憶體位址,每個二級描述符只對應一塊記憶體。
## 細頁描述符中存放的是細頁表二級表的基址。將mva的[19~10],共計10位用於進行二級頁表索引。二級頁表共1024個描述符。剩下的10位作為基址,可訪問空間為1024b。
如下是記憶體轉換圖:
思考:
通過上面的學習,了解到arm將4gb的位址訪問空間分成128個32mb,每份供乙個程序使用。如此以來,乙個程序的位址訪問空間只有32mb。如程序1的位址空間為[0x02000000~0x03ffffff]。如果超出這個範圍,位址訪問就是非法的。
那arm9在設計cp15時為什麼不為每乙個程序指定乙個單獨的頁表。這樣以來,每個程序就可以獨地擁有4gb的位址空間。
如此以來,程序數就不再受限於128個,可以多達1024個程序。而每乙個程序的虛擬位址的空間可以擴充套件到4gb。
ARM9學習筆記之 MMU
我記得有一次我去應聘arm linux軟體工程師。結果被問到arm中的虛擬記憶體是怎麼管理的。由於我只對x86平台下的mmu了解,所以我被問倒了。原來我所學的只是皮毛。還有很多東西值得我去深入。要做arm linux下的驅動,熟悉虛擬記憶體應該是必須的。arm9中的虛擬記憶體是怎麼實現的呢?以下是我...
ARM9學習筆記之 彙編
arm系列晶元與pc系列 可能我說法不太準確 晶元在指令設計上就有本質的區別。arm中每條指令是精簡指令集要麼是32位,要麼是16位。而pc的指令是複雜指令集,一條指令可以由多個位元組組成。1.關於函式呼叫方法 在arm彙編中,函式呼叫非常靈活。1 bl指令 bl initmem 呼叫 initme...
ARM9學習筆記之 SDRAM實驗
學了點東西,寫點總結。以下是我在做 page130,2.6.8記憶體驅動實驗總結。我按照書上的指示,完成了 的編寫。對專案作如下配置 上述的配置中 ro base 0x30000000 告訴linker,本程式將被載入到 0x30000000 上執行。實驗程式的功能是,程式最初是在0x0000000...