首先需要分析,开发板需要使用哪些地址,哪些需要映射,以及是否需要使用cache和write buffer如下:
1、程序一开始从0地址开始运行,为了保证使能mmu之后,前后地址一致,所以0地址需要映射
即虚拟地址0映射到物理地址0,可以使用cache和buffer11
2、栈,如果是nor启动,需要用到栈0x40000000,
即虚拟地址0x40000000映射到物理地址0x40000000,可以使用cache和buffer11
3、中断的跳转地址,于是映射整个sdram,大小为0x30000000到0x34000000共64M,那么就应该映射到0x33f00000
即虚拟地址0x40000000映射到物理地址0x40000000,可以使用cache和buffer11
4、映射寄存器,查看手册,确定寄存器的范围0x48000000到0x5b00001c,则最后一个条目的地址是0x5b000000
即虚拟地址0x48000000映射到物理地址0x40000000,不可以使用cache和buffer00
5、framebuffer 0x33c00000
即虚拟地址0x33c00000映射到物理地址0x33c00000,不可以使用cache和buffer00
为了演示虚拟地址起作用,修改链接地址,由0x30000000改为0xb0000000
6、映射0xb0000000到物理地址0x3000000,可以使用cache和buffer 11
以上只是确定了待会儿要干什么,具体怎么做?
1、根据具体的手册,构造权限AP
2、
系统使用的0到4G虚拟内存,每个一级页表的条目映射的地址范围是1M,共有4096个条目,每个条目占据32位,即4Byte
那么整个页表占据4k×4Byte=16KB
这个页表也是要占内存空间的,放在哪儿?由于2440是自己去分配内存,所以确定0x32000000没有被占用,放在这儿、
unsigned int *ttb = (unsigned int *)0x32000000;
unsigned int va, pa;
int index;
映射第一部分的内存
va = 0;
pa = 0;
index = va /0x100000, 确定是第几个条目,为第0个
ttb[index] = ((pa & 0xfff00000) | MMU_SECDSEC_FOR_MEM);