QEMU TCG研究

TCP/IP协议栈之QEMU(零)--- LwIP开发调试环境搭建 一、QEMU环境搭建 嵌入式软件开发离不开开发板,在没有物理开发板的情况下,可以使用 QEMU 等类似的虚拟机来模拟开发板。QEMU 是一个支持跨平台虚拟化的虚拟机,它可以虚拟很多开发板。为了方便大家在没有开发板的情况下体验 RT-Thread,RT-Thread 提供了 QEMU 模拟的 ARM vexpress A9 开发板的板级支持包 (BSP), 我们可以在此基础上学习LwIP协议栈的开发... 阅读详情

TCG

动态翻译的基本思想就是把每一条Target指令切分成为若干条微指令,每条微指令由一段简单的C代码来实现,运行时通过一个动态代码生成器把这些微指令组合成一个函数,最后执行这个函数,就相当于执行了一条Target指令。那么现在的CPU指令这么多,怎么知道要分为哪些微指令呢?其实CPU指令看似名目繁多,异常复杂,实际上多数指令不外乎以下几大类:数据传送、算术运算、逻辑运算、程序控制;例如,数据传送包括:传送指令(如MOV)、堆栈操作(PUSH、POP)等,程序控制包括:函数调用(CALL)、转移指令(JMP)等;
在这里插入图片描述

在这里插入图片描述

上述流程图是从 CPU 初始化到生成 TCG 中间代码的过程,部分代码与 Target 强相关,从如下 References 可以看出
在这里插入图片描述

0x23 指令翻译核心函数 cpu_gen_code

变量 s 作为 TCG 上下文
在这里插入图片描述

TCGContext 的定义(部分代码)

struct TCGContext {
   
   
    uint8_t *pool_cur, *pool_end;
    TCGPool *pool_first, *pool_current;
    TCGLabel *labels;
    int nb_labels;
    TCGTemp *temps; /* globals first, temps after */
    int nb_globals;
    int nb_temps;
    /* index of free temps, -1 if none */
    int first_free_temp[TCG_TYPE_COUNT * 2]; 

    /* goto_tb support */
    uint8_t *code_buf;
    unsigned long *tb_next;
    uint16_t *tb_next_offset;
    uint16_t *tb_jmp_offset; /* != NULL if USE_DIRECT_JUMP */

    /* liveness analysis */
    uint16_t *op_dead_args; /* for each operation, each bit tells if the
                               corresponding argument is dead */
    
    /* tells in which temporary a given register is. It does not take
       into account fixed registers */
    int reg_to_temp[TCG_TARGET_NB_REGS];
    TCGRegSet reserved_regs;
    tcg_target_long current_frame_offset;
    tcg_target_long frame_start;
    tcg_target_long frame_end;
    int frame_reg;

    uint8_t *code_ptr;
    TCGTemp static_temps[TCG_MAX_TEMPS];

    TCGHelperInfo *helpers;
    int nb_helpers;
    int allocated_helpers;
    int helpers_sorted;
};

在对一个翻译块进行二进制翻译时,TCG 需要维护一些信息完成动态翻译,即 TCGContext,TCG 上下文包含三类信息:内存池、标号和变量1。

  • TCGPool:内存池,用于二进制转换期间的内存管理。为了提高性能,TCG 在初始化期间分配了较大的存储空间(32K)。TCG 需要内存时,直接从中获取,当内存池剩余空间不满足申请需求,再申请新内存。内存池之间通过链表维护。
  • TCG 变量:临时、局部和全局变量。在 TCG 上下文中,所有变量存放在一个静态分配的数组中。不再使用的变量,使用链表链接。先从被释放链表中分配,后从静态数组中分配。
    在这里插入图片描述

目标指令翻译成 TCG 中间码

gen_intermediate_code() 函数定义在不同架构的 target-xxx/translate.c 文件中。该函数将 target 指令翻译成中间码。操作码和操作数分开存储。操作码存放在 gen_opc_buf变量,操作数存放在 gen_opparam_buf变量。翻译过程就是不断向上述两个缓冲区填充操作码和操作数。
将基本块(basic block, tb) 翻译成 TCG 中间代码(intermediate code)。

TCG 中间码翻译成宿主机指令

