(番外二)Arm32 中虚拟地址机制分析(页表项属性分析)

Arm32 MMU 页表项属性

本篇文章接上一篇 (番外一)Arm32 中虚拟地址机制分析(Arm cortex-A系列 MMU工作机制分析) ,在上一篇文章中根据手册(《Arm Cortex-A Series Programmer’s Guide》)简单分析了Arm32中多级页表的简单原理,即 MMU 如何通过虚拟地址转换表将 CPU 发出的虚拟地址访问指令定位到具体的物理地址,本篇主要深入了解一下每一个页表项的属性对物理内存的访问的影响,首先贴出 Arm32 一级页表与二级页表结构图:

一级页表
在这里插入图片描述
二级页表
在这里插入图片描述
可以看到每个页表项中不仅包含了下级页表或者物理地址的映射地址(除了无效页表项),而且包含了诸如:TEX S SBZ AP 等属性位,这些属性位影响着 CPU 对内存的访问动作,下边先对 Arm32 对内存种类分配的定义进行简单分析,然后再引入 Arm32 如何通过属性来实现这些分类


Arm32 中内存的种类

借用手册中的话:早期的 Arm 架构允许开发人员通过简单的配置来指定 CPU 对内存页的访问动作,包括是否允许在某些内存地址上启用 cache 或者 写缓冲(write buffer)。但是对现如今越来越复杂的系统而言,这些简单的配置机制已经无法满足上层软件对硬件的要求,比如说存在多级缓存,多处理器共享内存等,所以在 Armv6开始,新的内存种类(memory type)定义被加入进来,并且在 Armv7中得到扩展。

在 Armv7 中,内存种类一共分为三种,如下所示,所有被映射到虚拟地址的内存页都应该被初始化为其中一种:

  • Strongly-orderd
  • Device
  • Normal
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ARM架构的Linux页表代码实现主要涉及到以下几个文件: 1. `arch/arm/include/asm/pgtable.h`:定义了ARM架构下的页表相关宏和数据结构,包括页表项(PTE)和页目录项(PMD)的定义。 2. `arch/arm/mm/pgtable.c`:实现了ARM架构下的页表相关函数,包括页表初始化、页表项/页目录项的创建和修改等。 3. `arch/arm/mm/mmu.c`:定义了ARM架构下的内存管理单元(MMU)的初始化和配置函数,包括页表的设置和切换等。 在ARM架构下,页表使用两级结构,包括页目录表(Page Directory Table)和页表(Page Table)。每个级别的表都有对下一级表的指针,最终指向物理内存的页帧。 ARM架构页表项(PTE)和页目录项(PMD)由特定位字段组成,用于保存物理地址、标志位和其他控制信息。页表项和页目录项的结构可以在`arch/arm/include/asm/pgtable.h`找到。 在ARM架构下,通过`pgd_offset`、`pmd_offset`、`pte_offset`等函数可以计算出对应虚拟地址页表的索引,并通过这些索引来获取或设置相应的页表项或页目录项。 初始化页表时,可以调用`pgd_alloc`、`pmd_alloc`、`pte_alloc`等函数来创建页表项和页目录项,并通过`pgd_populate`、`pmd_populate`等函数将物理页框与虚拟地址进行映射。 ARM架构的MMU初始化和配置主要通过`setup_mm_for_reboot`、`init_mmu`和`__create_page_tables`等函数完成。这些函数会设置页表寄存器(TTBR0/TTBR1)和控制寄存器(CRn),从而将页表切换到对应的地址空间。 需要注意的是,不同的ARM架构版本和具体的SoC可能会有一些细微的差异,因此具体的代码分析还需要参考相关的架构文档和代码实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值