频道栏目
首页 > 资讯 > 其他 > 正文

ARMV8 MM之物理地址/虚拟地址映射方法

18-04-19        来源:[db:作者]  
收藏   我要投稿

ARMV8 MM之物理地址/虚拟地址映射

对于CPU来说,如果没有启动MMU,那么CPU直接通过物理地址寻址,如果启用了MMU,那么CPU通过虚拟地址寻址,MMU负责将虚拟地址转换为物理地址,进而访问实际的物理地址空间。本文主要介绍ARMV8虚拟地址到物理地址的映射方案。


1. Translation stage

ARMV8支持两个stage的地址转换,分别是stage1和stage2。如果转换策略仅使用stage1,则stage1负责将VA转换为PA;如果转换策略使用stage1和stage2,则stage1负责将VA转换为IPA,stage2负责将IPA转换为PA。

2. Translation Tables

ARMV8最多可以支持4个exception level,分别是el0,el1,el2,el3,其特权级别依次升高,el3拥有最高级别的权限。
EL1维护了两组translation table,每一组translation table可能包含level0-leve3多个级别。第一组translation table负责低地址空间映射,第二组translation table负责高地址空间映射。EL1维护的translation table可以给EL0和EL1用。如用户程序工作在EL0,OS工作在EL1,这种情况下用户程序可以使用第一组translation table,使用低地址空间,而OS可以使用第二组translation table,使用高地址空间。
EL2维护了两组translation table,每一组translation table可能包含level0-level3多个级别。第一组translation table负责低地址空间映射,第二组translation table负责高地址空间映射。EL1维护的translation table可以给EL0和EL2用。如用户程序工作在EL0,OS工作在EL2,这种情况下用户程序可以使用第一组translation table,使用低地址空间,而OS可以使用第二组translation table,使用高地址空间。
EL2还维护了另外一组translation table,专门负责stage2 IPA到PA的转换,这组table给non-secure EL0&1使用。
EL3维护了一组translation table,专门给EL3用。

3. 虚拟地址物理地址范围

armv8是64位的CPU,但并不意味这其寻址范围是0-0xffff_ffff_ffff_ffff。
3.1. 物理地址范围
一般来说,物理地址最大支持48 bits,不过如果支持armv8-LPA(large phsical address)并且page size是64K的时候,可支持52bits物理地址。本文后续仅考虑48bits物理地址,对于52bits物理地址不再涉及,有兴趣的朋友可以在我的博客下方留言讨论。
3.2. 虚拟地址范围
虚拟地址是ARM core使用的地址,由于ARM core的寄存器如PC,LR,SP,X0-X30都是64位寄存器,所以CPU是可以发出64位虚拟地址的,但并不意味着其寻址范围就是0-0xffff_ffff_ffff_ffff,这主要受限于mmu所支持的虚拟地址范围。
MMU一般支持的虚拟地址寻址范围是和物理地址一致的,但是可以支持两个地址范围,高位地址范围和低位地址范围。如下图:
这里写图片描述
../201510/GridViewLiveTiles.html

如果CPU发出的虚拟地址在0x0000_0000_0000_0000-0x0000_ffff_ffff_ffff范围内,则MMU使用TTBR0_ELX指向的translation table转换成物理地址;如果CPU发出的虚拟地址在0xffff_0000_0000_0000-0xffff_ffff_ffff_ffff,则MMU使用TTBR1_LEX指向的translation table转换成物理地址。对于Linux操作系统来说,地址范围0x0000_0000_0000_0000-0x0000_ffff_ffff_ffff给用户空间使用,地址范围0xffff_0000_0000_0000-0xffff_ffff_ffff_ffff给内核空间使用。

4. Page size

看Linux内核管理机制的时候不可避免的会看到一个名词:page size,page size是一个什么样的概念,它的源头又在何处呢?从本质上来说,page size是虚实地址转换的粒度,是一个最小的转换单元。
地址转换最后一级level3 translation table entry指向一个page,而虚拟地址的低位直接用作page索引。从这里也可以看出来,一个page一定是物理地址连续的,而两个page之间,即便虚拟地址连续,在物理地址上也可能不连续。
Armv8支持4K,16K,64K page size。

