栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何从Linux内核模块中的逻辑地址获取物理地址?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何从Linux内核模块中的逻辑地址获取物理地址?

好吧,它看起来可能像这样(在虚拟地址后跟随PTE):

void follow_pte(struct mm_struct * mm, unsigned long address, pte_t * entry){    pgd_t * pgd = pgd_offset(mm, address);    printk("follow_pte() for %lxn", address);    entry->pte = 0;    if (!pgd_none(*pgd) && !pgd_bad(*pgd)) {        pud_t * pud = pud_offset(pgd, address);        struct vm_area_struct * vma = find_vma(mm, address);        printk(" pgd = %lxn", pgd_val(*pgd));        if (pud_none(*pud)) { printk("  pud = emptyn"); return;        }        if (pud_huge(*pud) && vma->vm_flags & VM_HUGETLB) { entry->pte = pud_val(*pud); printk("  pud = hugen"); return;        }        if (!pud_bad(*pud)) { pmd_t * pmd = pmd_offset(pud, address); printk("  pud = %lxn", pud_val(*pud)); if (pmd_none(*pmd)) {     printk("   pmd = emptyn");     return; } if (pmd_huge(*pmd) && vma->vm_flags & VM_HUGETLB) {     entry->pte = pmd_val(*pmd);     printk("   pmd = hugen");     return; } if (pmd_trans_huge(*pmd)) {     entry->pte = pmd_val(*pmd);     printk("   pmd = trans_hugen");     return; } if (!pmd_bad(*pmd)) {     pte_t * pte = pte_offset_map(pmd, address);     printk("   pmd = %lxn", pmd_val(*pmd));     if (!pte_none(*pte)) {         entry->pte = pte_val(*pte);         printk("    pte = %lxn", pte_val(*pte));     } else {         printk("    pte = emptyn");     }     pte_unmap(pte); }        }    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/387277.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号