请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】
及【嵌入式开发学习必备专栏】
上篇文章:【ARM Cache 系列文章 7.2 – ARMv8/v9 MMU 页表配置详细介绍 03 】
文章目录
- MMU 块描述符与页描述符
- Block Descriptor
- Block descriptor formats
- Block Entry 介绍
- Block Entry 的设定
- Block Entry 的特点
- Block Entry 使用场景
- Page Descriptor
- Page Descriptor 格式
- Block descriptors 和 Page descriptors 属性
- Block descriptors 和 Page descriptors 使用场景
MMU 块描述符与页描述符
在ARMv8/v9架构中,内存管理单元(MMU)使用描述符(Descriptors)来定义内存区域的属性。这些描述符被组织成表格,通常称为转换表(Translation Table)。转换表项(Translation Table Entry,TTE)可以是块描述符(Block Descriptor)或页描述符(Page Descriptor),它们定义了虚拟地址到物理地址的映射及其相关属性。
Block Descriptor
块描述符用于定义较大的内存区域的映射。在不同的转换级别(Level)中,块的大小可以不同。例如,在第一级转换(L1)中,ARMv8/v9 允许1GB
的块大小,在第二级转换(L2)中,允许2MB
大小(取决于具体的配置和实现)。
块描述符不仅仅定义了虚拟地址到物理地址的映射,还定义了访问权限(如读/写权限),是否可以执行,缓存策略(如是否可缓存,缓存类型),以及是否需要地址转换(Non-Secure, Secure)等属性。
Block descriptor formats
下图展示了52-bit输出地址和48-bit输出地址各种颗粒度的blcok descriptor 的格式:
通常我们只使用48-bit 4K的格式。
Block Entry 介绍
“Block Entry” 是指在页表中用来描述一块连续物理内存区域映射的条目。ARMv8/v9 架构支持多级页表结构,这些页表结构用来将虚拟地址空间(VA)映射到物理地址空间(PA)。页表项(PTE)可以是页表描述符,指向另一个页表的地址,或者是块描述符,直接映射到一个物理内存块。
Block Entry 的设定
如何设定一个页表项(PTE)是块描述符还是页描述符见文章 【ARM Cache 系列文章 7.1 – ARMv8/v9 MMU 页表配置详细介绍 02 】
Block Entry 的特点
- 连续内存映射:Block Entry 映射了一段连续的物理内存区域到虚拟内存中。这可以提高内存访问的效率,因为它减少了页表的层级和相关的内存访问代价。
- 大小可变:在 ARMv8/v9 架构中,Block Entry 可以表示不同大小的内存块。这取决于页表的层级和配置。例如,在一些配置中,第一级页表(L1)的 Block Entry 可能表示 1GB 的物理内存,而第二级(L2)或更低级别的 Block Entry 可能表示更小的内存块,例如 2MB。
- 灵活性和效率:使用 Block Entry 可以在保持足够页表粒度的同时减少页表的大小和深度,这提高了内存映射的灵活性和效率。特别是对于大量使用连续物理内存区域的应用场景(如大型数据库或多媒体处理),这种方法非常有利。
Block Entry 使用场景
- 大型内存映射:对于需要映射大块连续物理内存的场景,使用 Block Entry 比传统的页映射更有效率,因为它减少了页表遍历的开销。
- 性能敏感的应用:对于对内存访问性能有高要求的应用,例如高性能计算(HPC)或游戏,使用 Block Entry 可以优化内存访问速度。
- 系统启动和初始化:在系统启动和初始化阶段,操作系统可能使用 Block Entry 来设置初始的内存映射,确保快速访问关键内存区域。
Page Descriptor
页描述符用于定义较小内存区域的映射,通常是4KB大小的页面。页描述符在第三级转换(L3)中使用,它提供了更细粒度的内存管理能力。与块描述符类似,页描述符也定义了虚拟地址到物理地址的映射及相关的内存属性,如访问权限、执行权限、缓存策略等。
Page Descriptor 格式
下图展示了各种格式的页描述符的格式:
Block descriptors 和 Page descriptors 属性
下图展示了stage1 translation Block descriptors 和 Page descriptors 属性域:
见文章:【ARM Cache 系列文章 7 – ARMv8/v9 MMU 页表配置 01 】
下图展示了stage2 translation Block descriptors 和 Page descriptors 属性域:
bit[63]
: 对于stage 1 translations没有使用,对于 stage 2 translations 该 bit 留给 SMMU 使用(后面文章会介绍SMMU);
bits[62:59]
:对于stage 1 translations没有使用,对于 stage 2 translations Bits[62:60] 留给 SMMU 使用,Bit[59] 没有使用;
TODO
Block descriptors 和 Page descriptors 使用场景
- 块描述符主要用于映射较大的、属性统一的内存区域。使用块描述符可以减少转换表的大小和复杂度,提高地址转换的效率。
- 页描述符则用于映射需要细粒度控制的小内存区域。例如,操作系统内核通常需要对特定内存区域(如设备映射内存、内核代码和数据等)进行精确的权限和属性控制。
在设计操作系统或底层驱动时,合理利用块描述符和页描述符,可以有效地控制内存访问权限,提高系统的安全性和效率。