linux下虚拟地址到物理地址的映射:
以分段这种简单的情况分析:
4GB的空间分段管理,每段1MB,共4k段,显然每段需要一定内存开销来描述该
段虚拟地址到物理地址的映射及该段的其他特性。
规定以4字节来描述每段,则4k段需要4k*4=16kB字节的开销来描述整个内存分
段的特性.
我们把这连续的16kB字节称为页表,如下图所示.其中每行的4字节称为一个页
表项(根据上面的描述,我们知道每个页表项描述了对应的1MB的内存空间).这
连续的16kB的首地址称为页表基地址,需要存储在MCU的协处理器cp15的c2寄
存器中,cp15的c2寄存器称为页表基址寄存器.
假设我们的页表基地址为0x30004000
|--------|--------|--------|--------| 0x30004000<----页表基地址
|--------|--------|--------|--------| 0x30004004
|--------|--------|--------|--------| 0x30004008
|........|........|........|........| 0x3000400c<----PageIndex
|--------|--------|--------|--------|
|--------|--------|--------|--------|
|........|........|........|........|
|--------|--------|--------|--------|
|--------|--------|--------|--------|
|--------|--------|--------|--------|
|--------|--------|--------|--------| 0x30007ffc
不管虚拟地址还是物理地址,都是由32bit来表示,当只用到一级页表时,这32bit
分成两个部分:
基地址(12bit)+偏移地址(20bit)
因为我们每段为1MB所以这个偏移地址需要20bit来表示.相对于每一个1MB的段
来说,其对应的关系就在于它们的基地址存在着对应关系,而这种对应关系就存
在于上述页表中.
在MCU需要查每个虚拟地址对应的物理地址时,MCU把这个虚拟地址的高12bit取
出来,作为一个12bit的数Index1:
假设我们令虚拟地址为VA,物理地址为PA,则Index1 = VA >> 20 ;
然后我们再把index1向左移动2位,得到Index2: Index2 = Index1*(2^2)
即: Index2 = (VA >> 20)*4
得到这个Index2后,我们可以把"Index2 + 页表基地址" 得到一个页表项的地址:
PageIndex
然后,我们取这个PageIndex地址所对应的数据,该数据就描述了虚拟地址和物理
地址的对应关系.我们以[PageIndex]表示这个数.
由前面的分析我们知道,我们需要一个物理地址所对应的12bit的基地址,其中:
[PageIndex][31:20]即[PageIndex]的第31~20位作为我们的PA[31:21],它和我们
的VA[19:0]构成了一个32位的物理地址.
其中[PageIndex][19:0]用于描述该段1MB空间内存的读写权限等其他属性.
FROM: