4

現在、私はいくつかの研究関連プログラムを開発しており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->mmpgd of TTBR0pgdpgd of TTBR1

私の質問は次のとおりです。pteカーネル空間アドレスの を取得したい場合、 を使用current->mmして取得できpgdますか?

できない場合、代わりに他に試すことができるものはありますか?

どんな提案でも大歓迎です!ありがとうございました。

サイモン

4

2 に答える 2