Qemu在ARM和X86平台上的运行机制初探
QEMU JIT/KVMQEMU 采用了动态二进制翻译(Dynamic Binary Translation)机制,以一种中间代码作为中介,将客户机架构的机器码运行时翻译(Just-In-Time,JIT)为宿主机架构的机器码形式,并将翻译结果交由宿主机的处理器直接执行。因而 QEMU 在不同的体系架构下也具有不错的性能。QEMU 的这种虚拟化加速方式称为TCG(Tiny Code Generator)。此外,QEMU 还可以使用其他虚拟机管理程序进行加速。其中最常见的是使用KVM(Kernel Virtual Machine)。KVM 是 Linux 的一个内核驱动模块,采用了硬件辅助的虚拟化技术,能够让 Linux 主机成为一个虚拟机管理程序。此时虚拟机管理程序直接位于硬件之上,因此属于第一类虚拟机管理程序。由于不需要经过操作系统,能够直接访问硬件资源,所以 KVM 的性能要优于纯 QEMU。当 QEMU 配合 KVM 使用时,会由 QEMU 负责 I/O 虚拟化,而 KVM 负责处理器和内存虚拟化。这种方法相较于直接使用 QEMU,可以极大提高性能;而相较于直接使用 KVM,又获得了强大的平台能力。因此二者相互配合,能够发挥自身的优势,相得益彰.JIT 在 QEMU 中负责在运行时将目标架构的指令动态翻译为主机架构的指令,并缓存翻译结果以供重用。流程如下:目标架构代码 (如ARM程序) ↓ 运行时翻译 QEMU JIT 编译器 (TCG: Tiny Code Generator) ↓ 生成 主机架构代码 (如x86指令) ↓ 执行 直接在CPU上运行TCG是QEMU 的 JIT 引擎核心,TCG实现有native jit和TCI两种技术,后面会分别介绍。探索环境实验平台信息:首先编译X86版本和ARM版本两个平台的QEMU1.获取代码:wget https://download.qemu.org/qemu-4.1.0.tar.bz22.安装依赖:sudo apt-get install build-essential pkg-config zlib1g-dev libglib2.0-0 libglib2.0-dev libsdl1.2-dev libpixman-1-dev libfdt-dev autoconf automake libtool librbd-dev libaio-dev flex bison libattr1-dev libcap-ng-dev libcap-dev3.编译./configure --target-list=arm-softmmu --audio-drv-list=alsa,pa --prefix=/home/caozilong/Workspace/qemu/install接着执行 make -j44.生成DEB包sudo apt-get install checkinstall sudo checkinstall make install5.安装结果6.分析由于HOST机是X86架构,所以这里的tcg-target.inc.c一定是X86目录下的tcg-target.inc.c文件。ARM平台上:arm平台上会使用arm目录的tcg-target.inc.c原理方面,Qemu采用动态二进制翻译(Binary Translation)技术,能够支持多源(HOST)多目标(target)的跨平台仿真执行异构指令集,如下图所示,在有限的几个基础架构上,支持运行了远远超过基础架构数量的目标ISA架构。总体上的工作模型如下:如何判断target 目录和tcg目录各自的角色,可以根据const TranslatorOps对象的位置判断,此对象注册了对目标架构的指令ISA的翻译(JIT)函数指针,它定义在target目录,自然也就是TARGE目录描述的是被模拟的目标指令架构:也可以通过TCI目录的所在位置判断那个目录是HOST机(源机),因为它是通用目标ISA的解释器。TCI目录在tcg/tci下,自然和tci目录平级的架构目录都是源机目录。helper和TCG的分派TCG翻译引擎KVM加速虚拟化过程虽然执行很快,但是要求目标平台和HOST平台为同一架构才有可能,而TCG引擎没有这个要求,TCG可以将目标机架构的二进制指令翻译为HOST指令,放到一片预先分配好的code_gen_buffer中,code_gen_buffer具有可执行权限,CPU可以执行放在其中的指令,用这种方式实现本地CPU加速。带有可执行属性MAP的CODE_GEN_BUFFER分配过程:可执行匿名区映射的例子:#include unistd.h #include stdio.h #include sys/mman.h #include fcntl.h #include stdlib.h #include errno.h #include string.h #define FILE_SIZE 0x4000 int add(int a, int b) { return a+b; } typedef int (*ptrfunc)(int, int); int main(void) { int i; unsigned int *maddr; ptrfunc ptrf; #if 0 maddr = mmap(NULL, FILE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); #else maddr = mmap(NULL, FILE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED|MAP_ANONYMOUS, -1, 0); #endif if(maddr == (void*)-1) { printf("%s line %d, faild to map buffer, error %s.\n", __func__, __LINE__, strerror(errno)); return -1; } printf("%s line %d maddr = %p errno %s.\n", __func__, __LINE__, maddr, strerror(errno)); memcpy(maddr, add, 64); ptrf = (ptrfunc)maddr; printf("%s line %d, maddr = %p, maddr(5,6) = %d.\n", __func__, __LINE__, maddr, ptrf(5, 6)); for(i = 0; i 16; i ++) { maddr[i] = i; printf("0x%02x ", maddr[i]); } printf("\n"); munmap((void *)maddr, FILE_SIZE); return 0; }如果不支持KVM,则可以使能TCI,它会启动一个虚拟机解释器,这样可以兼容所有的架构:当不配置--enable-tcg-interpreter时,TCG的后端是native x86_64.意思是说,将TARGET的指令集翻译为本地的x86_64指令,再交给本地CPU执行。支持TCI的编译选项,当添加--enable-tcg-interpreter支持后,TCG的实现后端就发生了变化,此时的TCG后端成为了TCG with bytecode interpreter,也就是TARGET的指令依赖主机纯解释执行,解释器的效率是很低的,效率肯定打了折扣。$ ./configure --target-list=arm-softmmu,aarch64-softmmu,i386-softmmu,x86_64-softmmu,riscv32-softmmu,riscv64-softmmu,aarch64-linux-user,arm-linux-user,riscv64-linux-user,x86_64-linux-user --audio-drv-list=alsa,sdl,pa --enable-system --enable-user --enable-linux-user --enable-sdl --enable-vnc --enable-virtfs --enable-kvm --enable-fdt --enable-debug --disable-strip --enable-debug-tcg --enable-debug-info --enable-debug --disable-strip --enable-vnc --enable-tcg-interpreter --prefix=/home/zlcao/Workspace/qemu/install/

