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 |
如:假定两个进程1、2运转时的VA都是0-32M,则他们的MVA分别是0x02000000-0x03ffffff、0x04000000-0x05ffffff,这样进程切换就省劲多了,不用进行重建页表等作业。
由于,在32位的CPU体系上,虚拟地址空间为2^32 = 4G
而VA和MVA的转化公式为:
if(VA < 32M) then
else
这样,只需每个进程的VA都在32M之内,就能够确保每个进程的MVA不会产生堆叠。
2^25 = 32M。别的,能够核算出进程最多为2^(32-25) = 128个
那么PID就只要6位了,linux操作体系能够支撑的进程最多只要2^6=64个了,这样不划算
B指令的的机器代码结构为
31 28 cond 若L为0则为直接跳转B,若L为1则为衔接跳转BL,signed_imed为24位有符号当即数,这个值为跳转的偏移量。 24位有符号数值的规模是-8M ~ +8M,而指令中偏移量为1时代表从当时PC开端向下跳1个字,即偏移量的单位为4个字节 因而,B指令向前和向后寻址的最大规模为32M |
你能够试下如下代码:
NEXT 看一下那条跳转指令它的机器代码,最低24位当即数的值应该是-1 跟字对齐有点联系,由于ARM指令集的指令都是四字节的,所以偏移量的单位是4个字节。 假如当时跳转的偏移量为-1,那么PC会向前跳4个字节,假如偏移量为-8M,那么PC会向前跳-32M个字节 |
NEXT B跳转是针对当时PC来核算的,而当时PC值等于当时正在履行指令的下下一条指令的地址值 向下跳,偏移量为正数,向上跳,偏移量为负数。这个上下方向是针对程序履行的方向来说的。 |