QEMU作为一款emulator进行模拟的主要方式是binary translation,将目标代码转换成TCG IR再转换成宿主机的代码执行,于是在中间TCG生成时就可以通过插入一些代码来完成插桩的任务。而要完成这一任务首先我们得知道如何在TCG中插入一个helper. vcpu线程创建后,线程实体在这几个函数中选择一个 qemu_dummy_cpu_thread_fn qemu...
btarget); //写入QEMU特有的insn_start指令 num_insns++; if (unlikely(cpu_breakpoint_test(cs, ctx.pc, BP_ANY))) { //是否遇到了分支, 如果是则停止翻译 save_cpu_state(&ctx, 1); ctx.bstate = BS_BRANCH; gen_helper_raise_exception_debug(cpu_env); //生成异常处理函数 ctx.pc += 4; ...
在qemu -> code cache 中它模拟的是函数调用过程,caller 对 caller clobbered寄存器进行保存,在prologue中 将callee saved 的寄存器都进行了入栈保存,其他不能使用的寄存器在 s->reserved_regs中进行标记,所以理论上在code cache 中可以使用除 s->reserved_regs 之外的所有寄存器。 定义了两个寄存器列表:tcg_target...
QEMU1.3.0源码分析之二:TCG 简介:TCG是Tiny Code Generator的简称,它之前是一个后端编译器,现在是作为一个动态翻译器来使用。在QEMU中,它主要用来将虚拟出来的系统的指令转化成真正硬件支持的指令中的从中间代码到硬件支持的机器代码的过程。 TCG是Tiny Code Generator的简称,它之前是一个后端编译器,现在是作为一个...
反汇编的过程的源码的主要地址:qemu source code/target-XXX。此处的XXX指的是模拟出来的系统的架构。 TCG的源码的位置是:qemu source code/tcg。这个目录下有很多文件夹,每个文件夹都代表一个目标架构。这里的目标架构指的是真正的硬件架构,也就是说运行QEMU的架构。
(1)与dyngen一样,TCG的“function”与qemu的TBs(Translated Block)相对应,即以分支跳转指令结束的代码段。 (2)TCG中有三种变量:temporary, local temporary, global。这三种变量有着不同的生命周期,temporary变量的声明周期是TBs,local temporary变量的声明周期是functions,global变量的声明周期是所有的functions,类似C语...
2021年的是"基于Qemu/kvm硬件加速下一代安全对抗平台" 2022年的是"基于硬件虚拟化技术的新一代二进制分析利器" 跨平台模拟执行unicorn框架和qiling框架都是基于qemu的tcg,本文的内容就是描述一下qemu tcg与unicorn的原理。 TCG的英文含义是Tiny Code Generator, Qemu可以在...
在QEMU中维护着一个称为 CPUState 的数据结构,用来保存Target机的状态,包括了Target机CPU的所有寄存器,像EAX,EBP,ESP,CS,EIP,EFLAGS等,像上面说的jmp f000:e05b指令,它分解为如下微操作: gen_op_movl_T0_im(selector); gen_op_movl_T1_imu(offset);...
QEMU 技术分析 2 - TCG (Tiny Code Generator)基本原理 从QEMU-,TCG成为QEMU新的翻译引擎,做到了“真正”的动态翻译(从某种意义上说, 旧版本是从编译后的目标文件中复制二进制指令)int3 2_t val) { tcg_gen_movi_tl(cpu_T[0], val); // 相当于 cpu_T[0] = val ...
/* QEMU specific operations. */ case INDEX_op_exit_tb: tci_args_l(insn, tb_ptr, &ptr); return (uintptr_t)ptr; case INDEX_op_goto_tb: tci_args_l(insn, tb_ptr, &ptr); tb_ptr = *(void **)ptr; break; case INDEX_op_goto_ptr: tci_args_r(insn, &r0); ptr = (void *...