模拟技术学习(1)

QEMU架构和内部

快速模拟(QEMU)

机器模拟器+虚拟器
模式:
用户模式模拟:允许为一个CPU构建的进程被另一个CPU执行
QEMU作为进程模拟器
系统模式模拟:允许模拟一个完整的系统,包括处理器和各种外围设备
QEMU作为系统模拟器
常用:
用于交叉编译开发环境
虚拟化,特别是设备模拟,象xen和kvm
安卓模拟器(SDK的一部分)

动态二进制翻译

动态翻译
第一种解释
以副产品的形式执行代码发现
翻译代码
象它被发现的那样递增的
将翻译后的块放入代码缓存中
把源到目标主机的映射保存到地址查询表中
模拟过程
运行完已经翻译的块
在表里寻找下一个资源主机
如果已经翻译了,跳转到目标主机
没有就直接翻译

象JIT编译器一样工作,但是不包括解释器
所有的客户代码都要经过二进制翻译
客户代码被划分成翻译块
一个翻译块和基本块相似,因为都是作为一个整体执行(整个块中没有跳转)
翻译块被翻译成一个单独的主机指令序列,被缓存到翻译缓存中。
缓存块使用客户虚拟地址(PC计数),所以他们能很容易的被发现
翻译块的缓存大小能够改变(通常是32M)
一旦缓存用完,整个缓存区清零

在这里插入图片描述
先将源指令流(二进制)转换成更短小且更加简易的操作,即微指令(C语言),被GCC编译成对象文件(二进制),最后QEMU将对象文件链接成目标的指令流(二进制)。
在这里插入图片描述

功能模拟
模拟处理器做的工作,而不是处理器怎么做
动态二进制翻译
解释器一次执行一条指令
固定的开销显著降低
反而,QEMU根据需要转换代码
翻译基本块 产生本地主机代码‘
把翻译块存储到翻译缓存中
微小代码发生器(TCG)
微操作(微指令)
固定的寄存器映射能够降低负载和存储字符串
翻译块
一个TCG基本块对应着一个被分支指令终止的指令列表
块链接
在这里插入图片描述
在这里插入图片描述
cpu_exec() 在主函数的每一步都被调用
项目会一直执行除非遇到一个未连接的块
通过 结尾返回cpu_exec()

块链接
通常来说,每一个翻译块的执行都伴随这很多特殊代码块的执行
开始时初始化处理器来执行产生的主机代码,并跳转到代码块
结束时恢复正常状态并返回到主循环
返回主循环后,每一个块显著的增加了开销,增长的还很快
当一个块返回主循环,下一个块已经知道并且已经被翻译,QEMU能够修改源代码来直接跳转到下一个块,而不是跳转到结尾
直接在基本块之间跳转
为跳转准备空间,然后回到结尾
每一次一个块返回,都要尝试链接它
当是发生在几个连续的块上时,这些块会形成链接和循环
这允许QEMU模拟紧密的循环,而不需要运行额外的代码
在循环的条件下,这也意味除非执行到一个没有翻译或者没有链接的块,这个控件不会返回到QEMU
异步中断
如果一个硬件中断被挂起,QEMU不会检查每一个基本块。反而,用户必须要调用一个特殊的功能来告诉说有个中断被挂起
这个功能重置了当前执行的块的链接,返回到控制CPU模拟的主循环

寄存器映射
如果目标寄存器的数目大于源寄存器的数目(例如:翻译x86的二进制到RISC)(RISC精简指令集)
当目标寄存器的数量不够时,可能会基于每一个块,或者每一个追踪,或者每一个循环
不常用的寄存器(源)可能没有映射
如何处理项目计数器
目标主机不同于源主机
对于间接的分支,寄存器持有源主机 一定会提供一种将源主机映射到目标主机的方法
翻译系统需要时刻追踪源主机

其它主要组件
内存地址转换
由软件控制的MMU(模型)将目标虚拟地址翻译成主机虚拟地址
两级客户物理页描述符表
客户虚拟地址和主机虚拟地址之间的映射
地址转换缓存(tlb_table)直接将目标虚拟地址翻译成主机虚拟地址
客户虚拟地址和该设备注册的I/O功能之间的映射
用于内存I/O映射的缓存(iotlb)
设备模拟
i440FX主机PCI网桥,Cirrus CLGD 5446 PCI VGA卡,PS/2鼠标和键盘,PCI IDE接口(HDD, CDROM), PCI和ISA网络适配器,串口,PCI UHCI USB控制器和虚拟USB hub,…

软件地址转换
虚拟到物理地址的转换时在每一次内存访问时完成的
地址转换缓存加速了转换
为了避免每次MMU映射改变时刷新已经翻译代码的缓存,QEMU使用的是物理索引的翻译缓存
每一个基础块都使用他的物理地址索引
当MMU映射改变时,只有基础块的链接被重置,(例如一个基础块不能直接跳转到另一个)
在这里插入图片描述

QEMU存储堆栈
在这里插入图片描述
应用和客户内核的工作类似于裸金属
客户通过仿真硬件与QEMU对话
QEMU代表客户对一个镜像文件执行I/O
主机内核对待客户I/O就像任何用户应用程序一样
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值