qemu 订阅
QEMU是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。Bochs,PearPC等与其类似,但不具备其许多特性,比如高速度及跨平台的特性,通过KQEMU这个闭源的加速器,QEMU能模拟至接近真实电脑的速度。目前,0.9.1及之前版本的qemu可以使用kqemu加速器。在qemu1.0之后的版本,都无法使用kqemu,主要利用qemu-kvm加速模块,并且加速效果以及稳定性明显好于kqemu。 展开全文
QEMU是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。Bochs,PearPC等与其类似,但不具备其许多特性,比如高速度及跨平台的特性,通过KQEMU这个闭源的加速器,QEMU能模拟至接近真实电脑的速度。目前,0.9.1及之前版本的qemu可以使用kqemu加速器。在qemu1.0之后的版本,都无法使用kqemu,主要利用qemu-kvm加速模块,并且加速效果以及稳定性明显好于kqemu。
信息
研发者
Fabrice Bellard
外文名
QEMU
用    途
模拟操作系统
中文名
虚拟操作系统模拟器
QEMU运作模式
QEMU有两种主要运作模式:* User mode模拟模式,亦即是用户模式。QEMU能启动那些为不 同中央处理器编译的Linux程序。而Wine及Dosemu是其主要目标。* System mode模拟模式,亦即是系统模式。QEMU能模拟整个电脑系统,包括中央处理器及其他周边设备。它使得为跨平台编写的程序进行测试及除错工作变得容易。其亦能用来在一部主机上虚拟数部不同虚拟电脑。QEMU的主体部份是在LGPL下发布的,而其系统模式模拟则是在GPL下发布;而kqemu这个加速器则是在免费但闭源的条件下发布的。使用kqemu可使QEMU能模拟至接近实机速度,但其在虚拟的操作系统是 Microsoft Windows 98或以下的情况下是无用的。
收起全文
精华内容
参与话题
问答
  • QEMU简介

    万次阅读 2019-03-26 12:19:04
    QEMU是一个与BOCHS和PearPC类似的模拟器,或者说是仿真器,完全的软件模拟,他能模拟很多类型的CPU。 QEMU是一个主机上的VMM(virtual machine monitor),通过动态二进制转换来模拟CPU,并提供一系列的硬件模型,使...

    QEMU是一个与BOCHS和PearPC类似的模拟器,或者说是仿真器,完全的软件模拟,他能模拟很多类型的CPU。

    QEMU是一个主机上的VMM(virtual machine monitor),通过动态二进制转换来模拟CPU,并提供一系列的硬件模型,使guest os认为自己和硬件直接打交道,其实是同QEMU模拟出来的硬件打交道,QEMU再将这些指令翻译给真正硬件进行操作。通过这种模式,guest os可以和主机上的硬盘,网卡,CPU,CD-ROM,音频设备和USB设备进行交互。但由于所有指令都需要经过QEMU来翻译,因而性能会比较差:

     正是由于QEMU的性能问题,才初夏了KQEMU这个加速模块(闭源收费),不过后来QEMU取消了KQEMU的支持,转而使用KVM模块来进行加速。

    因为 KVM 是硬件辅助的虚拟化技术,主要负责 比较繁琐的 CPU 和内存虚拟化,而 Qemu 则负责 I/O 虚拟化,两者合作各自发挥自身的优势,相得益彰。

    从本质上看,虚拟出的每个虚拟机对应 host 上的一个 Qemu 进程,而虚拟机的执行线程(如 CPU 线程、I/O 线程等)对应 Qemu 进程的一个线程。下面通过一个虚拟机启动过程看看 Qemu 是如何与 KVM 交互的。

    // 第一步,获取到 KVM 句柄
    kvmfd = open("/dev/kvm", O_RDWR);
    // 第二步,创建虚拟机,获取到虚拟机句柄。
    vmfd = ioctl(kvmfd, KVM_CREATE_VM, 0);
    // 第三步,为虚拟机映射内存,还有其他的 PCI,信号处理的初始化。
    ioctl(kvmfd, KVM_SET_USER_MEMORY_REGION, &mem);
    // 第四步,将虚拟机镜像映射到内存,相当于物理机的 boot 过程,把镜像映射到内存。
    // 第五步,创建 vCPU,并为 vCPU 分配内存空间。
    ioctl(kvmfd, KVM_CREATE_VCPU, vcpuid);
    vcpu->kvm_run_mmap_size = ioctl(kvm->dev_fd, KVM_GET_VCPU_MMAP_SIZE, 0);
    // 第五步,创建 vCPU 个数的线程并运行虚拟机。
    ioctl(kvm->vcpus->vcpu_fd, KVM_RUN, 0);
    // 第六步,线程进入循环,并捕获虚拟机退出原因,做相应的处理。
    for (;;) {
      ioctl(KVM_RUN)
      switch (exit_reason) {
          case KVM_EXIT_IO:  /* ... */
          case KVM_EXIT_HLT: /* ... */
      }
    }
    // 这里的退出并不一定是虚拟机关机,
    // 虚拟机如果遇到 I/O 操作,访问硬件设备,缺页中断等都会退出执行,
    // 退出执行可以理解为将 CPU 执行上下文返回到 Qemu。

     

    Qemu 源码结构

    Qemu 软件虚拟化实现的思路是采用二进制指令翻译技术,主要是提取 guest 代码,然后将其翻译成 TCG 中间代码,最后再将中间代码翻译成 host 指定架构的代码,如 x86 体系就翻译成其支持的代码形式,ARM 架构同理。

    所以,从宏观上看,源码结构主要包含以下几个部分:

    • /vl.c:最主要的模拟循环,虚拟机环境初始化,和 CPU 的执行。
    • /target-arch/translate.c:将 guest 代码翻译成不同架构的 TCG 操作码。
    • /tcg/tcg.c:主要的 TCG 代码。
    • /tcg/arch/tcg-target.c:将 TCG 代码转化生成主机代码。
    • /cpu-exec.c:主要寻找下一个二进制翻译代码块,如果没有找到就请求得到下一个代码块,并且操作生成的代码块。

    其中,涉及的主要几个函数如下:

    函数 路径 注释
    main_loop {/vl.c} 很多条件的判断,如电源是否断等
    qemu_main_loop_start {/cpus.c} 分时运行 CPU 核
    struct CPUState {/target-xyz/cpu.h} CPU 状态结构体
    cpu_exec {/cpu-exec.c} 主要的执行循环
    struct TranslationBlock {/exec-all.h} TB(二进制翻译代码块) 结构体
    cpu_gen_code {translate-all.c} 初始化真正代码生成
    tcg_gen_code {/tcg/tcg.c} tcg 代码翻译成 host 代码

    知道了这个总体的代码结构,再去具体了解每一个模块可能会相对容易一点。

    Qemu 的使用

    1. 源码下载

    centos:
    sudo apt-get install qemu
    ubuntu:
    sudo yum install qemu -y
    安装包:
    $wget http://wiki.qemu-project.org/download/qemu-2.0.0.tar.bz2
    $tar xjvf qemu-2.0.0.tar.bz2
    Git:
    $git clone git://git.qemu-project.org/qemu.git

    2. 编译及安装

    $cd qemu-2.0.0 //如果使用的是git下载的源码,执行cd qemu
    $./configure --enable-kvm --enable-debug --enable-vnc --enable-werror  --target-list="x86_64-softmmu"
    $make -j8
    $sudo make install

    configure 脚本用于生成 Makefile,其选项可以用 ./configure --help 查看。

    这里使用到的选项含义如下:

    • --enable-kvm:编译 KVM 模块,使 Qemu 可以利用 KVM 来访问硬件提供的虚拟化服务。
    • --enable-vnc:启用 VNC。
    • --enalbe-werror:编译时,将所有的警告当作错误处理。
    • --target-list:选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可。

    安装好之后,会生成如下应用程序:

    • ivshmem-client/server:这是一个 guest 和 host 共享内存的应用程序,遵循 C/S 的架构。
    • qemu-ga:这是一个不利用网络实现 guest 和 host 之间交互的应用程序(使用 virtio-serial),运行在 guest 中。
    • qemu-io:这是一个执行 Qemu I/O 操作的命令行工具。
    • qemu-system-x86_64:Qemu 的核心应用程序,虚拟机就由它创建的。
    • qemu-img:创建虚拟机镜像文件的工具,下面有例子说明。
    • qemu-nbd:磁盘挂载工具。

    下面通过创建虚拟机操作来对这些工具有个初步的认识。

    3. 创建虚拟机

    • 使用qemu-img创建虚拟机镜像

    虚拟机镜像用来模拟虚拟机的硬盘,在启动虚拟机之前需要创建镜像文件。

    qemu-img create -f qcow2 test-vm-1.qcow2 10G

    -f 选项用于指定镜像的格式,qcow2 格式是 Qemu 最常用的镜像格式,采用来写时复制技术来优化性能。test-vm-1.qcow2 是镜像文件的名字,10G是镜像文件大小。镜像文件创建完成后,可使用 qemu-system-x86 来启动x86 架构的虚拟机.

    • 使用 qemu-system-x86 来启动 x86 架构的虚拟机
    qemu-system-x86_64 test-vm-1.qcow2

    因为 test-vm-1.qcow2 中并未给虚拟机安装操作系统,所以会提示 “No bootable device”,无可启动设备。

    • 启动 VM 安装操作系统镜像
    qemu-system-x86_64 -m 2048 -enable-kvm test-vm-1.qcow2 -cdrom ./Centos-Desktop-x86_64-20-1.iso

    -m 指定虚拟机内存大小,默认单位是 MB, -enable-kvm 使用 KVM 进行加速,-cdrom 添加 fedora 的安装镜像。可在弹出的窗口中操作虚拟机,安装操作系统,安装完成后重起虚拟机便会从硬盘 ( test-vm-1.qcow2 ) 启动。之后再启动虚拟机只需要执行:

    qemu-system-x86_64 -m 2048 -enable-kvm test-vm-1.qcow2

    qemu-img 支持非常多种的文件格式,可以通过 qemu-img -h 查看.
    其中 raw 和 qcow2 是比较常用的两种,raw 是 qemu-img 命令默认的,qcow2 是 qemu 目前推荐的镜像格式,是功能最多的格式。这些知识后面会有文章来专门讲述。

    展开全文
  • 从零使用qemu模拟器搭建arm运行环境

    万次阅读 多人点赞 2015-07-04 15:26:17
    本文从零开始介绍如何搭建qemu+arm的运行环境

    提醒:本文已有自动构建的项目支持,请移步到:再续【从零使用qemu模拟器搭建arm运行环境】

    为什么会有这篇文章

    早在2011年的时候,跟当时同事一起讨论,做Linux系统开发正处于整个Linux开发中间层,没有上层的C/C++业务和数据库的开发经验,也没有底层的内核和驱动开发经验,到底路该如何走……基于对Linux系统开发的理解和内核的兴趣,认为选择Linux内核开发更适合自己。于是到淘宝上买了块三星s3c2440(arm 9)开发板,学起内核开发。没有过多久,机缘巧合,正式加入了公司的内核开发部。就这样跟内核和arm打上交道了。

     

    没有想到这一做就是3年了,arm芯片只有在公司才能使用,回到家里就不能访问了。去年(2014)开始觉得做内核久了,应该向内核社区提交patch,提升知名度和影响力。但在公司提交patch不方便,于是在家里通过qemu方式搭建于ARM A9的运行环境,进行开发和测试验证,一口气提交了好几个patch(link1, link2, link3, link4, link5)并被社区接纳了。

     

    最近在梳理Linux内存机制,无论是《深入理解Linux内核》还是《深入理解内核架构》这两本红宝书都无法告知你每个细节的时候,就需要查看代码细节,修改代码,甚致做行为分析。此时需要修改代码输出调试信息,以帮助更深入体会代码的逻辑。这该是qemu派上场的时候。

     

    其实我前前后后搭建qemu+arm的运行环境已超过5次了,每次都要花上很多时间。碰巧昨天有同事看到我再次搭建,他如搭珍宝,告诉我一定要将搭建qemu的方法告诉他。

     

    所以,如果你想买个开发板来做arm + linux嵌入式开发,完全可以使用qemu进行开发。或者你像我一样,对内核机制关心,而不关心于具体的外设器件,最多是关心arm架构相关的功能,也可以使用qemu进行开发。

     

    一句话:搭建qemu+arm环境,用于做内核开发和功能分析调试。

    搭建环境

    我整个搭建过程都是在笔记本上进行的,Ubuntu 12.04系统;如果是Fodera环境,搭建过程可能略有不同,但关键步骤是不变的。

     

    qemu模拟得最好的arm芯片,要数ARM公司的vexpress A9开发板了,本文的搭建过程都是围绕这个开发板进行的。当然,如果你想搭其它开发板,也不难,只要qemu和内核对它有成熟的支持就够了。

     

    下面是step by step的搭建过程,建议没有特别诉求的朋友,按照下在面的步骤操作。或者先根据下面的步骤成功搭建vexpress运行环境之后,再根据自己的需求进行更改。

     

    下载Linux内核

    下载内核有两种方法,一种是用git直接下载内核代码树,方便后面的内核开发。另一种是直接到内核社区下载稳定版本(详见:https://www.kernel.org/pub/linux/kernel/v4.x/)。下面演示从Linux kernel主线下载代码进行编译。

     

    git clonegit://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

     

    整个下载过程会持续半个小时左右,有足够时间来泡杯茶。

     

    安装arm的交叉编译工具链

     

    想必做嵌入式开发的朋友,对交叉编译工具链不陌生。如果你订制一个交叉编译工具链,建议你使用crosstool-ng开源软件来构建。但在这里建议直接安装arm的交叉编译工具链:

    sudo apt-get install gcc-arm-linux-gnueabi

     

    编译Linux内核

    生成vexpress开发板子的config文件:
     

    make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig

     

    编译:

    make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

     

    生成的内核镱像位于arch/arm/boot/zImage, 后续qemu启动时需要使用该镜像。

     

    下载和安装qemu模拟器

    其实Ubuntu 12.04有qemu的安装包,但由于版本较低,对vexpress开发板支持不友好,建议下载高版本的qemu:

    wget http://wiki.qemu-project.org/download/qemu-2.0.2.tar.bz2

     

    配置qemu前,需要安装几个软件包:

    sudo apt-get install zlib1g-dev

    sudo apt-get install libglib2.0-0

    sudo apt-get install libglib2.0-dev

     

     

    配置qemu,支持模拟arm架构下的所有单板:

    ./configure --target-list=arm-softmmu --audio-drv-list=

     

    编译和安装:

    make

    make install

     

    测试qemu和内核能否运行成功

     

    qemu已经安装好了,内核也编译成功了,到这里最好是测试一下,编译出来的内核是否OK,或者qemu对vexpress单板支持是否够友好。

    运行命令很简单:

    qemu-system-arm -M vexpress-a9 -m 512M -kernel /path/to/kernel/dir/arch/arm/boot/zImage -dtb  /path/to/kernel/dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"

     

    这里的 /path/to/kernel/dir/  是内核的下载目录,或者编译目录。

    如果看到内核启动过程中的打印,说明前面的搭建是成功的。

     

    这里简单介绍下qemu命令的参数:

    -M vexpress-a9 模拟vexpress-a9单板,你可以使用-M ?参数来获取该qemu版本支持的所有单板

    -m 512M 单板运行物理内存512M

    -kernel /path/to/kernel/dir/arch/arm/boot/zImage  告诉qemu单板运行内核镜像路径

    -nographic 不使用图形化界面,只使用串口

    -append "console=ttyAMA0" 内核启动参数,这里告诉内核vexpress单板运行,串口设备是那个tty。

     

    注意:

    我每次搭建,都忘了内核启动参数中的console=参数应该填上哪个tty,因为不同单板串口驱动类型不尽相同,创建的tty设备名当然也是不相同的。那vexpress单板的tty设备名是哪个呢? 其实这个值可以从生成的.config文件CONFIG_CONSOLE宏找到。

    如果搭建其它单板,需要注意内核启动参数的console=参数值,同样地,可从生成的.config文件中找到。

     

    制作根文件系统

    到这里是否大功告成了呢? 其实在上面的测试中,你会发现内核报panic,因为内核找不到根文件系统,无法启init进程。

     

    根文件系统要考虑两个方面:

    1. 根文件系统的内容

        如果你看过《Linux From Scratch》,相信你会对这一步产生恐惧感,但如果一直从事嵌入式开发,就可以放下心来。根文件系统就是简单得不能再简单的几个命令集和态动态而已。为什么Linux From Scratch会有那么复杂,是因为它要制作出一个Linux发生版。但在嵌入式领域,几乎所有的东西,都是mini版本,根文件系统也不例外。

       本文制本的根文件系统 = busybox(包含基础的Linux命令)  + 运行库 + 几个字符设备

    2. 根文件系统放在哪里

        其实依赖于每个开发板支持的存储设备,可以放到Nor Flash上,也可以放到SD卡,甚至外部磁盘上。最关键的一点是你要清楚知道开发板有什么存储设备。

        本文直接使用SD卡做为存储空间,文件格式为ext3格式

     

    下载、编译和安装busybox


     wget http://www.busybox.net/downloads/busybox-1.20.2.tar.bz2

     

    make defconfig

    make CROSS_COMPILE=arm-linux-gnueabi-

    make install CROSS_COMPILE=arm-linux-gnueabi-

     

    安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。

     

    形成根目录结构

    先在Ubuntu主机环境下,形成目录结构,里面存放的文件和目录与单板上运行所需要的目录结构完全一样,然后再打包成镜像(在开发板看来就是SD卡),这个临时的目录结构称为根目录
     
    1.  创建rootfs目录(根目录),根文件系统内的文件全部放到这里
     

    mkdir -p rootfs/{dev,etc/init.d,lib}

     

    2. 拷贝busybox命令到根目录下

     

    sudo cp busybox-1.20.2/_install/* -r rootfs/

     

    3. 从工具链中拷贝运行库到lib目录下

     

    sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/

     

    4. 创建4个tty端终设备

    sudo mknod rootfs/dev/tty1 c 4 1

    sudo mknod rootfs/dev/tty2 c 4 2

    sudo mknod rootfs/dev/tty3 c 4 3

    sudo mknod rootfs/dev/tty4 c 4 4

    制作根文件系统镜像

    1. 生成32M大小的镜像
     

     dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32

     

    2. 格式化成ext3文件系统

     

    mkfs.ext3 a9rootfs.ext3

     

    3.  将文件拷贝到镜像中

     

    sudo mkdir tmpfs

    sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop

    sudo cp -r rootfs/*  tmpfs/

    sudo umount tmpfs

    系统启动运行

    完成上述所有步骤之后,就可以启动qemu来模拟vexpress开发板了,命令参数如下:

    qemu-system-arm -M vexpress-a9 -m 512M -kernel /path/to/kernel/dir/arch/arm/boot/zImage -dtb  /path/to/kernel/dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" -sd a9rootfs.ext3

     

    从内核启动打印,到命令行提示符出现,激动人心的时刻出现了……

     

    写在后面的话

    通过上面的步骤,搭建出来一个最小的qemu+arm开发环境,你可以上面的基础上修改内核,或者增加一些测试程序在单板上运行,甚至使用单板的flash设备。
    在此,你可以做纯arm架构的内核开发,或者与架构无关的内核开发,也可以做单板相关的驱动开发。

    最后的最后:本文已经过多次修改,如果各位读者按照本文方法搭建遇到问题,还请各位反馈给我(lyt2008bj at 163 dot com),我会修改直至完全成功。
    展开全文
  • QEMU使用简介

    万次阅读 2017-02-22 19:58:53
    QEMU使用简介。

    下载

    在Ubuntu下直接通过apt命令来下载:

    apt-get install qemu
    apt install qemu

    不同的Ubuntu版本可能使用apt-get或者apt中的一个,本文使用的环境如下:

    本文主要介绍在该Ubuntu版本下的QEMU使用。

     

    使用

    安装QEMU之后,可以找到有如下的命令可用:

    可以看到它可以模拟很多种不同的架构。

    还有像qemu-img其实是一个工具,可以用来生成虚拟盘。

    为了使用QEMU来安装和使用额外的系统(这里还是一个Ubuntu16.04系统),首先需要的是创建一个虚拟硬盘,下面是具体的命令:

    参数说明:

    1. create:表示执行的动作是创建虚拟盘;

    2. -f qcow2:指定虚拟盘的格式;

    3. OS.img是虚拟盘的名称,大小是20G。

    之后开始安装系统,命令如下:

    qemu-system-x86_64 -boot d -cdrom ubuntu-16.04-desktop-amd64.iso -hda OS.img -m 2048 -bios OVMF.fd

    参数说明:

    1. qemu-system-x86_64命令是结合自己的电脑构架使用的,因为这边使用的是Intel x64平台;

    2. -boot d:表示从CDROM启动系统,因为虚拟盘中目前还没有系统,需要从CDROM中启动安装盘;

    3. -cdrom:指定了安装的系统镜像;

    4. -hda:指定之前创建的虚拟盘;

    5. -m:指定了QEMU使用的系统内存大小,这里指定的是2G;

    6. -bios:指定了QEMU运行的BIOS,默认使用的是seabios,这里使用了自己编译的OVMF.fd,至于如何生成OVMF.fd,可以参考其它的文章。

    之后就是普通的安装过程:

    不过这里会遇到一个问题,QEMU运行的速度及其慢,为了解决这个问题,可以使用KVM,它是内核层面对虚拟话的支持。

    这里首先需要下载qemu-kvm,命令如下:

    apt install qemu-kvm

    下载之后,使用kvm命令来启动QEMU,命令的参数还是一样,只是将qemu-system-x86_64换成了kvm:

    kvm -boot d -cdrom ubuntu-16.04-desktop-amd64.iso -hda OS.img -m 2048 -bios OVMF.fd

    使用KVM可以明显发现QEMU速度快了很多。

    安装结束之后使用如下的命令启动:

    kvm -bios OVMF.fd -hda OS.img -m 2048 -smp 4

    基本参数还是没有变,这里增加了一个-smp参数,是用来指定QEMU使用的核数的,这里指定的是4核,可以在系统启动之后通过cat /proc/cpuinfo来查看:

    实际上使用QEMU主要是为了调试OVMF.fd及它与OS的交互,因此这里再说下OVMF。

    前面在使用QEMU的时候都加上了-bios参数,指定了自己编译的OVMF.fd,此时启动的QEMU就可以进入到BIOS下:

    这里的FS0就存在与OS.img中,它用来存放启动系统的GRUB文件:

    也可以直接在这里执行grubx64.efi(其它几个efi也可以)来启动Ubuntu系统。

     

    一些常用的参数说明

    这里主要讲一些启动系统时可以使用的参数:

    1. -m x:用来指定虚拟系统的内存大小,x是一个数字,单位是MB;

    2. -bios x:用来指定使用的BIOS,默认使用的是seabios,也支持OVMF;

    3. -serial stdio:用来指定串口的输出,这里就是输出的标准输出;

     

    展开全文
  • 本文由博主原创,转载请注明出处(保留此处和链接... 学习qemu已经有半个月了,有了一点小想法,在这里做个小记录。 首先要说的是一个很经典的流程图,也许有很多人提到了这个,这里再次重复一下: 这里分两部分:

     

     

          学习qemu已经有半个月了,有了一点小想法,在这里做个小记录。

     

          首先要说的是一个很经典的流程图,也许有很多人提到了这个,这里再次重复一下:

     

    这里分两部分:

            前端————>把guest code(这里也称作target code) 转换成TCG IR(这里也称作TCG-ops,这是一种独立于具体机器的中间代码);

            后端————>利用TCG把TCG IR转换成host上能够运行的主机代码。

     

     

            接着要说的就是QEMU中主要的代码了,先来一个截图吧(来自Qemu Detailed Study: 7 Chapter http://download.csdn.net/detail/ningxialieri/5323458

     

    vl.c ————>qemu的main函数就存在于此文件中,虚拟机是在这里建立,cpu的执行也是从此处开始的。也可以是说,这里包含了虚拟机的初始化过程。特别要说的一点是,main_loop()也存在于此文件中,虚拟机的转换是在这个循环中进行调用的。

     

    target-xyz/translate.c————>此文件主要是用于提取guest的代码片段,进而转换成为与架构无关的 TCG  IR。需要提出的一点是,转换过程中的单位元是一个TB,也就是说,一个TB转换执行结束后,才能轮到下一个TB。

     

    tcg/tcg.c————>此文件包含了 TCG  的主要代码。TCG作为一个后端转换器,拥有自己的寄存器、操作指令、操作数等。

     

    tcg/xyz/tcg-target.c————>此文件用来把TCG IR转换成为host 的code,它会调用tcg.c里面的函数。

     

     cpu-exec.c————>在文件cpu-exec.c 里面的函数cpu-exec()会调用函数tb_find_fast()在code buffer中查找下一个TB(注意,这里的TB指的是已经翻译成host相关的TB,要与guest所对应的TB加以区分),如果找到了,就会调用tcg_qemu_tb_exec()来在host上执行。如果没有找到,就会调用tb_find_slow()来生成host对应的TB,这里的生成,就是指,由gues的TB经TCG转化生成能在host运行的TB,最后调用tcg_qemu_tb_exec()来在host上执行。

     

     

     

    换个思路来说吧,我们可以把qemu分为两部分,一部分是转换(就是前面提到的,由guest的TB转换为host的TB,并且把host的TB放到code buffer中,注意:buffer中的TB会根据需要进行更新),第二部分就是执行,即,最终会用函数tcg_qemu_tb_exec()来执行,在此函数中,会在code buffer中查找host的tb,然后来执行。转换和执行的两个过程是使用中断进行切换的。

     

     

    关于几个重要全局变量的定义和调用:

     

    在 ./translate-all.c:141行,有TCGContext tcg_ctx;——————>在这里定义了全局变量tcg_ctx。

    在 tcg/tcg.h:473行,有 extern TCGContext tcg_ctx;——————>在这里引入外部变量tcg_ctx。

    在tcg/tcg-op.h中大量引用了变量tcg_ctx,并且,在文件开始包含了#include "tcg.h"。综上所述,tcg_ctx可以作为一个外部变量,在所有包含头文件#include "tcg.h的所有文件中调用。

     


     

     

    这里加入一部分博主翻译内容,以便加深理解(原文来自:Qemu Detailed Study: 7 Chapter):

             QEMU的作用就是,提取客户代码,然后转换成主机代码。整个转换过程由两部分组成:首先,Target Code的代码块(TB)被转换成TCG-ops(独立于机器的中间代码),第二步,就是用HOST 架构对应的TCG,把由TB生成的TCG-ops转换成Host Code。这个的优化过程在这两个步骤的中间完成。

            当前,在QEMU中可以模拟的处理器架构有: Alpha, ARM, Cris,i386, M68K, PPC, Sparc, Mips, MicroBlaze, S390X and SH4。这些架构的处理器对应的/target -xyz/下的code,把TBs转换成TCG-ops,这里的xyz就是上面所说的架构名。因此,arm对应的code可以在/target-arm/下面找到。这部分可以被称为TCG前端。

            主机端用/tcg/下的code把TCG-ops生成主机能运行的代码,这部分被称为TCG的后端。

            在代码执行前,编译器要把源代码生成目标代码。为了将一个函数调用生成目标代码,编译器(如gcc)会产生一些特殊的代码,这些特殊代码应用在函数调用前和函数返回前。这些特殊代码被称为  Function Prologue 和 Epilogue。(本人认为,就是函数调用前的进栈和出栈处理)。

            众所周知,TCG使用的是动态转换(Dynamic Translation)技术。所谓动态转换,就是在需要的时候才转换code。目的是,把大部分时间花费在执行生成的代码上。每次由TB块生成的code在被执行之前,都会被存在code cache中。大多数的时候,相同的TBs会被多次执行,因此从cache中调用是最好的方式,而不重新生成。一旦code cache被填满了,所有的code cache将被清空。

     

     qemu中target意义的分析:

    In qemu, there are two different meanings of target. The first meaning of ‘target’ means the emulated target machine architecture. For example, when emulating mips machine on x86, the target is mips and host is x86. However, in tcg(tiny code generator), target has a different meaning. It means the generated binary architecture. In the example of emulating mips on x86, in tcg the target means x86 because tcg will generate x86 binary.

     

     

     

     

    展开全文
  • QEMU

    万次阅读 2016-03-31 17:55:42
    QEMU 1: 使用QEMU创建虚拟机 一、QEMU简介 QEMU是一款开源的模拟器及虚拟机监管器(Virtual Machine Monitor, VMM)。QEMU主要提供两种功能给用户使用。一是作为用户态模拟器,利用动态代码翻译机制来执行...
  • qemu-2.5.0.tar.bz2

    2016-03-17 15:25:34
    qemu-2.5.0.tar.bz2
  • qemu 4.0.0安装

    千次阅读 2018-09-15 14:20:13
    安装qemu cd qemu 1) ./configure --target-list=arm-softmmu,arm-linux-user #只安装arm平台 2) ./configure #安装所有的平台 make -j16 sudo make install 安装完后用qemu-system-arm --version查看版本 ...
  • QEMU 安装与使用

    千次阅读 2019-11-10 22:52:29
    文章目录QEMU 安装与使用安装qemu硬件准备安装KVM安装qemu源码安装安装工具安装QEMU使用创建虚拟机命令选项qemu的标准选项qemu显示选项网络属性相关选项kvm的网络模型手动创建bridge**i386平台专用选项**参考 ...
  • QEMU

    千次阅读 2019-04-04 09:29:41
    https://wiki.qemu.org/Links ... 3非官方的QEMU二进制文件 4替代QEMU存储库/ Forks 5GUI和管理工具/系统 6Legacy GUI前端 7QEMU使用的BIOS和固件 8使用QEMU代码的项目 9外部文件 10其他模拟...
  • QEMU介绍

    千次阅读 2018-09-11 15:38:43
    一、QEMU简介 QEMU是一款开源的模拟器及虚拟机监管器(Virtual Machine Monitor, VMM)。QEMU主要提供两种功能给用户使用。一是作为用户态模拟器,利用动态代码翻译机制来执行不同于主机架构的代码。二是作为虚拟机...
  • qemu的两种安装方式

    千次阅读 2019-06-11 01:26:21
    qemu有两种安装方式,第一种是使用命令行直接下载安装,第二种是通过源码进行编译安装,推荐命令行直接下载。 1.QEMU的apt-get安装 https://www.qemu.org/download/ 可以看出各个版本Linux的安装命令,直接在...
  • QEMU

    2017-03-08 16:06:24
    QEMU 1: 使用QEMU创建虚拟机 一、QEMU简介 QEMU是一款开源的模拟器及虚拟机监管器(Virtual Machine Monitor, VMM)。QEMU主要提供两种功能给用户使用。一是作为用户态模拟器,利用动态代码翻译机制来...
  • qemu

    2020-03-14 20:26:18
    qemu是一款硬件模拟器 qemu可模拟多种CPU硬件环境,THU-os 实验中,用于模拟一台intel x86-32的计算机系统
  • qemu

    千次阅读 2012-03-14 14:14:28
    QEMU 的簡介請見 QEMU internals。 建置 QEMU QEMU 1.0 預設會編譯成 PIE,這對舊版的 GDB 會有影響。強制開啟 IO thread。使用 Clang 編譯 QEMU 會出現以下訊息1)2)3)。 In file included from /z/tmp/...
  • qemu

    2018-10-17 13:02:24
    当Ubuntu下配置QEMU时出现: ERROR: glib-2.12 required to compile QEMU 的错误时,意思是缺少了glib2库,此处通过搜索: apt-cache search glib2 找到了是:libglib2.0-dev 所以去安装该...
  • QEMU

    千次阅读 2015-05-30 17:58:42
    QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件。它与Bochs,PearPC近似,但其具有某些后两者所不具备的特性,如高速度及跨平台的特性。经由kqemu这个开源的加速器,QEMU能模拟至接近真实电脑的速度。...
  • QEMU

    2018-08-14 19:57:05
    QEMU 1: 使用QEMU创建虚拟机   一、QEMU简介   QEMU是一款开源的模拟器及虚拟机监管器(Virtual Machine Monitor, VMM)。QEMU主要提供两种功能给用户使用。一是作为用户态模拟器,利用动态代码翻译机制来执行...
  • qemu参数解析

    千次阅读 2016-10-21 13:19:36
    代码版本:qemu1.5 static QemuOptsList *vm_config_groups[32]; qemu_add_opts(&qemu_drive_opts); qemu_add_opts(&qemu_chardev_opts); qemu_add_opts(&qemu_device_opts); qemu_add_opts(&qem
  • QEMU 1.2.0 编译好的可执行程序,可以直接运行于windows平台,可以模拟各种硬件平台,例如ARM,X86,Sparc,PPC,MIPS等等。下面是文件列表 2012-09-20 00:18 3,211 bamboo.dtb 2012-09-20 00:18 131,072 bios.bin ...
  • qemu & qemu-system

    千次阅读 2014-11-15 12:11:29
    http://wiki.qemu-project.org/Download git clone git://git.qemu-project.org/qemu.git

空空如也

1 2 3 4 5 ... 20
收藏数 46,070
精华内容 18,428
关键字:

qemu