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