注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

LINUX虚拟地址转换(MVA到PA)遇到的问题  

2011-06-29 09:54:38|  分类: ARM学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

昨天晚上看书,韦哥说在ARM上有两种地址映射的方法,一种是用公式,一种是用页表,而在ARM上多用页表。页表又分为一级页表和二级页,我们今天只谈一级的,因为实际应用以一级为多。
一级页表是使用页表的基址[31:20]来表示描述符的索引,共有4096个描述符,每个描述符可以描述1024K(1M)的地址空间,每个描述符使用一个四字节的长度来描述内存的具体的使用方法。这里具体的大家可以看各种书籍,韦哥的书上也有。
我们主要是谈谈在实际应用中和书中讲得如何对应上。书上讲的是将A0000000的MVA地址空间映射到56000000PA地址上。使用的方法如下:
*(mmu_tlb_address + virtualaddress >> 20) = (pysicaladdress&0xFFF00000)|(预定义的物理地址的属性宏)
因为在书中讲了,在一级页表中,MVA转PA的方法是,我们确定是一级页表后,取出段描述符,同样也是[31:20]这表明是真正的物理地址,将其加上虚拟地址的[19:0]即可得到真正的物理地址。即如下两步
1、TTB的[31:14]和MVA的[31:20]组成一个低两位为0的32位地址,MMU利用这个地址找到段描述符。

2、取出段描述符的位[31:20]------即段基址,它和MVA的[19:0]组成一个32位的物理地址,这就是MVA对应的PA。

再看书上说的,我们是直接把段描述符保存到了内存的开始的16K空间中,每个个描述符占四字节。也就是说,我们可以直接到此处取得描述符,而不用再运算,也就是我们前面说的我们用页表直接转换,查找。
这也就是为什么我们用*(mmu_tlb_address + virtualaddress >> 20),我们直接取这个描述符的值(*嘛,取值),我们直接把物理地址的空间起始地址映射到这里,ARM在启动时,直接到这里取得物理地址的前12位[31:20],做为空间的物理地址,然后再把MVA的[19:0]和其相加就得到了真实的物理地址。

其实我们这里只是映射,计算真实的物理地址并不是这里的事儿,这里只是提供一个真实的物理地址和MVA的相对应的表。OK,明白了吧。

  评论这张
 
阅读(870)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017