現在、私はいくつかの研究関連プログラムを開発しており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
、最初のステップで間違っていたと思います。私が確認したアドレスはカーネル空間のアドレスであるのに対し、使用すると(ユーザー空間)しか取得できないとティムズ ノーツが言っているのを見たので、 .current->mm
pgd of TTBR0
pgd
pgd of TTBR1
私の質問は次のとおりです。pte
カーネル空間アドレスの を取得したい場合、 を使用current->mm
して取得できpgd
ますか?
できない場合、代わりに他に試すことができるものはありますか?
どんな提案でも大歓迎です!ありがとうございました。
サイモン