目前我正在开发一些与研究相关的程序,我需要找到pte
一些特定的地址。我的开发环境是 Juno r1 板(CPU 是 A53 和 A57 ),它运行 arm64 Linux 内核。
我使用一些典型的页表遍历代码,如下所示:
int find_physical_pte(void *addr)
{
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
pte_t *ptep;
unsigned long long address;
address = (unsigned long long)addr;
pgd = pgd_offset(current->mm, address);
printk(KERN_INFO "\npgd is: %p\n", (void *)pgd);
printk(KERN_INFO "pgd value: %llx\n", *pgd);
if (pgd_none(*pgd) || pgd_bad(*pgd))
return -1;
pud = pud_offset(pgd, address);
printk(KERN_INFO "\npud is: %p\n", (void *)pud);
printk(KERN_INFO "pud value: %llx\n", (*pud).pgd);
if (pud_none(*pud) || pud_bad(*pud))
return -2;
pmd = pmd_offset(pud, address);
printk(KERN_INFO "\npmd is: %p\n", (void *)pmd);
printk(KERN_INFO "pmd value: %llx\n",*pmd);
if (pmd_none(*pmd) || pmd_bad(*pmd))
return -3;
ptep = pte_offset_kernel(pmd, address);
printk(KERN_INFO "\npte is: %p\n", (void *)ptep);
printk(KERN_INFO "pte value: %llx\n",*ptep);
if (!ptep)
return -4;
return 1;
}
但是,当程序检查pte
地址(0xffffffc0008b2000)时,它总是返回一个空的pmd
。
我的猜测是我pgd
在第一步中弄错了。我看到Tims Notes说 using current->mm
only 可以获取pgd of TTBR0
(用户空间pgd
),而我检查的地址是内核空间地址,所以我应该尝试获取pgd of TTBR1
.
所以我的问题是:如果我想获取pte
内核空间地址,我可以current->mm
用来获取pgd
吗?
如果我不能,还有什么我可以尝试的吗?
欢迎任何建议!谢谢你。
西蒙