记录

来源:互联网 发布:数据侠客行 新笔趣阁 编辑:程序博客网 时间:2024/05/01 01:14

第一步,你要知道页表的位置, 这就是所谓的页表址的概念. 该值由芯片自动从协处理器的c2寄存器中取出配置. 


第二步,你要知道页表里的段的位置, 这是段基址的概念. 或者叫表内序号. 这个值是虑拟地址的bit[31:20]. 它和上一步的页表基址构成一级页表的地址项. 所以你应该明白了下面这一行的意思了吧. 

pTT=(U32 *)_MMUTT_STARTADDRESS+(vaddrStart>>20);


_MMUTT_STARTADDRESS就是所谓的页表基址. 由第一步可知,该值应该存到c2寄存器里,哪里存呢. 接着往下看,会发现MMU_SetTTBase(_MMUTT_STARTADDRESS)这个函数, 就是这个函数完成了该操作,由于要对c2寄存器操作,该函数要用汇编实现. 这里不分析了. 

接着分析MMU_SetMTT.


第三步. 知道了页表里段的位置,下面只要知道每个地址在段内的偏移量,不就知道该地址了吗. 这个偏移量就是虚拟地址的bit[19:0].你可能要问,怎么这里没有看到对bit[19:0]的操作呢,因为MMU_SetMTT是实现虚拟地址到物理地址的映射,而这个映射是以段为单位的. 所以,只要用到bit[20]之后的位数. 


那么addr是做什么的呢. 顾名思义,属性. 它定义了bit[11:0]的值, 该值在一线页表表项里不同的位代表不同的函义,比如bit[8:5]表示本段所在的域等等. 所以下面这一行

*pTT++=attr |(((paddrStart>>20)+i)<<20)

产生了物理地址的高12位,并设置了一组页表的表项.

原创粉丝点击