首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QEMU是否模仿TLB?

QEMU是否模仿TLB?
EN

Stack Overflow用户
提问于 2015-03-16 06:21:34
回答 2查看 3K关注 0票数 7

我有一个很简单的问题,QEMU是否模仿TLB?当来宾linux系统执行"invlpg“指令时会发生什么,就像TLB条目无效一样。我知道QEMU有一个软链接,它用于将来宾虚拟地址转换为主机虚拟地址,但是QEMU模拟了一个实际的TLB,以及"invlpg“指令的效果是什么。还是QEMU简单地忽略了这个指令?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-18 00:35:17

答案介于“是”和“否”之间。QEMU不试图模拟实际的来宾CPU的TLB (这是一种硬件,可以加速从来宾虚拟地址到来宾物理地址的查找)。然而,它确实实现了自己非常相似的数据结构,它称之为TLB --这加速了从来宾虚拟地址直接查找RAM的虚拟地址,或者从来宾虚拟地址到模拟设备的读/写功能。

由于CPU TLB和QEMU的TLB有相似之处,我们可以使用客户指令来使TLB失效或以其他方式对TLB进行操作,从而执行QEMU失效(这就是helper_invlpg()中的tlb_flush_page()调用所做的);因此这些指令不是简单的非操作。如果它使用查询缓存和TLB信息的cpuid指令,我们也会对客户撒谎,并告诉它它的TLB的大小。但是我们实际上并没有对来宾TLB建模--所以您不会看到客户TLB大小的性能变化,您也无法记录有关来宾TLB命中和错过的信息,我们也不会在具有TLB的CPU架构上实现TLB锁定。

最后,监视器"info tlb“命令的名称相当错误,因为它实际上显示的是有关来宾页面表设置的信息,这与TLB状态无关。

票数 7
EN

Stack Overflow用户

发布于 2015-03-16 06:25:32

QEMU是否模仿TLB?

是的,

QEMU监视器控制台提供了一个info tlb命令,它将

列出TLB (TranslingLook偏缓冲区),即物理内存和虚拟内存之间的映射

CPU仿真文档有一个部分说

页面缓存在QEMU源中称为"TLB“。

在源代码(即target-i386/cpu.c )中,我们看到与TLB相关的以下定义:

代码语言:javascript
复制
/* TLB definitions: */

#define L1_DTLB_2M_ASSOC       1
#define L1_DTLB_2M_ENTRIES   255
#define L1_DTLB_4K_ASSOC       1
#define L1_DTLB_4K_ENTRIES   255

#define L1_ITLB_2M_ASSOC       1
#define L1_ITLB_2M_ENTRIES   255
#define L1_ITLB_4K_ASSOC       1
#define L1_ITLB_4K_ENTRIES   255

#define L2_DTLB_2M_ASSOC       0 /* disabled */
#define L2_DTLB_2M_ENTRIES     0 /* disabled */
#define L2_DTLB_4K_ASSOC       4
#define L2_DTLB_4K_ENTRIES   512

#define L2_ITLB_2M_ASSOC       0 /* disabled */
#define L2_ITLB_2M_ENTRIES     0 /* disabled */
#define L2_ITLB_4K_ASSOC       4
#define L2_ITLB_4K_ENTRIES   512

target-i386/translate.c中,我们看到以下处理INVLPG指令的代码:

代码语言:javascript
复制
    case 7:
        if (mod != 3) { /* invlpg */
            if (s->cpl != 0) { 
                gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base);
            } else {
                gen_update_cc_op(s);
                gen_jmp_im(pc_start - s->cs_base);
                gen_lea_modrm(env, s, modrm);
                gen_helper_invlpg(cpu_env, cpu_A0);
                gen_jmp_im(s->pc - s->cs_base);
                gen_eob(s);
            }
        }

gen_helper_invlpg是用target-i386/misc_helper.c实现的

代码语言:javascript
复制
void helper_invlpg(CPUX86State *env, target_ulong addr)
{
    X86CPU *cpu = x86_env_get_cpu(env);

    cpu_svm_check_intercept_param(env, SVM_EXIT_INVLPG, 0); 
    tlb_flush_page(CPU(cpu), addr);
}

它调用tlb_flush_page,这是在cputlb.c中实现的。

因此,您可以看到INVLPG指令将刷新TLB以获得一个地址。

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

https://stackoverflow.com/questions/29070691

复制
相关文章

相似问题

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