RSSThe plan fell off.

Mitchell's Homepage Sorry.

FEX-RV 日志

2025-09

事情的起因是 Infra 的基础要在 box64FEX 中选一个,然后我没听说过后者,遂尝试编译:


-- Clang version 18.1.8
CMake Error at CMakeLists.txt:152 (message):
   FEX-Emu doesn't support compiling for x86-64 hosts! This is /only/ a supported configuration for FEX CI and nothing else!

很不幸地是实验室的机器还用不了,所以没招了,只能自己拿 QEMU 起发行版装。

翻出了自己三年前的破烂脚本,改亿改 (45mins of hard debugging) 得到一下能跑的版本:


#!/bin/sh

set -xe

ISO_PATH="$1"
QCOW2_IMAGE="$2"

qemu-img create -f qcow2 "$QCOW2_IMAGE" 50G
qemu-system-aarch64 \
    -cpu cortex-a53 -smp cores=4 \
    -nographic \
    -M virt -m 4096 \
    -bios /usr/share/edk2/aarch64/QEMU_EFI.fd \
    -drive format=qcow2,file="$QCOW2_IMAGE" \
    -device ramfb \
    -cdrom "$ISO_PATH" \
    -nic user,model=virtio \
    -rtc base=utc,clock=host

#!/bin/sh

set -xe

QCOW2_IMAGE="$1"

qemu-system-aarch64 \
    -cpu cortex-a53 -smp cores=10 \
    -nographic \
    -M virt -m 4096 \
    -bios /usr/share/edk2/aarch64/QEMU_EFI.fd \
    -drive format=qcow2,file="$QCOW2_IMAGE" \
    -device ramfb \
    -nic user,model=virtio \
    -rtc base=utc,clock=host

然后装系统 + 补依赖 + 编译折腾了一个晚上 + 一个上午,拼尽全力搭出了开发环境。

以及在阅读 FEX 文档的时候发现了一点小问题,成功在接触这个项目的 30mins 内向上游贡献 PR,20h 后被合并 最速传说(

明天就继续研究 FEX 的源码,看看它是怎么建模 ARM CPU 的,尝试再在 IR 上设计一层 IR 分发到 RISC-V CPU 上。

2025-10

01

整个国庆的工作效率奇低,产出非常可悲: 没有可见产出。

今天继续研究 FEX-Emu 的源码,在读前端解析过程中发现自己对不少细节完全陌生 (tl;dr: 菜),那确实没办法了,只能翻手册了。

然后就获得了一个 2500 页的 PDF (被水淹没,不知所措)

但考虑到再不干活进度就要彻底完蛋了,所以只能硬着头皮啃。

然后发现了一些抽象的东西: F2h 这个字节在解码的时候会一鱼三吃,可能是 REPNE、可能是单纯的 BND、也可能是像 BNDCU 这样的前缀,所以必须靠 CPUID/配置位/后续指令类别才能正确判断。

不过好消息: MPX 已在很多平台上弃用了,Linux 和 glibc 已经没有支持了;坏消息: 解码器仍要兼容旧代码的编码约定。泥头车又把我创似了

02

把 FEX 的源码拆了下,搓了一个 RISC-V 后端,在荔枝派上编译起来了。

顺便跑了个 7z bench 和 OpenSSL Benchmark。7z 测试结果能到 75% 左右,很吓人,明明用起来慢得要死但测试结果却没那么烂...

03

尝试跑了下 hello world,死在寄存器分配里了,看上去是因为 RV 后端初始化时没有提供寄存器信息,所以 RegAllocPass 不知道,直接崩了。

幸好这个问题比较好理解,修起来没那么麻烦,又水一周。

2025-11

01

赞美刘阳老师!

biscuit 真是神中神,支持的指令集很全,外加速度很快 不愧是 JIT 仙人(

有了好的 Codegen 工具后终于不用自己拼好宏了,实现 OpCode 方便多了。

02

加上了 Dispatcher 后,看上去 RV 后端能跑了,但跑程序还是崩溃,PC 居然是 0!

有脏东西,但它死在了 JIT 里导致异常难抓这个 Bug,拼尽全力发现是 Syscall Handler 上的函数地址传错了,但为什么错?汇编逻辑应该没有问题,Dump 出来的指令也很正常。

03

由于周报水不出来,所以花了两个小时认真拿 GDB 查了一下,结果是我 Dispatcher 逻辑写错了,进 JIT 执行第一个 CodeBlock 时跳过了第一条指令导致后面全乱了,闹麻了。

修掉这个问题后果然正常进到 Syscall 逻辑了,补上 write 的映射 Hello World 算是跑起来了。

04

用伟大的 Gemini 的力量 Vibe 了一个 Git History 改写工具,拿它重写了 FEX-RV 的提交历史,现在可维护性好了不少。