您的位置 首页 开关

关于ARM9的MMU重要了解

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

MMU给我感觉是个很杂乱的东西,网上看了一些材料,牵强知道了一些外表的东西。它有两个效果:1、把虚拟地址映射到物理地址;2、对内存拜访供给操控机制。

原文地址:

http://blog.chinaunix.net/u1/58780/showart_468065.html

在ARM中,MMU别的供给了一张映射表(MVA),用于程序虚拟地址(VA)到物理地址(PA)的映射。MVA称为改换后的VA。在程序运转时,CPU只看到VA,而MMU和cache们只看到PA和MVA。应该说,在进程运转切换过程中,映射联系是动态改变的,由于不同进程和内存之间需求不同的映射联系,就需求不断的重做映射表,这个价值是很大的。所以,有必要让映射表中需求更新的内容很少,以削减功能开支,这就呈现了“改换后的”VA,即MVA,假如VA<32M,需求运用进程标识号PID(经过读CP15的C13取得)来转化为MVA。

VA与MVA的转化办法如下(这是硬件主动完结的):

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

如:假定两个进程1、2运转时的VA都是0-32M,则他们的MVA分别是0x02000000-0x03ffffff、0x04000000-0x05ffffff,这样进程切换就省劲多了,不用进行重建页表等作业。

但 是,这一起带来了中止跳转的问题。当产生反常时,需求跳到0x0方位的反常向量表,这个0x0应该是VA,且小于32M,假如敞开了MMU,就会被转化为 MVA,而不同的PID产生不同的MVA,这就导致反常向量表的地址不一致了。所以,Linux采取了将0x0方位的向量表映射到高地址 0xffff0000处,就没有上述的问题了,看了半响原来是这么回事。。。

由于,在32位的CPU体系上,虚拟地址空间为2^32 = 4G
而VA和MVA的转化公式为:
if(VA < 32M) then
MVA = VA | PID << 25;
else
MVA = VA;
这样,只需每个进程的VA都在32M之内,就能够确保每个进程的MVA不会产生堆叠。
2^25 = 32M。别的,能够核算出进程最多为2^(32-25) = 128个

假如说这个是规则来的,你信不信?呵呵假如是64M的话,那么公式就要改成MVA = VA | PID << 26;
那么PID就只要6位了,linux操作体系能够支撑的进程最多只要2^6=64个了,这样不划算
B指令的的机器代码结构为
31 2827 26 25 24 230
cond101Lsigned_imed
若L为0则为直接跳转B,若L为1则为衔接跳转BL,signed_imed为24位有符号当即数,这个值为跳转的偏移量。
24位有符号数值的规模是-8M ~ +8M,而指令中偏移量为1时代表从当时PC开端向下跳1个字,即偏移量的单位为4个字节
因而,B指令向前和向后寻址的最大规模为32M
你能够试下如下代码:
BNEXT
NEXT
NOP
NOP
看一下那条跳转指令它的机器代码,最低24位当即数的值应该是-1
跟字对齐有点联系,由于ARM指令集的指令都是四字节的,所以偏移量的单位是4个字节。
假如当时跳转的偏移量为-1,那么PC会向前跳4个字节,假如偏移量为-8M,那么PC会向前跳-32M个字节

恩,最低24位是0xffffff,偏移量便是 -1
BNEXT
NOP
NOP
NEXT
NOP
B跳转是针对当时PC来核算的,而当时PC值等于当时正在履行指令的下下一条指令的地址值
向下跳,偏移量为正数,向上跳,偏移量为负数。这个上下方向是针对程序履行的方向来说的。

恩,是这样的

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/kaiguan/255930.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部