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的索引偏移计算结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
  */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值