ARMv7架构Linux下mm_struct、页表地址及pgd_t定义相关疑问
问题1:PGD表项值低于0xc0000000的原因说明
你的核心认知和操作存在两处错误:
- PGD表项的内容不是虚拟地址:你读到的
0xbf814835是带属性位的下一级页表物理地址,不是内核虚拟地址,因此不需要落在0xc0000000以上的内核虚拟地址空间范围内,低于该值是正常情况。 - LPAE页表宽度认知错误:结合第二个问题中pgd_t的定义可知,你的内核开启了ARMv7 LPAE(大物理地址扩展)特性,此时所有页表项均为64位宽度:你通过
x/4x 0xc224c000读到的0xbf814835只是64位PGD项的低32位,高32位是相邻地址存储的0xbf814c35,需要先合并为64位值,再掩码去掉低12位属性位,才能得到下一级PMD页表的完整物理基地址。 - 额外操作误区:开启LPAE的ARMv7 Linux使用3级页表(PGD→PMD→PTE),你认为PGD项直接指向PTE的认知有误,中间需要遍历PMD表才能得到PTE地址。
问题2:pgd_t定义为2元素unsigned long数组的原因
该定义对应开启了CONFIG_ARM_LPAE配置的32位ARM内核:
LPAE特性支持最大40位物理地址,要求所有页表项(PGD、PMD、PTE)均为64位宽度。而32位系统中unsigned long的长度为32位,因此需要用2个连续的unsigned long变量拼接存储一个64位的页表项,因此pgd_t被定义为长度为2的unsigned long数组。
内容的提问来源于stack exchange,提问作者user2699113
相关产品推荐
相关产品推荐

