0x427eff1c beqz a0,0x427eff40 #1
0x427eff20 sub a0,a0,a2 #2
0x427eff24 bnez a0,0x427eff34 #3
0x427eff28 ld a2,16(tp) # 0x10
0x427eff2c ld a0,8(a1)
0x427eff30 jr a0
0x427eff34 add a1,a1,16 #4
0x427eff38 ld a0,0(ra) #5
0x427eff3c j 0x427eff1c #6
0x427eff40 ld a0,8(a1)
0x427eff44 li zero,-1
0x427eff48 bnez a0,0x427eff6c
0x427eff4c ld a1,160(tp) # 0xa
死循环的位置,接下来搞清楚这段代码是怎么生成的
ksco 的工作日志
0x427eff1c beqz a0,0x427eff40 #1 0x427eff20 sub a0,a0,a2 #2 0x427eff24 bnez a0,0x427eff34 #3 0x427eff28 ld a2,16(tp) # 0x10 0x427eff2c ld a0,8(a1) 0x427eff30 jr a0 0x427eff34…
原来是抄 Aarch64 代码的时候,漏掉把 X1 换成 A1 了。
0x427eff34 add a1,a1,16
0x427eff38 ld a0,0(ra)
❤1
经常分不清楚 jit 出来的代码是 dr 的还是 app 的。现在有个想法是在所有 dr 代码 emit 的头尾分别放上一个特殊的 nop 来帮助我 debug:
addi x0, x0, magic_number ,这样只要看到这个 pattern 的指令,我就立刻可以知道两条 nop 之间包裹的指令序列是哪个 emit 函数生成的。❤1
Forwarded from sterprim | SIGTERM
2382553_2382554_Bringing_Virtualization_to_the_x86_Architecture.pdf
984.4 KB
浅玩了一下 wasm。试了在 C 中调用 JavaScript 函数、在 JavaScript 中调用 C 函数、在 JavaScript 中调用 C 函数指针。LLVM 和 wabt 都蛮好用,和 JavaScript 的交互也很符合直觉。
尝试了一下 emscripten,但很快就放弃了,用过感觉人都不干净了。
尝试了一下 emscripten,但很快就放弃了,用过感觉人都不干净了。
接上:
目标是想实现一个在浏览器上运行的全系统 RISC-V 模拟器跑 Linux,预期性能要远高于 TinyEMU 才有意义。原本是想基于 TinyEMU 改改,但最终还是决定自己从头实现。
目前调研了和 TinyEMU 相同的单线程执行模型,即模拟器是单核的,然后运行一定周期后,退回到 JavaScript,然后再 setTimeout(run, 0) 重新进入 wasm,避免堵塞 UI。
接下来 --
1. 调研 Service workers,看有没有可能每个 CPU 一个 worker,然后起一个多核系统?
2. 调研在 wasm 中 JIT 的可能性,即在 C 中把 guest 按 basic block 生成 wasm 字节码传给 JavaScript,后者将其动态生成并注册成 wasm 模块,然后通过 indirect call 调用 wasm 模块。
3. 调研是否可以用 IndexedDB 实现文件系统。
目标是想实现一个在浏览器上运行的全系统 RISC-V 模拟器跑 Linux,预期性能要远高于 TinyEMU 才有意义。原本是想基于 TinyEMU 改改,但最终还是决定自己从头实现。
目前调研了和 TinyEMU 相同的单线程执行模型,即模拟器是单核的,然后运行一定周期后,退回到 JavaScript,然后再 setTimeout(run, 0) 重新进入 wasm,避免堵塞 UI。
接下来 --
1. 调研 Service workers,看有没有可能每个 CPU 一个 worker,然后起一个多核系统?
2. 调研在 wasm 中 JIT 的可能性,即在 C 中把 guest 按 basic block 生成 wasm 字节码传给 JavaScript,后者将其动态生成并注册成 wasm 模块,然后通过 indirect call 调用 wasm 模块。
3. 调研是否可以用 IndexedDB 实现文件系统。
❤1
(module
(func (export "throw")
unreachable
)
)
unreachable 在 C 中可以用 __builtin_trap(); 生成,是 unconditional trap。#DynamoRIO 遇到瓶颈了,再接下来推进工作感觉需要对 dr 的 codebase 有更深入的理解才行了。打算再读一遍那篇论文,看看有没有新收获;然后更完整地读 Aarch64 port 的代码,把一个 nontrivial 的程序在 dr 中运行的各种细节搞清楚。
🔥2❤1