ARM64_HW_PGTABLE_LEVEL_SHIFT 宏的作用

文章详细解释了ARM64架构中页表层次的宏定义`ARM64_HW_PGTABLE_LEVEL_SHIFT(n)`,该宏用于计算不同层级页表索引所占的位数。在ARM64体系中,最大支持4级页表,通过`(4-n)*(PAGE_SHIFT-3)+3`的计算方式确定各级别页表的偏移量,例如PGDIR、PUD和PMD的位移。并举例验证了L1到L3的索引偏移计算结果。
摘要由CSDN通过智能技术生成

arch/arm64/include/asm/pgtable-hwdef.h 中有如下定义

/*                                                                               
 * Size mapped by an entry at level n ( 0 <= n <= 3)                             
 * We map (PAGE_SHIFT - 3) at all translation levels and PAGE_SHIFT bits         
 * in the final page. The maximum number of translation levels supported by      
 * the architecture is 4. Hence, starting at at level n, we have further         
 * ((4 - n) - 1) levels of translation excluding the offset within the page. 
 * So, the total number of bits mapped by an entry at level n is :               
 *                                                                               
 *  ((4 - n) - 1) * (PAGE_SHIFT - 3) + PAGE_SHIFT                                
 *                                                                               
 * Rearranging it a bit we get :                                                 
 *   (4 - n) * (PAGE_SHIFT - 3) + 3                                              
 */ 
#define ARM64_HW_PGTABLE_LEVEL_SHIFT(n) ((PAGE_SHIFT - 3) * (4 - (n)) + 3) 

该宏的注释翻译一下,大概的意思是:

在每一级“translation levels”中,也就是PGD, PUD, PMD 中,
都是使用 (PAGE_SHIFT - 3) 个bits作为map。且当前架构arm64 支持的最大的页表级数为4。
因此,除了PAGE_SHIFT,Ln 级索引(L0 索引即PGD, L1 索引即PUD,以此类推)的偏移还有
((4 - n) - 1) 个 (PAGE_SHIFT - 3) 。因此计算公式就是
((4 - n) - 1) * (PAGE_SHIFT - 3) + PAGE_SHIFT

对照下图,L1-L3 索引所在的偏移量分别是
L3 索引所在的偏移量: PAGE_SHIFT = 12
L2 索引所在的偏移量:1 * (PAGE_SHIFT-3) + PAGE_SHIFT = 21
L1 索引所在的偏移量:2 * (PAGE_SHIFT-3) + PAGE_SHIFT = 30
L0 索引所在的偏移量:3 * (PAGE_SHIFT-3) + PAGE_SHIFT = 39
图一
验证一下,Ln 索引对应的偏移为 ARM64_HW_PGTABLE_LEVEL_SHIFT(n),计算结果如下

 /* 
  *  PGDIR_SHIFT = ARM64_HW_PGTABLE_LEVEL_SHIFT(0) = 39
  *  PUD_SHIFT	 = ARM64_HW_PGTABLE_LEVEL_SHIFT(1) = 30
  *  PMD_SHIFT	 = ARM64_HW_PGTABLE_LEVEL_SHIFT(2) = 21
  */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值