我有一个非常简单的问题,QEMU是否模拟TLB?当客户Linux系统执行“invlpg”指令以使TLB条目无效时会发生什么?我知道QEMU有用于将客户虚拟地址转换为主机虚拟地址的softmmu link,但是QEMU是否模拟实际的TLB,以及“invlpg”指令的效果是什么?还是QEMU只是忽略此指令?
QEMU是否模拟TLB?
是的。
QEMU监视器控制台提供了一个info tlb
命令,该命令将
列出TLB(转换后备缓存),即物理内存和虚拟内存之间的映射
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。