1、段方式MMU
利用虚拟地址然后找到物理地址,通过物理地址访问到led,其过程如下:
一个段的大小是[19:0]总共有1M的地址空间。
从上面可知对应GPIO的段物理基地址是0x7f000000.那么要在虚拟地址当中找一个段与之形成对应关系,那么这个段是多少呢,假如是0xa0000000这个段,把这两个段关联起来,那么通过页表来建立这个关系。那么这个页表存放在内存的起始地址0x50000000。接下来就要建立该页表的页表项,要建立页表项就要知道它在页表当中的位置,它的位置实际上就是页表的起始地址+虚拟地址的高12位,
找具体表项里面的内容看芯片手册
[31:20]保存的段的物理基地址的高12位,[19:12]should be zero固定为零。[11:10]access permission控制访问权限的,[9]:也为0;[8:5]域,[4]固定为1,[3]是否使用cache
,[2]是否使用write buffer
,[1]固定为1,[0]固定为0.
表项中的第一个部分[31:20](0x7f000000&0xfff00000)
表项中的第二个部分[19:12]0b00000000
表项中的第三个部分[11:10]AP:
表项中的第四个部分[9]为0
表项中的第五个部分[8:5]domain
表项中的第六个部分[4]固定为1
表项中的第七个部分[3]c是否使用cache
表项中的第八个部分[2]b是否使用buffer
表项中的第九个部分[1:0]固定为0b10段的模式
域和AP来共同决定访问权限的:
有疑问???怎么把域写到对应页表项,是直接把对应数字域写到[8:5]位吗?比如要域3,将3写到[8:5]这里??,视频里面使用的域0,将0左移5位保存在[8:5]这里。那么下面的3-11表是什么意思??
ARM系统把整个的存储空间分为了16个域,每一个域可以有一个权限,你可以选择你访问的区域放到哪一个域里面去,假如我们放到我们的域0里面,放到哪个域都没有关系,那么放到域0之后,那么这个区域的访问权限怎么来决定呢,
可以将其设置为11对应table3-11
"mvn r0,#0
"
"mcr p15,0,r0,c3,c0,0
"把全部域设置为11,
由三个因素AP、S、R来决定的;S、R由域里面的S、R来决定的,在cp15里面每一个域都有一个S和R设置,当把AP设置为11的时候,就不管S和R了,都可以进行读写操作。
1、建立一级页表
建立好了页表项之后,要写入TTB。
2、写入TTB
TTB是保存在CP15的c2寄存器,
3、打开MMU
别忘了当我们打开了MMU之后,所有的地址都要经过一个转换的过程,不管是访问内存还是外设,故
代码如下: