典型二进制翻译系统---用户级翻译

目录

QEMU

MDT

HQEMU

FD-SQEMU

补充

Valgrind

包括

CrossBit

补充

 MTCrossBit

Strata-ARM

Box86

HQEMU

SymQEMU

UQBT

HBT

SQEMU

优化



QEMU

静态二进制翻译器

是一个开源的多平台的虚拟器,能够在软件中模拟一台机器

KVM(Kernel-based Virtual Machine)是 Linux 内核的一个模块,使 Linux 成为一个虚拟机监控器。它允许用户在 Linux 系统上创建和管理虚拟机

QEMU可以与Xen和KVM管理程序集成,以提供仿真硬件,同时允许管理程序管理CPU

当QEMU直接模拟cpu时,它能够在不同的机器(例如x86_64 PC板)上运行为一台机器

QEMU还能够为Linux和BSD内核接口提供用户空间API虚拟化。这使得针对一种体系结构ABI(例如Linux PPC64 ABI)编译的二进制文件可以在使用不同体系结构ABI(例如Linux x86_64 ABI)的主机上运行。这不涉及任何硬件仿真,只涉及CPU和系统调用仿真。

 QEMU 现有的寄存器分配机制忽略了指令前后之间的联系,在实际进行寄存器分配时,出现了部分寄存器重复使用部分寄存器闲置的情况,这产生了因不必要的寄存器溢出而引起的冗余访存指令

MDT

基于 QEMU 设计并实现的多线程动态二进制翻译系统 MDT

利用多线程并行框架,采用预翻译窥孔优化等手段,实现了 x86 平台上二进制可执行程序到
Alpha 平台的程序移植

HQEMU

多线程动态二进制翻译器 HQEMU,同样是基于 QEMU实现的,

其采用了 QEMU 的前端解码模块中间代码优化模块,将 QEMU 的后端编码模块替换 LLVM 优化编译器。HQEMU 通过将前后端分别固定在不同的核中,实现了翻译过程和执行过程的并行,有效的提升了 HQEMU 系统的翻译性能。

在进行翻译时,HQEMU 首先使用核心 1- m-2 运行源平台上的应用,在翻译执行的过
程中将热代码放入 FIFO 队列;之后在核心 m-1 上运行 LLVM 翻译器,在核心 m 上运行优
化器,并将优化后的代码存入追踪缓存之中,生成执行轮廓文件。追踪缓存存储优化后的
代码,优化后的代码能够传递到块代码缓存中用以加速执行;与此同时,块代码缓存中的
代码可以被复制到追踪缓存中进行优化,以提高程序的执行效率

FD-SQEMU

基于 QEMU 跨平台反馈式静态二进制翻译器 FD-SQEMU(feedback static QEMU)

解决代码发现代码定位问题,解决多进程 MPI多线程 Pthreads 并行程序的翻译问题

实现本地库函数替换源平台库函数,从而避免对源平台库函数的翻译

结合传统编译器和二进制翻译器中寄存器分配方法,引入全局寄存器静态分配和局部寄存器动态分配思想,提出了基于优先级的动静结合寄存器分配算法,解决QEMU中寄存器重复访问和闲置问题

补充

Xen 和 KVM 是两种流行的虚拟化技术,它们允许在单一物理硬件上同时运行多个虚拟机(VM)

Xen 是一个开源的虚拟机监控器(hypervisor)

API(应用程序编程接口,Application Programming Interface)是一组定义了软件应用程序之间交互的规则和协议。API 允许不同的软件组件之间进行通信,简化了软件开发的过程
 

Valgrind

基于VEX IR(VEX Intermediate Representation)中间表达式转换, 重量级代码插桩与分析工具

是一个用于构建动态分析工具的框架

使用平台:

- X86/Linux
- AMD64/Linux
- PPC32/Linux
- PPC64/Linux
- ARM/Linux
- x86/MacOSX
- AMD64/MacOSX
- S390X/Linux
- MIPS32/Linux
- MIPS64/Linux

