Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38532
  • 博文数量: 10
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 16
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-11 11:41
文章分类
文章存档

2014年(3)

2013年(6)

2012年(1)

我的朋友

分类: LINUX

2013-04-13 09:51:33

MMU给我感觉是个很复杂的东西,网上看了一些资料,勉强知道了一些表面的东西。它有两个作用:1、把虚拟地址映射到物理地址;2、对内存访问提供控制机制。

我主要记录下我对映射表变换的理解。

ARM中,MMU另外提供了一张映射表(MVA),用于程序虚拟地址(VA)到物理地址(PA)的映射。MVA称为变换后的VA。在程序运行时,CPU只看到VA,而MMUcache们只看到PAMVA。应该说,在进程运行切换过程中,映射关系是动态变化的,因为不同进程和内存之间需要不同的映射关系,就需要不断的重做映射表,这个代价是很大的。所以,有必要让映射表中需要更新的内容很少,以减少性能开支,这就出现了变换后的VA,即MVA,如果VA<32M,需要使用进程标识号PID(通过读CP15C13获得)来转换为MVA

VAMVA的转换方法如下(这是硬件自动完成的)

if(VA < 32M)
    MVA = VA | (PID<<25);   
//VA<32M,即PID*0x02000000作为该进程起始地址
else
    MVA = VA;               //VA>=32M

如:假设两个进程12运行时的VA都是0-32M,则他们的MVA分别是0x02000000-0x03ffffff0x04000000-0x05ffffff,这样进程切换就省事多了,不必进行重建页表等工作。

    但是,这同时带来了中断跳转的问题。当发生异常时,需要跳到0x0位置的异常向量表,这个0x0应该是VA,且小于32M,如果开启了MMU,就会被转换为MVA,而不同的PID产生不同的MVA,这就导致异常向量表的地址不统一了。所以,Linux采取了将0x0位置的向量表映射到高地址0xffff0000处,就没有上述的问题了,看了半天原来是这么回事。。。

    接下来,就是MVA如何映射PA的工作。s3c2410datasheet中说到4中映射方案,其中最方便的是段(section)操作,具体见《s3c2410 MMU》的后半文。

阅读(3257) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~