相关新闻

MAC常用命令记录

MAC常用命令记录

----------------Mac相关-----------------创建目录 mkdir tmp-打开目录 cd ./tmp-使用访达打开目录 open ./tmp-创建文件 touch xxxx.txt-查看目录文件 ls -al 注: -a 显示隐藏;-l 显示文件信息-查看当前进程 ps -a 注: -a 当前用户全部;-A 全部用户…

2026/10/14 1:45:13 阅读更多 →
基于RT-Thread的贪吃蛇与俄罗斯方块:RTOS多线程与LCD渲染实战

基于RT-Thread的贪吃蛇与俄罗斯方块:RTOS多线程与LCD渲染实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 1:44:13 阅读更多 →
ADC转换实战汇总:采样原理、噪声抑制与校准技巧

ADC转换实战汇总:采样原理、噪声抑制与校准技巧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 1:44:13 阅读更多 →

最新新闻

A*算法在路径规划中的原理与实践优化

A*算法在路径规划中的原理与实践优化

1. 路径规划中的A*算法初探第一次接触A算法是在开发仓库机器人导航系统时。当时我们尝试了Dijkstra、深度优先搜索等各种路径规划方法,要么计算时间太长,要么找到的路径不够优化。直到一位同事推荐了A算法,测试效果令人惊艳——在100x100的网…

2026/10/14 2:22:24 阅读更多 →
ViTPose 仓库 DeepFashion 服装关键点检测实战:DeepPose + ResNet 回归模型配置与评估指南

ViTPose 仓库 DeepFashion 服装关键点检测实战:DeepPose + ResNet 回归模型配置与评估指南

人工智能计算机视觉深度学习 【免费下载链接】ViTPose The official repo for [NeurIPS22] "ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation" and [TPAMI23] "ViTPose: Vision Transformer for Generic Body Pose Estimation" 项…

2026/10/14 2:22:24 阅读更多 →
SimpMusic 的 Android 构建逻辑:用 Convention Plugins 与 Version Catalog 打造可扩展的 Gradle 构建体系

SimpMusic 的 Android 构建逻辑:用 Convention Plugins 与 Version Catalog 打造可扩展的 Gradle 构建体系

音视频 【免费下载链接】SimpMusic A cross-platform music app using YouTube Music for backend 项目地址: https://gitcode.com/gh_mirrors/si/SimpMusic 点击查看 免费下载 导读 本文围绕 SimpMusic 仓库中的构建配置实践,系统讲解如何用 Gradle C…

2026/10/14 2:22:24 阅读更多 →
从慢查询到Elasticsearch:倒排索引与分布式搜索入门避坑

从慢查询到Elasticsearch:倒排索引与分布式搜索入门避坑

第一次认真接触 Elasticsearch,不是赶新技术,而是被一条慢查询逼的。当时我在维护一个订单检索模块,数据量涨到六百多万条以后,按商品名称做模糊搜索的接口开始频繁超时。改 SQL、加索引、换缓存,折腾了一圈&#xff0…

2026/10/14 2:22:24 阅读更多 →
LVS+Keepalived+Nginx Docker负载均衡集群实战

LVS+Keepalived+Nginx Docker负载均衡集群实战

1. 项目概述:为什么一个负载均衡集群要绕这么大一圈?“基于Docker搭建lvskeepalivednginx实现高性能负载均衡集群”——这个标题里藏着三层技术栈的叠加,不是炫技,而是现实业务中反复踩坑后沉淀下来的务实选择。我最早在某高校实验…

2026/10/14 2:22:24 阅读更多 →
风电水电联合调度优化算法与工程实践

风电水电联合调度优化算法与工程实践

1. 项目背景与核心价值去年参与某省级电网清洁能源消纳项目时,我第一次接触到风-水联合调度这个课题。当时面对风电出力的强随机性和水电调节的滞后性,团队在制定优化运行方案时遇到了不少挑战。这个经历让我深刻认识到:在双碳目标下&#xf…

2026/10/14 2:21:24 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →