我有一个很简单的问题,QEMU是否模仿TLB?当来宾linux系统执行"invlpg“指令时会发生什么,就像TLB条目无效一样。我知道QEMU有一个软链接,它用于将来宾虚拟地址转换为主机虚拟地址,但是QEMU模拟了一个实际的TLB,以及"invlpg“指令的效果是什么。还是QEMU简单地忽略了这个指令?
发布于 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状态无关。
发布于 2015-03-16 06:25:32
QEMU是否模仿TLB?
是的,
QEMU监视器控制台提供了一个info tlb命令,它将
列出TLB (TranslingLook偏缓冲区),即物理内存和虚拟内存之间的映射
CPU仿真文档有一个部分说
页面缓存在QEMU源中称为"TLB“。
在源代码(即target-i386/cpu.c )中,我们看到与TLB相关的以下定义:
/* 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指令的代码:
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实现的
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以获得一个地址。
https://stackoverflow.com/questions/29070691
复制相似问题