#SC2440虚拟地址到物理地址的转换

2019-07-12 21:14发布

虚拟地址到物理地址的映射

声明:本文得出的结论皆来自于《嵌入式linux完全开发手册》,是在尝试自己理解其含义之后用自己的语言总结出来的,以便于更好的去理解本节内容。 VA:虚拟地址
WVA:经过转换后的虚拟地址
PA:物理地址
PID:进程标识号,由CP15的C13取得。
1、 虚拟地址得到转换后虚拟地址
若VA < 32M,则MVA = VA | (PID << 25),
其他情况VA = MVA。
32M = 2^25,所以PID要左移25位以便得到不重复的物理地址空间。
Tip:那个VA < 32M,至于为什么是32,我觉得可能是程序运行时的代码空间不会超出后面32M的虚拟地址空间。由于这种取得MVA的方法就是为了简化防止拥有重叠的虚拟地址的不同进程映射到同一物理地址空间所做的工作,而32M之后的虚拟内存空间存放系统组件以及动态链接库等,可以为不同进程所共享,所以就不需要专门去为每个进程区分32M之后的虚拟地址空间所对应的物理地址空间了。
2、 页表分类
2.1、一级页表条目
一级页表
标识低2位 条目类型 00 无效条目 01 粗页表条目 10 段条目 11 细页表条目
2.2、二级页表条目
二级页表
标识低2位 条目类型 00 无效条目 01 大页条目 10 小页条目 11 极小页条目
3、 各页表之间关系
页表关系
3.1、指向关系
指向关系
其中可以理解为段、大页、小页、极小页属于同一级别,因为由它们可以直接得到物理地址。
粗页表、细页表属于二级页表,页表属于一级页表。
3.2、包含关系
(1)页表可以包含有4096个段条目(即段描述符),每个段存放有1M的物理地址空间。
(2)页表可以包含有4096个粗页表
1.每个粗页表包含256个条目,每个条目可以索引4K的物理地址
2.一个大页可以索引64K物理地址,粗页表每16个条目可以指向同1个大页
3.一个小页可以索引4K的物理地址,粗页表每1个条目可以指向1个小页
4.一个极小页可以索引1K的物理地址,粗页表不可指向极小页
(3)页表可以包含有4096个细页表
1.每个细页表包含1024个条目,每个条目可以索引1K的物理地址
2.一个大页可以索引64K物理地址,细页表每64个条目可以指向同1个大页
3.一个小页可以索引4K的物理地址,细页表每4个条目可以指向1个小页
4.一个极小页可以索引1K的物理地址,细页表每1个指向1个极小页
4、索引步骤
(1)段方式
从CP15的C2(页表基址寄存器)取得一级页表物理地址(位[31:14]),由MVA的[31:20]位索引到一级页表中的对应的段描述符,从段描述符的[31:20]位得到对应段的物理地址,由MVA的[19:0]位在该段中索引要操作的物理地址。
(2)粗页表方式(保存的是大页)
从CP15的C2(页表基址寄存器)取得一级页表物理地址(位[31:14]),由MVA的[31:20]位索引到一级页表中的对应的粗页表描述符,由该粗页表描述符的[31:10]得到对应粗页表的物理地址,由MVA的[19:12]位在该粗页表中索引到一个大页描述符,从该大页描述符的[31:16]位得到大页的物理地址,由MVA的[15:0]位在该大页中索引到要操作的物理地址。
大页保存在细页表中的索引方式雷同
(3)粗页表方式(保存的是小页)
从CP15的C2(页表基址寄存器)取得一级页表物理地址(位[31:14]),由MVA的[31:20]位索引到一级页表中的对应的粗页表描述符,由该粗页表描述符的[31:10]得到对应粗页表的物理地址,由MVA的[19:12]位在该粗页表中索引到一个小页描述符,取出描述符[31:12]得到小页表的物理地址,然后由MVA的[11:0]索引到小页表中存放的物理地址。
(4)细页表(保存的是极小页表)
从CP15的C2(页表基址寄存器)取得一级页表物理地址(位[31:14]),由MVA的[31:20]位索引到一级页表中的对应的细页表描述符,由该细页表描述符的[31:12]位索引到一个极小页表的基址,再由MVA的[19:10]索引到该极小页表中的一个描述符,取出该描述符的[31:10]索引到极小页的物理地址,再由MVA的[9:0]在该极小页中索引到要操作的物理地址。
综述:
段索引:
TTB[31:14] MVA[31:20] 得到段描述符
DUB[31:20] MVA[19:0] 得到物理地址
粗页表大页:
TTB[31:14] MVA[31:20] 得到粗页表描述符
SOB[31:10] MVA[19:12] 得到大页表描述符
BIB[31:16] MVA[15:0] 得到物理地址
细页表大页:
TTB[31:14] MVA[31:20] 得到细页表描述符
FIB[31:12] MVA[19:12] 得到大页表描述符
BIB[31:16] MVA[15:0] 得到物理地址
粗页表小页:
TTB[31:14] MVA[31:20] 得到粗页表描述符
SOB[31:10] MVA[19:12] 得到小页表描述符
SMB[31:12] MVA[11:0] 得到物理地址
细页表小页:
TTB[31:14] MVA[31:20] 得到细页表描述符
FIB[31:12] MVA[19:12] 得到小页表描述符
SMB[31:12] MVA[11:0] 得到物理地址
细页表极小页:
TTB[31:14] MVA[31:20] 得到细页表描述符
FIB[31:12] MVA[19:10] 得到极小页描述符
VSB[31:10] MVA[9:0] 得到物理地址
Tip:
SOB: coarse base
FIB: fine base
DUB: section base
SMB: small base
VSB: very small base
BIB: big base