ARM内存管理MMU详解
de2 == 0 选择数据TLB 锁定寄存器
opcode2 == 1 选择指令TLB 锁定寄存器
如果具体的实现只有唯一的TLB,那么只有1 个寄存器,opcode2 字段应该为0。访问寄存器10 的MCR 或MRC 指令中的CRm 总应该为0。
写寄存器10 有如下结果:
victim 字段表示下次TLB 失败(miss)时,转换表遍历的结果替代哪个TLB 入口。Base 字段包含TLB 替换的策略,只使用从(base)到(TLB 入口-1)的TLB 入口,victim 应该在这个区间。
转换表遍历的结果在写到TLB 入口时,若P==1 则它被保护起来,不能被寄存器8的使整个TLB 失效操作影响;若P==0 则会被那些操作给失效掉。
---注------
如果TLB 的入口不是2 的N 次方,那么写到大于或等于TLB 入口数的TLB 入口的base 或victim 的值将不确定。
-----------
读寄存器10 将返回它的值。
CP15寄存器11, 12,保留
对这些寄存器的访问( 读或写) 结果不可预见。
CP15寄存器13, FCSE PID寄存器
访问: 读/ 写
CP15寄存器13,或快速前后切换扩展(FCSE)处理标识符(PID) 寄存器,复位时值为0x0。
由CP15 寄存器13读取返回FCSE PID值。
向CP15 寄存器13写入置位FCSE PID。
FCSE PID 设置ARM9TDMI 与缓存存储器MMU 间映射。
ARM9TDMI 地址范围为0 ~ 32 M字节,通过FCSE PID 转换。
CP15寄存器14, 保留
对这些寄存器的访问( 读或写) 结果不可预见。
CP15寄存器15,测试配置寄存器
CP15寄存器15,或测试配置寄存器用于测试。对该寄存器的访问( 读或写) 结果不可预见。
四、设置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;
}
ARM内存管理MMU详 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)