tcg_gen_code() 函数定义在 tcg.c 文件中。该函数将中间代码翻译成 host code。
将 TCG 中间码翻译成 host 机器码的函数是 tcg_gen_code_common 。主要过程如下

  • 从缓存中找到 TCG 操作码和相应参数;
  • 为输入参数分配 host 平台的寄存器;
  • 为输出参数分配 host 平台的寄存器;
  • 输出翻译好的二进制指令到翻译缓存中。
    从代码层面分析,tcg_reg_alloc_op主要是分析该指令的输入、输出约束
qemu源码解析一 qemu源码分析,有理有据,跟着目录走,持续更新 阅读详情

相关推荐

darwin-vm:用QEMU搭建XNU内核调试实验床,让Apple内核研究开箱即用

操作系统内核研究往往受限于硬件门槛和调试手段,尤其是Apple生态下的XNU内核,传统方法需要真机、签名和特殊硬件环境。虚拟化技术为内核研究提供了新的可能,QEMU作为开源模拟器,能够模拟ARM64架构的CPU和平台设备,配合GDB/lldb调试协议,可以构建一个完全可控的内核实验环境。darwin-vm项目正是基于这一思路,将Darwin操作系统内核和用户态整体跑在QEMU之上,为开发者提供了一条可复现的启动链路和完整的调试通道。对于内核学习者、安全研究者和驱动开发者而言,这类实验床能够支撑系统调用追踪、

weixin_33895516的博客 425

【GitHub项目推荐--CPU仿真器框架】【转载】

在Unicorn的上下文中,虽然它可能不直接暴露或使用与QEMU完全相同的TCG接口,但Unicorn的CPU模拟和分析功能很可能在内部使用了类似的技术来实现动态二进制翻译和代码生成。QEMU是一个开源的机器模拟器和虚拟化器,它能够通过动态二进制转换来模拟CPU,并提供一系列的硬件模型,使客户机操作系统认为自己和硬件直接打交道,实际上是同QEMU模拟出来的硬件打交道。总的来说,QEMU是一个功能强大的开源模拟器和虚拟化器,它提供了多种功能,使得用户可以在不同的硬件平台和操作系统上进行虚拟化、仿真和开发。

j8267643的博客 2052

darwin-vm实战:用QEMU模拟苹果芯片调试XNU内核

在系统底层研究与安全分析领域,虚拟化与模拟技术一直是降低硬件门槛的关键工具。QEMU作为开源硬件模拟器,不仅支持常见的x86/ARM平台,还能通过动态二进制翻译构建出特定SoC的虚拟环境。内核调试是理解操作系统运行机制的核心手段,而Darwin(XNU内核)作为苹果生态的基石,其闭源性长期阻碍了研究者的深入探索。darwin-vm正是借助QEMU的系统模拟模式,虚拟出带苹果特色的ARM64平台,让XNU内核可以在普通x86主机上启动并运行。通过配置设备树、串口输出与调试接口,研究者无需白苹果设备即可完成内核

weixin_33805743的博客 477

darwin-vm:在Linux上用QEMU调试XNU内核的开源方案

操作系统内核调试是底层开发与安全研究中的关键环节。传统上,调试Apple平台的XNU内核需要专用硬件与封闭环境,门槛较高。darwin-vm借助QEMU的TCG纯软件模拟能力,在普通Linux主机上仿真Apple A/M系列CPU,将Darwin/macOS系统镜像以可调式方式运行起来,并通过LLDB远程协议建立调试通道。这一方案绕开了硬件依赖,为内核研究者提供了开箱即用的实验环境,使得断点、单步、符号解析等操作得以在非Apple平台上完成。其技术价值在于降低XNU内核研究的入门成本,适合安全分析、驱动开发

weixin_33816821的博客 438

darwin-vm:在QEMU上搭建可调试的Darwin/XNU内核实验床

操作系统内核调试是系统安全、驱动开发与底层教学的关键环节,但传统方式依赖真机或完整虚拟机环境,门槛极高。QEMU作为开源虚拟化工具,通过动态二进制翻译和GDB远程调试能力,为内核研究提供了低成本的模拟平台。基于QEMU的darwin-vm项目精准模拟Apple A/M系列芯片基础外设,跳过图形界面直接引导Darwin(XNU)内核,使研究者能在x86 Linux工作站上实现打断点、查看寄存器、单步跟踪等调试操作。这套实验床覆盖了从内核装载、启动日志分析到Mach IPC、IOKit驱动匹配等核心子系统的运行

