文档库

最新最全的文档下载
当前位置:文档库 > 设置MMU进行地址重映射的一个实例

设置MMU进行地址重映射的一个实例

设置MMU进行地址重映射的一个实例

对于实际编程工作而言,主要是确定如何编写页表中的内容并如何确定页表项地址。现举例如下:

假设物理地址为0x3000_0000~0x30ff_ffff(1M空间)的一块连续空间需映射为0x0000_0000~0x000f_ffff的一块连续空间:

1.确定页表项中的内容:把物理地址的基地址作为页表项的高12位(31bit~21bit),填写访问属性。假设可以读写,可以读缓存、写缓冲,这样该页表项内容为0x3000_C00E;

2.确定页表基地址,填写页表基地址到CP15寄存器的C2中。页表的基地址要为64KB对齐,此处为0x305f_c000;

3.计算出偏移地址,把内容填写到页表项地址中。页表项地址=页表基地址+(虚拟地址基地址>>18),如页表基地址为0x305f_c000,那么,页表项地址=0x305f_c000;

4.将页表项数值写到对应的页表项地址中。上例中,需要向地址

0x305f_c000中写入0x3000_COOE。

下面是程序的具体实现

;init MMU

;写MMU表到on chip sram from 0x60010000 to 0x60014000

import write_mmu_table

ldr r0,=table ;0x305f_c000

bl write_mmu_table ;

nop

nop

ldr r2,=0x55555555

mcr p15,0x0,r2,c3,c0,0 ;16个域均为0b01,客户模式

nop

nop

nop

nop

ldr r0,=table ;

mcr p15,0x0,r0,c2,c0,0 ;变换表基地址写入cp15 r2

nop

nop

nop

nop

mov r2,#0x7d ;0b0111 1101,使能cache,write buffer,MMU mcr p15,0x0,r2,c1,c0,0

nop

nop

nop

nop

nop

nop

就这些,mmu初始化完了

write_mmu_table()是c的小程序,往ram写地址转换的描述

void write_mmu_table(UINT32 *base)

{

UINT32 *p_table;

UINT32 description;

UINT32 i;

p_table = base;

description = 0x3000_C00E;//页表项的值

*p_table = description;

p_table++;

description = 0x31000c10//下面使除了上面映射地址之外,

所有的虚拟地址都为无效

//地址..bits[1:0]==0b00,所关联的地址没有被映射for (i=1;i<4096;i++)

{

*p_table = description;

description = description +0x00100000;

p_table ++;

}

//return;

}