關于ARM9的MMU重要理解
原文地址:
本文引用地址:http://www.104case.com/article/201611/322696.htmhttp://blog.chinaunix.net/u1/58780/showart_468065.html
在ARM中,MMU另外提供了一張映射表(MVA),用于程序虛擬地址(VA)到物理地址(PA)的映射。MVA稱為變換后的VA。在程序運行時,CPU只看到VA,而MMU和cache們只看到PA和MVA。應該說,在進程運行切換過程中,映射關系是動態變化的,因為不同進程和內存之間需要不同的映射關系,就需要不斷的重做映射表,這個代價是很大的。所以,有必要讓映射表中需要更新的內容很少,以減少性能開支,這就出現了“變換后的”VA,即MVA,如果VA<32M,需要使用進程標識號PID(通過讀CP15的C13獲得)來轉換為MVA。
VA與MVA的轉換方法如下(這是硬件自動完成的):
if(VA |
如:假設兩個進程1、2運行時的VA都是0-32M,則他們的MVA分別是0x02000000-0x03ffffff、0x04000000-0x05ffffff,這樣進程切換就省事多了,不必進行重建頁表等工作。
而VA和MVA的轉換公式為:
if(VA < 32M) then
else
這樣,只要每個進程的VA都在32M之內,就可以保證每個進程的MVA不會發生重疊。
2^25 = 32M。另外,可以計算出進程最多為2^(32-25) = 128個
如果說這個是規定來的,你信不信?呵呵 如果是64M的話,那么公式就要改成MVA = VA | PID << 26;
那么PID就只有6位了,linux操作系統能夠支持的進程最多只有2^6=64個了,這樣不劃算
那么PID就只有6位了,linux操作系統能夠支持的進程最多只有2^6=64個了,這樣不劃算
B指令的的機器代碼結構為 31 28 cond 若L為0則為直接跳轉B,若L為1則為連接跳轉BL,signed_imed為24位有符號立即數,這個值為跳轉的偏移量。 24位有符號數值的范圍是-8M ~ +8M,而指令中偏移量為1時代表從當前PC開始向下跳1個字,即偏移量的單位為4個字節 因此,B指令向前和向后尋址的最大范圍為32M |
你可以試下如下代碼: NEXT 看一下那條跳轉指令它的機器代碼,最低24位立即數的值應該是-1 跟字對齊有點關系,因為ARM指令集的指令都是四字節的,所以偏移量的單位是4個字節。 如果當前跳轉的偏移量為-1,那么PC會向前跳4個字節,如果偏移量為-8M,那么PC會向前跳-32M個字節 |
恩,最低24位是0xffffff,偏移量就是 -1
NEXT B跳轉是針對當前PC來計算的,而當前PC值等于當前正在執行指令的下下一條指令的地址值 向下跳,偏移量為正數,向上跳,偏移量為負數。這個上下方向是針對程序執行的方向來說的。 |
恩,是這樣的
評論