包括


The Valgrind distribution currently includes six production-quality
tools:
a memory error detector, (内存错误检测器)
two thread error detectors,(两个线程错误检测器)
a cacheand branch-prediction profiler, (一个缓存分支预测分析器)
a call-graph generating cache abdbranch-prediction profiler, (一个调用图生成缓存分支预测分析器)
a heap profiler. (堆分析器)

It also includes three experimental tools:
a heap/stack/global array overrun detector, (堆/堆栈/全局数组溢出检测器)
a different kind of heap profiler, (一种不同类型的堆分析器)
a SimPoint basic block vectorgenerator.(SimPoint基本块矢量生成器)

CrossBit

源平台:MIPS, x86, Sparc

目标平台: Power, x86, Sparc

是一个与逆向工程漏洞分析(动态分析和静态分析)相关的工具或框架,帮助分析和理解二进制文件(如可执行文件和库)

支持多平台(如 x86、ARM 等)

有GUI界面,减少命令行依赖

多线程翻译, 基于Vlnst低层次的虚拟中间表示层

补充

Vlnst(Vulnerability Instantiation)是一个专注于漏洞分析的工具或框架,通常用于帮助安全研究人员和开发者识别、分析和修复软件中的安全漏洞

 MTCrossBit

是基于串行动态二进制翻译器 CrossBit 实现的

该框架在热路径的识别和优化过程中引入了多线程技术,通
过指定主从线程工作于不同核上的方法,避免了线程竞争造成的工作效率降低的问题。

Strata-ARM

源平台:ARM ARM

目标平台:IA-32 D

动态翻译应用于嵌入式系统, 间接跳转优化

Box86

在非x86 Linux系统上运行x86 Linux程序(比如游戏),比如ARM(主机系统需要是32位小端)

大多数x86游戏都需要OpenGL,所以在ARM平台上,像gl4es这样的解决方案可能是必要的。

应该安装ccache并用它来构建Box86

您应该安装ccache并用它来构建Box86。(以ccmake为例。)要启用TRACE(即转储所执行的所有单个x86指令,并转储寄存器),您还需要在系统上提供Zydis库。

If you are serious about developing Box86, you should install ccache and build Box86 with it. (Use ccmake for example.) To enable TRACE (i.e. dumping to stdout all individual x86 instructions executed, with dump of registers), you'll also need Zydis library available on your system.

源平台:x86, x86-64 

目标平台:ARM64, RISC-V

HQEMU

是一个多核可重目标的多线程动态二进制转换器

它集成了QEMU和LLVM作为其构建块

HQEMU可以实现较低的翻译开销和良好的翻译代码质量。

HQEMU支持进程级仿真和全系统虚拟化。它提供了在一个进程中运行QEMU转换器和LLVM优化器的转换模式,或者将LLVM优化器作为独立的优化服务器运行

SymQEMU

一个基于QEMU和SymCC的纯二进制符号执行器

灵活性强

源平台:x86-64, AArch64

目标平台:x86-64, AArch64

接受指向SymCC源代码和二进制文件的指针

UQBT

(University of Queensland binary translator)

静态翻译

使用解释器方法

UQBT 系统使用解释器方式成功解决了静态翻译中代码发现问题,但该方法翻译效率
较低,且需要重复使用源二进制文件的代码段。

HBT

(hybrid binary translation)

静态翻译器

动静结合方式

基于 LLVM (low level virtual machine)

源平台二进制文件 Ms 抽象为机器无关语言 HRTL(higher-level register transfer language)

SQEMU

(static QEMU)

的静态翻译器

变型地址映射表法

逐行翻译,定位准确,但是无法进行内存块的优化,效率不高

优化

反馈式静态二进制翻译框架 FD-SQEMU(feedback static QEMU)

先整体翻译,遇到问题时再给反馈,然后重新划分基本块

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值