5. 虚实地址映射

5.1. Translation table descriptor
这里写图片描述
../201510/GridViewLiveTiles.html

这是page size为4K时,虚实地址转换的逻辑图,虚实地址转换的细节下一章节再讨论,本章节主要讨论涉及到的三个table descriptor。
Translation table 支持三种descriptor,一个descriptor就是table中的一条entry,一条entry占用64 bits,一个table占用一个物理页,对于4K page来说,一个table有512个entry。三种descriptor分别table descriptor,block descriptor和page descriptor。
? Table descriptor:定义下一级table的地址。
这里写图片描述
Next-level table address[47:m]定义了下一级table的基地址,对于4K page size来说,m是12,其实就是一个物理页的起始地址。
? Block descriptor:定义一段连续物理地址空间,该物理地址空间大于page size。
这里写图片描述
Output address[47:n]定义了一段连续的物理地址空间,n的值跟table level以及page size都有关,对于table level 2以及page size 4K来说,n是21,也就是说定义了一段2M的连续物理地址空间。
? Page descriptor:定义一段连续物理地址空间,page。
这里写图片描述
Output address[47:12]定义了一段4K的连续物理地址空间,及一个4K的page。

Armv8支持level0,level1,level2,level3四级table:
? TTBR_ELX指向level0 table,level0 table只能包含table descriptor,指向level 1 table。
? level 1 table可以包含block descriptor也可以包含table descriptor,前者指向level 2 table,后者定义一段1G的连续物理地址空间。
? level 2 table可以包含block descriptor也可以包含table descriptor,前者指向level 3 table,后者定义一段2M的连续物理地址空间。
? level3 table只能包含page descriptor,定义一个page,本例中是定义一段4K的连续物理地址空间。
5.2. 地址映射详解
这里还是拿4K page为例来说明,对于16K,64K page size的情况,原理上是一样的,有问题的朋友可以在我的博客留言讨论。
虚实地址映射的目的是将虚拟地址映射成物理地址,block descriptor和page descriptor都会定义一段连续的物理地址空间,虚拟地址最终转换成的物理地址要么落在block descriptor定义的物理地址空间内,要么落在page descriptor定义的物理地址空间内。
首先我们要看一下虚拟地址的格式:
这里写图片描述
? IA[47:39]用来索引level 0 table。Level0 table的物理基地址存放在TTBR_ELX中,IA[47:39]作为索引找到level 0 table中的某个entry,该entry返回level 1 table的基地址,level 1 table必须是页对齐的,所以这里返回的是地址bits[47:12]。
这里之所以用IA[47:39] 9个bits作为level 0 table的索引,是因为对于4K的page来说,最多有512个entry,9个bits正好可以覆盖所有的entry。
? IA[38:30]用来索引level 1 table。上一步找到了level 1 table的基地址,现在可以用IA[38:30] 9个bits索引到level 1 table的某个entry,该entry可能是一个table descriptor返回level 2 table的基地址,也可能是一个block descriptor,返回1G block region基地址[47:30],之所以覆盖1G的物理地址空间是因为参与地址映射的虚拟地址是48bits,高18bits用于索引level 0/1 table,而低30bits直接用作block region的索引,索引范围就是一个1G。换句话说,虚拟地址高18bits用于索引level 0/1 table,找到一个block descriptor,该block descriptor返回物理地址的高18 bits[47:30],虚拟地址的低30bits直接与返回的物理地址的高18 bits拼成一个48 bits的物理地址。
? 如果上一步索引到得到的是level 2 table基地址,那么IA[29:21]用来索引level 2 table,得到level 3 table的基地址或者block descriptor,level 3的block descriptor覆盖的物理地址空间是2M,原因跟上一步是一样的,不明白的朋友可以在我的博客留言讨论。
? 如果上一步索引得到的是level 3 table基地址,那么IA[20:11]用来索引level 3 table,得到page descriptor,page descriptor覆盖4K的物理地址空间,虚拟地址剩余的IA[11:0]用于在4K内索引得到某一个物理地址。

相关TAG标签
上一篇:windows下获取批量文件文件名的方法
下一篇:Java虚拟机基础学习(四)垃圾收集算法
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站