模拟器qemu技术内幕

我在qemu上安装过TinyCore Linux,ttylinux,都是非常小的嵌入式系统。用软件模拟设备行为什么时候都是革命思想,在今天像七十年前一样。
-
开发qemu的Fabrice Bellard 说:“qemu是快速的动态便捷的翻译器“;官方网站说qemu是开源的通用的机器仿真器(emulator)和虚拟器(Virtualizer)“,有 的地方说qemu是系统仿真器,CPU仿真器等等,看得出来,qemu的能力在不断加强,应用的范围在扩大,所以在技术上的价值和经济以及市场价值也越来 越重要,例如现在从今年开始,我国决策要发展物联网(IoT,The Internet of Thing),物联网就是一个传感器-执行器网络 (Sensor-Actuator network),传感器和执行器上的处理器、RFID无线电射频标记的阅读器以及其他的网络设备如路由器,是组成这 个网络的节点,,这些设备的计算资源大大受到限制,有的内存只有<3MB大小,甚至小于1MB。qemu可以仿真这些设备,不要买设备开发板就能在 个人电脑上测试开发。Fabrice特别强调qemu可以把目标设备的运行状态记录保存下来,用于进一步调试。当然,虚拟机的隔离功能可以把目标设备跟 host工作站上的软硬件隔离开来,即使有错误也不会影响工作站运行。
-

qemu有两种模式,一是作为机器仿真器,可以说是系统模式,在系统模式上可以在自己的理例如Linux机器上安装运行客户操作系统(Guest OS)例如Windows,或者相反;一是作为虚拟机,可以说是用户模式,可以安装运行为另外操作系统开发的程序和进程。
qemu有以下六个模块分别完成六种模拟任务:
  1. CPU模拟
  2. 电脑设备模拟(VGA、串口、端口、鼠标等等)
  3. 普通电子设备模拟(块设备、字符设备、网络设备等)
  4. 机器描述(模拟一台具体的计算机和目标设备)
  5. 模拟调试器
  6. 用户图形界面如手机UI

qemu 的原理是把目标(Target)设备的 机器指令翻译成当前工作机器(Host)的GCC代码。例如,在~/qemu/target-arm、target-mips、target-cris、 i386、m68k、microblaze、mips、ppc、sh4、sparce、s390x目录里有类似的文件:cpu.h、helper.h等, 这些数据结构就是用来描述目标机器的,即目标机器设备上的各类寄存器、指令、中断以及操作状态,现在把目标机器设备上的寄存器和机器指令写(翻译)成工作 站机器上的C代码,就是把“微操作“(Micro Operation)翻译成普通C程序,例如一个寄存器被写成C程序上的一个变量:
#define EXCP_UDEF            1   
#define EXCP_SWI             2   
#define ... ...
#define EXCP_EXCEPTION_EXIT  8   
#define EXCP_KERNEL_TRAP     9   
-
*/又如:*/

   struct {
       uint32_t c0_cpuid; 
       uint32_t c0_cachetype;
       uint32_t c0_ccsid[16];
       uint32_t c0_clid;
       uint32_t c0_cssel;
       uint32_t c0_c1[8];
       uint32_t c0_c2[8];
       uint32_t c1_sys;
            ... ...
    } cp15;
-
Fabrice举了一个例子把poworPC指令翻译成x86指令:
addi r1,r1,-16   # r1 = r1 - 16,在ppc机器寄存器r1上加-16然后寄存在r1上;
这个指令在host工作站机器上被翻译成微操作:
movl_T0_r1            # T0 = r1,T0是host上的寄存器;
addl_T0_im -16      # T0 = T0 - 16
movl_r1_T0            # r1 = T0
而微操作movl_T0_r1被C代码实现:
void op_movl_T0_r1(void)
{
  T0 = env->regs[1];
}

你可能感兴趣的:(模拟器qemu技术内幕)