我使用类似于下面给出的代码将系统调用提供的虚拟地址映射到物理地址(取自http://www.informit.com/articles/article.aspx?p=29961&seqNum=3):
print_pa (struct mm_struct *mm, unsigned long va) {
pgd t *pgd = pgd_offset(mm, va);
if (pgd_present(*pgd)) {
pmd t *pmd = pmd_offset(pgd, va);
if (pmd_present(*pmd)) {
pte_t *pte = pte_offset(pmd, va);
if (pte_present(*pte)) {
printk("va 0x%lx -> pa 0x%lx\n",
va, page_address(pte_page(*pte));
}
}
}
}
我正确使用page_address()吗?它给了我像0xdded1000这样的地址,但我在机器上只有1GB的RAM。以下网页说page_address()返回一个物理地址,但我的结果没有意义(对我来说)https://kernel.org/doc/gorman/html/understand/understand023.html。