简介
QEMU
是一个著名的虚拟化仿真开源项目,Android Studio
中的仿真器就是基于QEMU
。
QEMU
有两个作用:仿真(Emulation
),虚拟化(Virtualization
);对于嵌入式领域来说,更重要的是他的仿真功能QEMU
是一个能在任何平台上运行的汇编指令级别的仿真软件,目前能支持x86
、ARM
、MIPS
、RISC-V
等多种架构的CPU
及单板的仿真QEMU
不能提供精准的硬件仿真时序仿真,却能提供快速的汇编指令的仿真。这句话可能比较抽象,换个说法可能比较好理解一点:如果你是程序员,QEMU
能提供一个你的软件可运行的单板,软件会以为自己运行在一块真实的单板上;如果你是芯片工程师,QEMU
可能就不够用了,因为QEMU
不能仿真各种PIN
引脚的脉冲波形- 借助
QEMU
,软件开发人员可以快速得到一个虚拟的单板,完成gdb
、DT(Developer Test)
等开发活动。最最重要的是:QEMU
上运行的OS
、APP
均与单板二进制完全一致,无需为QEMU
单独构建镜像
QEMU能做什么?
QEMU
能让你的程序认为,它运行在一块真实的单板上,因为QEMU
仿真的是单板;- 真实单板难以获取,
QEMU
就是为了解决这件事而生的; QEMU
能让你在一台x86
的电脑上,运行ARM
、RISC-V
架构的程序,因为QEMU
仿真了ARM
、RISC-V
单板;QEMU
能做单板上所有数字器件的仿真,但是对模拟器件的仿真无能为力。
如何仿真单板?
我们的嵌入式程序想在单板上运行,需要有两个前提条件:
1、单板上的 CPU 认识这个程序的汇编指令
2、程序中所访问的设备,比如:串口,在这个单板上必须真实地存在,且和程序所期待的串口完全相符
那么,QEMU
就只需要做两件事,程序就以为自己运行在真实的单板上了:
1、仿真目标程序的汇编指令集(ISA:Instructio Set Architecture)
2、仿真这个串口,以及目标程序用到的设备
仿真的运行速度会不会比真实单板慢?
会的,首先先明晰两个概念:
host:宿主机,指你的 QEMU 所运行的环境
guest:客户机,要在你的 QEMU 里运行的系统
1、如果 host
和 guest
不是同构处理器(比如: host
是 x86
,guest
是 ARM
),QEMU
被迫翻译每一条汇编指令,这种翻译方法被称为 TCG
,TCG
让代码的执行效率只有 host
的30%左右(注意不是单板的30%)
但是,在大部分时候,嵌入式的处理器本身就比 x86
弱,因此,在绝大多数场景下,TCG
带来的执行效率降低远比不上“可以随时得到的单板”这个收益
2、如果 host
和 guest
是同构处理器(比如:host
是 x86
,guest
也是 x86
),我们可以开启 KVM
加速,这时你会发现,guest
上运行的程序的速度,几乎和你真实单板一模一样,甚至有机会更快
评论 (0)