分析 QEMU 的 GD32VF103 启动流程

QEMU 启动以后,并没有立刻执行客户机程序的第一条指令,而是先执行 Machine 在初始化阶段设置的 reset vector 程序段,然后再跳转到客户机程序的第一条指令。 因此第一条指令的PC地址为 memmap GD32VF103 MFOL .base + 0x1000,通过以上代码得知,memmap GD32VF103 MFOL .base 为0,

2024-07-30 · 5 min · zevorn

记录移植 PLCT 实验室的 qemu-nuclei_gd32vf103 到 QEMU v9.0.2 的一些经验

当前成果: 下面记录关键 patch 解决的问题: patch 修复 dts 编译警告问题 这个 patch 主要解决了编译过程中遇到的 dts 编译警告,后续主线应该会修复该问题。 patch 添加 nuclei n205 核心 初始化 N205 核心的时候,用的 DEFINE VENDOR CPU(),可扩展厂商自定义指令集。 patch 添加 gd32

2024-07-28 · 3 min · zevorn

从零裁剪 QEMU 源代码

为了方便学习 QEMU 的 tcg 模块,尝试从零裁剪 QEMU 源代码,仅保留和 TCG 相关的模块。通过裁剪源代码,可以深入了解 QEMU 的代码组织结构,为学习 QEMU 打造一个坚实的基础。 base QEMU version: 8.2.0 QEMU 构建系统 QEMU 使用 meson + ninja 构建(make 也支持),脚本语言风格类似 p

2024-06-17 · 1 min · zevorn

浅析 x86 架构的微操作(uops)

uops 词义解析 μops 代指 uop ,全称是 Micro operation ,中文直译为“微操作”,micro 可以希腊字母 μ 代替,然后 operation 可以缩写为 op ,连一起即 μop。为方便书写,使用 u 代替 μ 。用 uops 来统称所有的 uop ,即 Micro operations (为了方便,下文统一称为 uops )。

2024-06-05 · 3 min · zevorn

Intel® VTune™ Profiler 分析 C++ 程序的常见性能瓶颈( Windows 平台)

用例和先决条件 本篇文章将展示,在 Windows 平台如何通过 Intel® VTune™ Profiler (下文简称 VTune)来识别和分析串行/并行应用程序中的性能瓶颈。使用 VTune 自带的 matrix 示例矩阵乘法应用程序作为分析和优化对象(备注:由于采用 Github 作为文章图床,部分图片加载速度稍慢)。 本文章要求安装多个英特尔软件工

2024-06-01 · 11 min · zevorn

AsmJit 上手指南

一、基本介绍 AsmJit 是一个完整的 JIT ( just In Time, 运行时刻)的针对 C++ 语言的汇编器,可以生成兼容 x86 / x64 和 Aarch64 架构的原生代码,不仅支持整个x86/x64 的指令集(包括传统的 MMX 和最新的向量指令集),而且提供了一套可以在编译时刻进行语义检查的 API 。AsmJit 的使用也没有任何的限

2024-05-27 · 6 min · zevorn

在 x86 平台上模拟 Aarch64 的 FCMP 指令

体系架构模拟最高效的实现,是尽量做到1:1模拟指令,即一条源目标架构指令对应到一条目标架构指令上。对于解释执行的实现,也要尽可能贴近这个原则,尽量以最少的目标架构指令,来模拟源架构指令。 一、思路介绍 aarch64的FCMP指令定义如下: 大体可以分为两种:单精度浮点比较,双精度浮点比较,每一种又分为有序比较和无序比较,所以可以总结为四种情况。 恰好这四种

2024-05-23 · 3 min · zevorn

LLVM3.0 JIT 处理代码块重定向阶段对外部符号解析的 Bug

LLVM3.0 的 JIT 在 MinGW64 / MSCV64 上,进行代码块重定向阶段,处理超过32位地址范围(前后跳转2GB地址空间)的外部符号地址时,会将其强转为32位: 这会导致生成的指令,在执行时崩溃,一般表现为段错误。 解决办法: PS:这个问题似乎在 LLVM 3.1 上面也存在。

2024-05-22 · 1 min · zevorn

IDA Pro“创建联合体”教程

IDA 认为,联合体是一种特殊的结构体,因此需要在 IDA 的结构体页面创建联合体: 第一步,进入 Structures 页面: 第二步,按下【Insert】,勾选 union : 一个空元素的联合体如下: 第三步,在 ends 位置按下【D】可以添加一个新的成员,如图示例添加了两个成员: 可以看到,两个成员的地址偏移都是从0开始的。 PS:如果想添加结构体

2024-05-21 · 1 min · zevorn

三步轻松“定制”GDB

GDB 是 GNU Debugger 的简称,属于 GNU 项目的一部分,是一款功能强大且广泛使用的命令行调试工具,专为 Unix 和类 Unix 操作系统设计,尤其在 Linux 环境下是程序员首选的调试工具之一。GDB 主要用于调试 C、C++、Pascal、FORTRAN、Ada、Objective C、Free Pascal、Go 等多种编程语言编写

2024-05-19 · 5 min · zevorn