ksco 的工作日志
245 subscribers
168 photos
10 videos
4 files
84 links
内容主要取决于我正在做的东西,目前主要是模拟器 / DBT 之类的散乱话题。
Download Telegram
可怕,aarch64 可以在指针里面塞个 Pointer Authentication Code 做加解密,来防止指针被篡改。
哇,带 libc 的 hello world 工作了!!!!
然而动态链接的还有 bug,sad
经常分不清楚 jit 出来的代码是 dr 的还是 app 的。现在有个想法是在所有 dr 代码 emit 的头尾分别放上一个特殊的 nop 来帮助我 debug: addi x0, x0, magic_number ,这样只要看到这个 pattern 的指令,我就立刻可以知道两条 nop 之间包裹的指令序列是哪个 emit 函数生成的。
1
ksco 的工作日志
然而动态链接的还有 bug,sad
刚要睡着,突然想到了问题的原因,起床修掉了。太棒了!
过于兴奋睡意全无了现在
划水的时候一直感觉今天还有什么事没做,刚刚终于想起来要在今天结束前交月报
浅玩了一下 wasm。试了在 C 中调用 JavaScript 函数、在 JavaScript 中调用 C 函数、在 JavaScript 中调用 C 函数指针。LLVM 和 wabt 都蛮好用,和 JavaScript 的交互也很符合直觉。

尝试了一下 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 实现文件系统。
1
ksco 的工作日志
https://developer.mozilla.org/en-US/docs/Web/API/FileSystem
似乎可以直接用这个 API 实现一个正经的文件系统?
(module
(func (export "throw")
unreachable
)
)


unreachable 在 C 中可以用 __builtin_trap(); 生成,是 unconditional trap。
一个很 trivial 的 patch,好巧不巧堵塞了后面的提交。竟然花了一个月才合进去,终于可以提新 PR 了。
#DynamoRIO 遇到瓶颈了,再接下来推进工作感觉需要对 dr 的 codebase 有更深入的理解才行了。打算再读一遍那篇论文,看看有没有新收获;然后更完整地读 Aarch64 port 的代码,把一个 nontrivial 的程序在 dr 中运行的各种细节搞清楚。
🔥21
你们 rust 有 else while 吗
前几天 GitHub 新首页推了个破解 Copilot 的项目给我,今天那个项目连带作者被一锅端了 🤔️
思考了一下如何在 WebAssembly 这种哈弗架构中做 JIT:

主模块中需要导出的东西:

1. indirect function table :实现“函数指针”调用
2. memory :用于把动态生成的 wasm module 传给 JavaScript

在主模块中动态生成 Wasm Module Binary(JIT 模块),放到 memory 里面,然后调用 JavaScript,JavaScript 从 memory 拿到数据后编译并实例化模块。
JavaScript 在实例化模块后,需要做 late linking,把 JIT 模块导出的函数注册到主模块的 indirect function table
另外 JIT 模块导出的函数也会直接读写主模块的内存,减少数据交换。这就要求 JIT 模块导入主模块的 memory ,这一步可以在 JIT 模块初始化时完成。
当主模块需要调用 JIT 出来的函数时,使用 call_indirect $function_table_index 即可。