参考文献:
1.《ARM Cortex-A(armV7)编程手册V4.0》
2.《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition》
3.《深入理解Linux内核》
注意:尽量阅读原文ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition,作者只做了自己需要了解的部分的翻译。尽量避免断章取义。
1.Virtual Memory System Architecture (VMSA)虚拟内存系统架构
B3.1 About the VMSA 关于VMSA
在VMSAv7中,内存管理单元(MMU)控制地址转换、访问权限和内存属性的确定和检查,以及处理器进行的内存访问。MMU由系统控制寄存器控制,也可以禁用MMU。
每个MMU使用一组地址转换和内存映射表中的相关内存属性。对于MMU,转换表定义了以下属性:
- 访问安全或不安全地址映射
- 内存访问权限控制:不访问、只读、只写、只读/写
- 内存区域属性:顶层属性、内存类型、设备类型等
- 地址转换映射:
- 如果只有一个转换阶段,那么就是从虚拟地址(VA)到物理地址(PA)
- 如果由两个转换阶段,那么第一阶段从虚拟地址转到中间物理地址(IPA),第二阶段从IPA转到PA,如下图
系统控制协处理器(CP15)寄存器控制VMSA,包括定义转换表的位置,以及启用和配mmu。此外,它们还会报告在内存访问过程中发生的任何故障。
B3.1.1 Address types used in a VMSA description VMSA介绍中用到的地址
对VMSAv7的描述引用了以下地址类型:
虚拟地址: 指令中使用的地址,作为数据或指令地址,是虚拟地址(VA)。PC、LR或SP中的地址是VA。VA映射从零运行到VA空间的大小。对于ARMv7,最大VA空间为4GB,最大VA范围为0x00000000-0xFFFFFFFF。
中间物理地址:在提供两个地址转换阶段的转换中,IPA是第1阶段转换后的地址,也是第2阶段转换的输入地址。在只提供一个地址转换阶段的转换机制中,IPA与PA相同。
在ARM VMSA实现中,只提供了一个地址转换的阶段:
- 如果实现不包含虚拟化扩展
- 安全状态执行时
- 在Hyp模式下执行。
B3.1.2 Address spaces in a VMSA implementation VMSA中的地址空间
ARMv7体系结构支持:
- 最多32位的VA地址空间。实际宽度为具体实现定义
- 一个高达40位的IPA地址空间。转换表和相关的系统控制寄存器定义了所实现的地址空间的宽度。
备注:大型物理地址扩展程序定义了两种转换表格式。长描述符格式允许以4kb的粒度访问完整的40位IPA或PA地址空间。短描述符格式:
- 允许访问32位PA地址空间,但最小访问单位为4KB。
- 用于访问40位的PA地址空间,但最小访问单位为16MB。
B3.1.3 About address translation 地址转换
地址转换是将一种地址类型映射到另一种地址类型的过程,例如,将VAs映射到IPAs,或将VAs映射到PAs。转换表定义了从一种地址类型到另一种地址类型的映射。
转换表基址寄存器表示转换表的开始。
一个完整的转换表查找过程被称为转换表遍历。它是由硬件自动执行的,并且会耗费一些时间。为了完成VA到PA的映射,由于最小访问单位的原因,单个输入地址到输出地址的转换可能需要对转换表进行多次访问,每次访问都提供更小的访问单元。每次访问都被描述为一个地址查找级别。查找的最后一个级别定义了:
转换备用缓冲区(TLBs)通过缓存转换表遍历的结果,降低了内存访问的平均时间。TLBs表现为转换信息表的缓存,为了管理TLBs的内容,VMSA为TLBs提供了维护操作。
B3.3 Translation tables
VMSAv7定义了两种可替代的转换表格式:
短描述符格式:不包含大型物理地址扩展的实现中唯一支持的格式。它在转换表中使用了32位的描述符条目,并提供了:
- 最多两级地址查找;
- 32位输入地址;
- 输出地址最高可达40位;
- 通过使用supersections实现32位以上地址的支持,最小内存单位为16MB
- 支持无访问域、客户端域和管理器域
- 32位的表条目(entry)
长描述符格式:大型物理地址扩展增加了对这种格式的支持。它在转化表中使用了64位的描述符条目,并提供了:
- 最多三级地址查找
- 第二级转换时,输入地址高达40位
- 输出地址高达40位
- 整个PA范围使用4kb的最小内存访问单元
- 不支持域,所有存储区都被视为在客户域中
- 64位表条目
- 固定4kB的表大小,除非输入地址被截断
B3.3.2 Information returned by a translation table lookup 转换表遍历返回结果
在VMSA实现中,当启用了关联的MMU时,内存访问需要一个或多个转换表查找。如果TLB中没有转换所需的转换表描述符,则执行转换表遍历以获取描述符。无论是从TLB还是作为转换表遍历的结果,都返回:
- 与查找的输入地址对应的输出地址
- 与该输出地址对应的一组属性。
B3.5 Short-descriptor translation table format
短描述符转换表格式
短描述符转换表格式支持以内存段(memory sections)或内存页(memory pages)为基础的内存映射(笔记:section和page是内存单元的描述):
- Spersections: 16MB的内存块(memory block)
- Sections: 1MB的内存块
- Large pages: 64KB的内存块
- Small pages: 4KB的内存块
Supersections, Sections 和Large pages 映射内存的大区域,他们只使用一个TLB条目。
当使用段描述符转换表格式时,内存中保留两级转换表:
第一级转换表:包含基地址,Section和Supersection的转换属性,指向第二级表的Large page或者Small page的指针;
第二级转换表:包含基地址,Small page和Large page的转换属性,二级表需要1KB的内存,二级表也叫做页表(page table)
在转换表中,描述符可以是:
- 一个无效的或错误的记录
- 一个页或者段的记录,它定义了内存访问属性
- 保留的格式
描述符的位[1:0]给出了描述符类型。
图B3-3给出了在使用短描述符转换表格式时的地址转换的一般视图。
图中说明了虚拟地址VA[31-N:20]包含了一级转换表的索引信息,VA[19:12]包含二级表(页表)的索引信息。
B3.5.1 Short-descriptor translation table format descriptors
短描述符转换表的一级描述符格式
第一级表中的每个条目都描述了关联的1MB 的MVA(修改后的虚拟地址)的映射。
一种32位的描述符格式如下,最后两位bits[1:0]决定描述符类型,这两位为01时,描述符给出了一个二级转换表的地址,该表指定了关联的1MByte 的VA映射。
第一级描述符中的地址信息为:
Page table :描述符的位Bits[31:10]是页(Page)地址的bits[31:10]位
Section:描述符的位Bits[31:20]是节(Section)地址的bits[31:20]位
Supersection:描述符的位 Bits[31:24]是超级块(Supersection)地址的 bits[31:24]位
笔记:使用Section作为一级页表中的最小寻址单位时,共12位地址表示,也就是一级描述符将4GB的虚拟地址划分为 4096*1MB。
Short-descriptor translation table second-level descriptor formats
短描述符转换表的二级描述符格式
二级描述符中的地址信息为:
Large page:描述符的位 Bits[31:16]是大页(Large page)地址的 bits[31:16]位
Small page:描述符的位 Bits[31:12]是小页(Small page)地址的 bits[31:12]位
· 笔记:使用Small Page作为二级页表的最小寻址单位时,共20位地址表示,也就是2^20*4KB = 4GB
B3.5.2 Memory attributes in the Short-descriptor translation table format descriptors
B3.5.2短描述符转换表格式描述符中的内存属性
本节描述除描述符类型字段和地址字段以外的描述符字段:
TEX[2:0], C, B 内存区域属性位
AP[2], AP[1:0] 访问权限位
B3.5.5 Translation table walks, when using the Short-descriptor translation table format
3.5.5翻译表遍历时,使用短描述符转换表格式
Section(1MB)的转换流程
Small page的转换流程