MMU中VA如何根据CP15的C2定位页表项

在学习MMU的过程中遇到了一些问题,基于段表项的学习,

1.使能MMU后,看到一些资料说CPU发出的VA(virtual address)会变换为MVA(modified virtual address),然后通过高12位在页表基址进行索引得到对应的PA。其中VA到MVA这一过程是怎么变换的呢?且不论怎么变换的,最终都会根据页表基址进行索引。后面暂且都称为VA。

2.协处理器CP15的C2寄存器高18位记录了页表基址,,VA的高12位代表索引下标,使能MMU之后,VA通过CP15的C2里面记录的页表基址定位到对应的页表项,总共的页表项为4096(2^12)个,每个页表项4个字节,所需16KB空间存放页表,

下面进行场景分析

假设TTB为(int *)0x30000000,(存放TTB的基址要以16KB对齐)

ldr r0, =0x30000000 ;mcr p15, 0, r0, c2, c0, 0,//设置CP15的C2寄存器

页表项创建

index=va & 0xfff00000 //VA的高12位作为页表项索引

TTB[index] = (pa & 0xfff00000) | 页表项低20位的位操作;

总的来说,实现了在0x30000000x向上的16K空间中填充页表。

有些不理解的地方,写下来就想通了,索引就是根据CP15 的C2寄存器,以(0xffffc0000|C2)为页表基址,然后进行索引页表项。

2022/4/2

经过一番探索,在《深度探索嵌入式系统:从零开始设计、架构和开发》找到答案,

MMU中VA如何根据CP15的C2定位页表项_第1张图片

VA到MVA的变换涉及到协处理CP15的c13寄存器,其编码格式为 

PID表示当前进程所在的进程空间快编号,即当前进程的标识符,对于每个进程CPU发出的地址,即每个进程发出的VA寻址空间为0x00000000-0x1FFFFFFF,,进程的标识符取值为0~127,若PID为0,VA=MVA,非0,假设为n,则MVA=n*0x20000000-n*(0x20000000+0x1FFFFFFF)

MMU中VA如何根据CP15的C2定位页表项_第2张图片

附上图更形象,此中的图都是出自《深度探索嵌入式系统:从零开始设计、架构和开发》这本书上。

 

 

你可能感兴趣的:(arm)