weixin_30074763的博客 339

QEMU源码全解析 —— virtio(1)

QEMU源码全解析 —— virtio(1)

phmatthaus的专栏 2911

MATLAB AppDesigner 中TextArea保留原有信息并换行显示提示信息

App Designer 中的文本区域TextArea组件,一般可以用来作为matlab app设计中的信息显示。 app.TextArea.Value = 'Hello Matlab'; Value可以是字符向量、字符向量元胞数组、字符串数组或一维分类数组。这样直接给TextArea赋值,每次赋值都会消除先前的信息,然后显示新的信息。如果想要在app实现保留原有信息、多行信息的输出,在MathWorks官方帮助中心给出了一种方法: cellArrayText{1} = sprintf('%s\n

我是麻瓜喔的博客 1万+

11、rsa-目标主机支持RSA密钥交换【原理扫描】的漏洞

通过将 etcd 的 TLS 密钥交换算法从 RSA 升级为 ECDHE,可实现前向保密,彻底消除 “私钥泄露导致历史流量解密” 的风险。核心步骤是通过强制启用含ECDHE的套件,并禁用 RSA 密钥交换套件,同时建议升级到 TLS 1.2+ 并优化证书类型(优先 ECDSA)。这一配置符合云原生安全最佳实践,也是 Kubernetes 等依赖 etcd 的系统推荐的安全标准。生成临时密钥的具体步骤是什么?如何验证etcd是否已成功更新为ECDH密钥交换算法?配置临时密钥交换算法可能带来哪些性能影响。

xuebo1129927648的博客 1万+

MacBook 长期挂机 OpenClaw:电池保护 + 防休眠设置

本文介绍了MacBook长期挂机运行OpenClaw时的电池保护和防休眠设置方案。主要内容包括:1)电池保护策略,通过电源连接、充电限制和定期充放电维护电池健康;2)防休眠设置,禁用系统休眠、自动休眠和屏幕休眠;3)OpenClaw的Docker部署方法。文章提供了详细的命令行脚本和配置说明,帮助用户实现MacBook的长期稳定运行,同时保护电池寿命。

一键难忘的博客 1695

61、神经科学中的分岔与双分子反应研究

本文探讨了神经科学中的分岔现象与双分子反应建模。在神经元网络中,通过分析四细胞网络的呼吸节律振荡,揭示了分岔对振荡频率和占空比的影响,并区分了单神经元与网络层面的分岔特性。在神经群体模型中,系统参数变化引发的分岔可导致振荡、混沌等动态行为转变,文中详细介绍了局部分岔、全局分岔和高余维分岔的机制,并以Jansen-Rit模型为例展示了输入水平变化下的分岔过程。在分子层面,重点介绍了MWC模型在描述配体与多位点蛋白质结合中的应用,涵盖其构象状态、平衡常数及统计因子。研究表明,分岔理论和双分子反应建模为理解神经系

yog99的博客 80

ThingsBoard3.9.1规则引擎方式发送钉钉通知消息

thingsboard3.9.1/4.0规则链方式发送钉钉通知消息。

hssjf的专栏 531

第12步 支持向量机(SVM)

搭建SVM

Jet4505的博客 1051

执行任务赚积分

接下来N行,每行两个空格分隔的整数(SLA和V),SLA表示任务的最晚处理时间,V表 示任务对应的积分。每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。第2个时间单位内,处理任务4,获得5个积分。输入描述:第一行为一个数N,表示有N个任务,1

面试高手的博客 4695

LLC电路细讲笔记(二)LLC谐振转换器:频率、增益与Q值的详细探讨

这本电子书通过详细分析LLC谐振转换器的工作原理、等效电路和增益公式,帮助读者深入理解如何设计和优化谐振转换器系统。通过这些公式和设计方法,工程师可以根据不同的应用需求调整参数,实现高效的电能转换。

weixin_43199439的博客 6884

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: (CVE-2022-276\66): Exploit esp6 modules linux 内核攻击-分析翻译
下一篇: CVE-2022-34918漏洞流程图
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值