首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EPT PTE与主机PTE条目的关系是什么?

EPT PTE与主机PTE条目的关系是什么?
EN

Stack Overflow用户
提问于 2019-04-09 09:12:44
回答 1查看 231关注 0票数 2

我试图找出在Linux系统中EPT与主机PTEs之间的关系,以及X86主机中的虚拟化。

例如,当管理程序通过提供主机内存页来设置EPT条目时,当客户在来宾中写入该页面时会发生什么?

在上述情况下,EPT条目是“脏”的,到该主机页的主机PTE条目是否仍然是脏的?

我为Linux编写了一个简单的管理程序,它支持EPT。我发现当来宾写一个页面时,它是在EPT条目中设置的脏位,但是通过检查主机PTE条目,我没有找到脏位集。

在EPT违规处理程序中,我调用kmalloc为来宾获取一个主页。然后,我使用下面的代码检查该页面的主机PTE条目。

代码语言:javascript
复制
void pgtable_walk(unsigned long addr)
{
    pgd_t *pgd;
    pud_t *pud;
    pmd_t *pmd;
    pte_t *pte;
    pte_t  cpte;
    unsigned long page_mask;
    unsigned int level;
    phys_addr_t phys_addr;
    unsigned long offset;

    pgd = pgd_offset(current->mm, addr);
    printk(KERN_ALERT "pgd is : %lx\n", (unsigned long)pgd->pgd);
    printk(KERN_ALERT "pgd index: %lx\n", (unsigned long)pgd_index(addr));
    pud = pud_offset(pgd, addr);
    printk(KERN_ALERT "pud is : %lx\n", (unsigned long)pud->pud);
    printk(KERN_ALERT "pud index: %lx\n", (unsigned long)pud_index(addr));
    pmd = pmd_offset(pud, addr);
    printk(KERN_ALERT "pmd is : %lx\n", (unsigned long)pmd->pmd);
    printk(KERN_ALERT "pmd index: %lx\n", (unsigned long)pmd_index(addr));
    if(!pmd_large(*pmd)) {
        pte = pte_offset_kernel(pmd, addr);
        printk(KERN_ALERT "pte is : %lx\n", (unsigned long)pte->pte);
        printk(KERN_ALERT "pte index: %lx\n", (unsigned long)pte_index(addr));
        level = 2;
    } else {
        pte = (pte_t *)pmd;
        level = 1;
    }
    page_mask = page_level_mask(level);
    phys_addr = pte_pfn(*pte) << PAGE_SHIFT;
    offset    = addr & ~page_mask;

    printk("Final Phys Addr: %lx, dirty=%x, pte=%lx\n",
            (unsigned long)(phys_addr | offset), pte_dirty(*pte), pte_val(*pte));
}

如果是这样的话,Linux如何知道哪个页面是脏的还是不脏的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-18 19:48:06

处理器只能设置PTE中用于在执行写入时翻译虚拟地址的脏位。因此,当来宾写入页面时,处理器会设置来宾PTE和EPT中的脏位。*当在来宾中发生写入时,处理器没有指向主机页表的指针,也不知道该页是否在任何主页表中被映射。因此,如果主机中的软件想要找出页面是否脏,它必须查看EPT。

*只有在可选的EPT A/D功能可用并通过在VMCS的EPTP字段中设置位6来启用EPT脏位时,才会设置EPT脏位。(见Intel SDM第28.2.5节)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55589131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档