MMU是內(nèi)存管理單元,負責虛擬地址到物理地址的映射和內(nèi)存訪問權限檢查。本文只講地址映射,地址映射長度有段1MB、大頁64KB、小頁4KB、極小頁1KB,本文只講段1MB的情況,其它類似。我們每個進程的空間都是4G,不同的進程的變量地址有可能一樣,這就是虛擬地址,其實它們對應到物理地址是不一樣的。這種虛擬地址到物理地址的轉(zhuǎn)換就是MMU做的事。所以開啟MMU之后,cpu發(fā)出的地址就是虛擬地址,關閉MMU,cpu發(fā)出的地址就是物理地址,關閉MMU的時刻,一般是boot階段。
首先要建立一張映射表,按1M映射的話,4G共有4096個1M的段,每個需要4字節(jié)存儲映射的地址,所以映射表的大小是4096*4字節(jié)(即16k),映射表的地址放在內(nèi)存起始地址0x30000000。比如要把GPB的寄存器0x56000000映射到0xA0000000,0xA000000/1M=2560,所以在映射表的2560*4地址,存放0x56000000。然后把表格的首地址,即0x30000000告訴MMU,啟動MMU即可。后面操作虛擬地址0xA0000000就是操作物理地址0x56000000。
unsignedlong*mmu_tlb_base=(unsignedlong*)0x30000000;
/*
*0x56000000是GPIO寄存器的起始物理地址,
*GPBCON和GPBDAT這兩個寄存器的物理地址0x56000010、0x56000014,
*為了在第二部分程序中能以地址0xA0000010、0xA0000014來操作GPBCON、GPBDAT,
*把從0xA0000000開始的1M虛擬地址空間映射到從0x56000000開始的1M物理地址空間
*/
virtuladdr=0xA0000000;
physicaladdr=0x56000000;
*(mmu_tlb_base+(virtuladdr>>20))=(physicaladdr&0xFFF00000)|
MMU_SECDESC;
啟動MMU的代碼需要使用協(xié)處理器,需要了解arm核,暫不深入研究。