ααΆαααααα½ααααα»ααααααα
α
α·ααααααααΎα
αααα αΆαααΈααΆααααα
αααΆαααααααΎαααΆα αα·ααααααΈαααααααααΎα JavaScript (ααΆααααα
αααΆαα Asm.js) ααΈααΌααααΆαααΈαα QEMU ααααΌαααΆαααααΎαααΎααααααΆααααΆααα·ααααα α αΎαααααα·α
ααααααα α’ααααααα½αααααΌαααΆαααααααα
ααΎ Habr α αα
αααα»αααα·ααααααααα»αααααΌαααΆαααααααΆαα±ααααααΎααααααα‘αΎααα·ααα
αααα»α WebAssembly α αΎααααααΆααααααααα½αα―ααααααα αα·ααα½α
ααΆααα αΎαα αααα»ααα·αα
ααααΆααααααααα... ααΆαααΆααααα»ααααα ααα»ααααααΊαααΆαα α αΎαα₯α‘αΌαααα ααααΈαααα αα
αααα»αα’ααααααααααΆαααα
ααΆααα·α αα
αααααΆααααα»αααΆααααααΈαααα "ααΌα ααααα " α ααα QEMU αα JavaScript αα αααααα ααΆααααΌαααΆααααααα α α·αααααααΎααΆαααααααΆααααΆ αα·ααα·αααααΎααα α»αα αΆαααααααααα
ααα α»αααααα½αα ααΆααΆααΈααΆαα ααααααΆαα ααα»α
ααα α»αααααΌααααααααα»αααΊααΆαααααααααααααααααα»αα
ααααΈαααα 2.4.1 ααΆαααΎα αααααΆααααααΆα αΆααααΌα
ααΆαααα»αααΆαααα·αααααα’αα½αα ααααα·αααΎααΆαα
ααααααΆαα
ααα»α
ααΆα αααααΆαααα ααααΆααΆααααααααΆαααΆαααΆαααα 2.4 α αΎαααΌααααΈααα
αααΎααααααΌα
ααααααΆααΆ master
. α αΎαα
αΆααααΆααααΈαααα»ααααααααΉαααααααα
ααα½αααααΉαααααΌαααααα α»αααααΆαααααα½ααααααααα»α αααα»ααα·αααααΌαααΆαααααΆααααΆααααααααααααΆαααααααα αααα αΎαααΆαααααααααΆααΆαααααααααΆαα ααα»αααααααααΊααΆααΏαα QEMU αα·ααα
ααααααα α αΎααα
α
ααα»α
αααααα½ααααααααΆααααΆααααααΆαααΈααΆααααααΎαααααα·αααααΆαααααΌααααααΆααααααΎα 10 ααΆαααα "αααα αΎα α₯α‘αΌαααααααα»αααΉαααααα" αααα»αααΆααα·αα αΎαααΌα
α
α·αααα αα
ααΈαααααΎαααααΌαααααΎααΆαααααααΆαα αααααΆαααααααααΆαα·αααααααααα½ααα QEMU.js αα·αααΆααα·ααααααΆ QEMU ααΎααα·ααααααΆααααΈα’ααααααΆααααααααα α»αααααα (αααααΊαααααααΆααααα»αααΆαααααΎαααΆααααα»ααααααααΆαααααΆααΌαααααΌαααΌαααααα·αααΆααααααααΆααΆα
αααΎα αα·α αα·ααααααααΆαααα "ααααΎααΊαααααΆααα’αα") ααΊααααΆαααααααΆααααΆ αα»αααΆαα
αααααααααααααα‘αΆαααααααα»αααααΌα "ααΎαααΆα
αα" ααΎααααΈα’αΆα
α α
ααΈααΆααααα
ααΆαα αααααΆααααααΎααααα αΆααααααΆαα·αα½αα
ααα½ααααα»αα’αα‘α»αααααα½ααααα
αΌαααααΆα αααααΆαααΆαααΆ, ααΆααα·ααααααΆαα½αα
ααα½αααααΆαααααΆααααααΌαααΈααΆααΆ master
ααΆαα½αααΉαααΆαααααααα»αααΆαααααΆααΆααααα
αΌααααααΌααααααααα»αααααααΌαααΆαααααΎαααΎαααααααααα»αααΆαα
ααααααΆαα
ααα»α
(α αΎαααΌα
αααααα
αααα»αααΆααΆαααααααα»α) αααααα ααααΆαα·αααΆαααΆαααΆααααα½ααααααααααα
ααΆααΌαα
αααα»αααΆααααααα
α
α·αααααΆααΆαα
ααααα ααα»αααααα»αααΆααααα
ααααααΌααΎα ααααΆα
αααΆαααααΆαααααααααΆααΆ αα·ααααααΎαααααααααΈααΈααααΌααααααα’ααααΎα’αααΈαααααααΈααΆαααα α αΎαα₯α‘αΌααααααΈ master
.
ααα α»ααααααΈαα αα·ααΈααΆααααα TLP
ααα»ααα ααααα·ααααααΆααα α»ααα ααΆααΌαα ααΆααααΆααααααΆαααααααα·αααααααΆααααααΎααααααααααα»αααααααααααααΆαααααα»αααΆαααααα»ααα "ααααααααΆ αα·αααααααααΆααααΈ?" α αΎαααΆααΌαα "ααΎααΎαααΉααα αααααΈααα?" αα αααα»αααααααααααΆααααα ααΆαααααααααααα·ααΈαα·αα αααΆαα ααΊααΆαααααΎαααααααΉαααααΌααα½α ααα»ααααααΆαααααααΆαα· αααα»ααα·αα ααααααΎααΆα‘αΎααα·αααααα·αα αΆαααΆα ααααααα ααΎαααααααα»αα ααααααΎααΆαααααααΆαααα ααΆαααααααααΆα α·αααα’αΆααΌαα·α ααΆαααααΆααααααΌαααΌααααααΉααααα½α (αα·ααα·αααα "ααΆαααΆαααα½α’ααααα αααααααΆαα½αααααΆαα αΌαααΆααααααΆα ααααα (ααΆαα½αααΆααααααΆα)" ααΌα ααα Linus Torvalds ααααΆαααα·ααΆαα’αααΈααααΆααααΆαα αααααΎαααααΆα ββWikiquote) ααα
ααα α»αααΈ 3: α αΌααα αααα»αααΉαααααα·αααΉα ford
αααα»ααα αααα·αααΆααααΆααααα αΆααααΆα ααααΆαααααα»ααα α‘αΎααα ααα»ααααα₯α‘αΌαααααααα»αααΆααααααα α α·ααααα·αααΎαααΆαααΆαααΆααααΆαααααΌαα·α αααα»α α αΎαααααΎααΆααΆα "αα·ααΈαααααα‘αΎα" αααααΊααααααααααα·ααΈααΆαααααα TCG αααααααα»αααΈααααΌα ααΎααααΈαα»αα±αα ααααΌααααα·ααΆααα ααααααααααΆ "ααΆα αααααΆααΆααα·α ααΊαα ααα»αααααααα»ααα·αα’αΆα αααααααααα’αααΈαααΆααα’ααααΆααα - αααα αΎαααΆααααααα TCI ααααΌαααΆαααααα ... " ααΆαααααα ααα αααα αΆααααΈααΌα ααΆααΆαααααααααΆαααΆαααααααααΆααααΈααααΌααααααααα αααα»ααααααΎαααΌααααααΈα. ααΌα ααααα½ααααα·ααΆαααΆ "Ghent ααΆααααααΌααααα»αΡααα»αααααα·αααααα½ααααααβα αα·αααΆααααΌαααΊαααααααααααααΈα ααα»ααααααΆαααααααααααα·αα’αΆα ααααααα ααΆαααααΆααααααΆααα - ααΆααααΌαααααααΌαααΆααα»αα αΌααα αααα»ααααααα·ααΈαα»ααααααΆαα αααΆαααααααΆααααΆαα ααααα ααΆαααααααα αααα»αααααα»ααΆααααΆαααα½αααΈ JS world ααααα ααααααΌαααΆα ααααΌαααΆααααααΆαα»ααα ααααααααΆαα½αα ααααααΆαααΆααααα αα ααΎααααΆαααααααα RISC ααααααΆ ααΆαααααααα»αααα ααααΆαααΆαααααααΆααΊαααααΌαααΆαααΎααααΈαααααα‘αΎααα·ααααΆαα αααΆααααΌαααααΆαααααααΆααααΆαααααΆααααααΆααααΌααααααΆααααααΎαα‘αΎααα·α - ααααα·αααΎααααα·ααααααΆα’αααΈαααααΎαααααΌαααΆααα αααα»αααααΈααΆααααα ααΆαα·ααααα αΎαα ααΎαααΈαααααα ααΈααΆαααα»ααααα α»αααααααααααααα»α αααα»αααΆαααΉαααΆααΆααααααααααα αΆααααΌα ααΆαα·αααααΌαααΆαααααααα ααααααααααΆααααααα»ααααααα ααΌα ααααααΎααα·αααΆαα·αααααΌαααΆα bytecode αααααααΌαααΆαααααααΆαααΈα’α»α αααα·αααΆαα½αααααα α αΎαααΎαα’αΆα αααααΎαααΆαααααΆααααααΈαα»αααΆααα ααΎ TB .
αα½αααααΆαααααΆαα
αααααΈααΆαααα»αα
αΆααααααΎααααααααΌαα‘αΎααα·ααα
αααα»αααααααααΆααααα ααα»ααααααΆαααΆαααααααααααΆααααα»αα‘αΎαααααα·αααΆαααααΆααααααααΆααα ααΆααααααΆαααα»αααααΈ GitHub αααααααΆααΆαααΌαααααΉαα’αααΈααΆαααααΎααααα
ααΉαααααΎαααα αΆ αα·αααΆαααΆα ααα»αααααα
ααΈααα ααααΆαα ααΎαα‘αΎααα
αααα»ααααααααα‘αΆα
αααααΆααααααΆαα
αααΎαααα
- ααΎαααααΎαααΆαα’αααΈαα½ααααα’ααααααααα·αα αΆαααΆα αααα‘αΎαα’αααΈααΆααα’ααα
- αα·αααα·ααα ααΎααααααααααααα·ααααα·ααΆα iOS αααααααα ααΆαααΆαααα α αΆαα’αΆαααΆαααΆαααααα·ααΈαααα½αααααααααΆααα·αααα·αααααΎαααΌαααααΆααααΊαααΆαααΈα JS (ααΎαααααΆααΆααα·ααα?)
- ααΆααααα αΆαααΈ mini-OS - single-floppy, built-in, ααααααααααααα firmware ααα
αα»αααΆααααααα·ααΈαα»αααααΆαα’ααΈαααΊαα·α
ααΌα
ααααααα»αααΆααα·ααΆααα½α
ααα αΎαααΆ QEMU ααααΌαααΆαααααΆαααα
ααΉα multithreading ααα»αααααααααα·ααΈαα»ααααα·αααΆαααΆααα αααα αΎα αααααΊααΆ αα... ααααΌαααΆαα·αααΆαααΆααααααα αααααΆαααα WebWorkers ααΆααααα αΆααααα½α - ααΆαααααααα»αααα αααααΊααΆααΆααααααΌαααααα
αααΎααααααα’ααααΎααΆααααααΌαααΆα αααααααΆαα’ααααααααΆαα
ααααααα. ααΆααααααΆ ααΆαααααΎααααα αΆαααΆαααααΆαααα
ααααααααΌαααΌααααααΆαααααΆαααααααα’ααααΎααααΌα’αααα
αα
αΆααααααΆαα
αααααααα αααααΆαααααα
ααααααααααΆαααΆααΆαααααΆααααΌαααΆαα’αα»αααααααααααααα SharedArrayBuffers
. ααΆααααΌαααΆαααααΆαααΆαααααΎαα αα½αααααΆαααααΆααααααΆαααΎαααααΎαααΆαααααααΆαα
αααα»ααααααα·ααΈαα»αααααααααααααΆ αααααΆαααααα½αααααΆαααααΆαααααα·ααΈα
αΌαααααΆαααααΈ α αΎααααααΆαααααααΆα... αααααααα‘αΆααααααΎαααΆαααΆαα ααΆααΌα
ααααΆααΆααα’ααα
αααααααα·αααααΈααΈαααΊααΆααα·αα’αΆα
αα
αα½α
ααα§ααΆαααααααα·αααΆαααΆαα½ααααα α’ααααα·αα’αΆα
ααααΆαααααα αααααΆαα»αααα·αααα
αα
α»αααααα α αΎαααααΌααα
ααααΈαα½αααΆαα½ααααααααΈα αααααΆαα α
ααααΌαααΆααααααααααααααααΆαααΈααα·αααα·α JS α ααΆα αΆααααΈααΌα
ααΆαααα αΆα’αααΈ α
αΆααααΆααααΈααΎααα
αααααααα
α
α·ααααααααααααααα αΌαααΈαα»αααΆαααααα»αααααα? ααΆααα·αααΊααΆαααα»α I/O αα
αααα»α QEMU ααααΌαααΆαα’αα»ααααααΆαααα coroutines α αΎααααααΆαααααααααααΆααααα
ααααααααα·αααΆαααΉαααΆαααααααααα ααΆααααΆαααα’ Emscipten ααΆαααααααΆααααααΆααααααα·ααααα·ααΆαα’ααααΆα ααΌααααΈααααΈαα
αα αααααα αααα»ααα·αααΆααα’αΆα αααααααΌααα ααΆαα½ααααααΆαα ααααααα αααα»α WASM αα·αααααααΆααααααααΎ Emterpreter ααΌα ααααα§ααααααααααααΆαααα·αααααΎαααΆααα α‘αΎααα (ααΌαααΎααα αααα»ααααααΈαααααΆαα ααΌα ααααα½ααααα·ααΆα...)α αααβααΊβαα βααΈβαααα ααβα’αααβαα½αβααβααα½αβααΆαβα’αααΈβαα½αβααΌα βααΆβααΏαβαααααΆααβαα½αβα±ααβα’ααβααααΎα βαααβ:
- αααα»α I/O αααααααΌαααΆαααααααΆαα αααα αΎα ααΎα’ααααα·αααΆααααΉαααΆααΉαααααΎααααΆααααΆα NVMe ααΆαα½αααΉαααΆαααααααααΎαααααα? π
- ααΌα QEMU α αααααααααΆαα αααααααΆααααΆαα (α’ααααααααα α§αααααααααΆααααΆααααααααα ααα)
- α αααααααΌαααααααααααΆααααααα αααα»α WASM
αααααααα·αααααααααα QEMU
ααΌα αααα’ααααααα ααααΆααΆαααΆααα½α α αΎα ααΌααααααΆααααααΆααααΆαααααΆααααααααααααα αα·αααΌααααααΆαααααααΎαααΆαααααΆααααΆαααΈααααΆαααΈαααααΌαααΆαααααααα αααα»α QEMU α ααΆαβαα·α ααΆβααΉαααβαα·ααΆαβααααα·α α
- ααΆαααααΆααααααααααααα
- ααΊ α§ααααααααααΎαααααΏααααααΊ KVM αααααΆαααα·αααα·ααααααααΉααα
ααΎααΈαα»α
(αααααΆααααααααααααααα αα·ααααΆαααΈααααααααααΆααΆαα½αααααΆ) TCG αααααΆααααΆααααααΎαααΌα JIT αααααααΈααααααα α
αΆααααααΎαααΆαα½α QEMU 2.9 ααΆαααΆαααααααααΆαααααααααΆααα·αααα·ααααααααΉα HAXM αα
ααΎ Windows ααΆααααα αΆααααα½α (
ααααααΆααααα’α·α ) - ααααα·αααΎ TCG ααααΌαααΆαααααΎααΆααΆαααΆααα·αααα·ααααααααΉα αααααΆααΆαααΆαααΆααααααΆααααααΎαααΌαααΆα ααααα‘αααααααΆααααααΆαααααααααααΆαααΈαααΈαα½αα ααααΌα ααΆαααααΆααα’αααααααααααΆααααααααα
- ... αα·ααα»ααα·αα’αααΈαααΆααα’ααααα - ααααΏααα»αααααΌααααααααΆαααααΆααααΆα α ααα»α αααααΆααα’αααααααΎ ααΆαααααΎα αααΆααααα»α ααΆαααα‘αΎααα·α ααΆααΎαα
αα·ααΆαα’αΈααα αΉαααΎα’αααααΉαααα QEMU α’αΆα ααααΆααααΆααα·αααααΉααααα»αααααΌαααααΆααααΌαααα»ααααααα ααα»αααααααααΆααααααΎαααΆααααααΆααααααΎαααΆαα’αααααααΎααααΆααααΆα ααααα‘αααα½ααα αααα»αααΊααααααΆαααΈα αααααααΌαααΆαααααΎααΆα§ααΆα αααααα AFL fuzzer αααααΆααα§ααααααααααΈαα αααα ααααΆααΆαααααΆααααΆααα αααααααΌαααααααααα·ααααα·ααΆαααααααα QEMU αα JS? π
ααΌα
ααΆαααααα·ααΈα₯ααα·ααααααααααΆαααααααααΌααααα»α QEMU ααααΌαααΆααααααΎαα‘αΎαααΆααααααΆαα α
ααΌααααα configure
ΠΈ make
. α
αΌααα·ααΆαααΆα’ααααααααα
α
α·αααααααααα’αααΈαα½αα αααααααΆαααααα TCG ααΆαα’αα»αααααααααααα‘αΆα α’αααΈααααααααα αα»ααααααΆαααααααΆααααΈαααΆα / αααααα (ααΌααααααΆααααΈαααααααΆαααΆααααααα) αα
αααα’ααΆααααααΆαααααΆααααααααΆαα½α Autoconf - ααΆααα·α configure
QEMU ααααααΆαααααααααααα½αα―α α αΎααα·αααααΌαααΆααααααΎαααΈα’αααΈαααααα
WebAssembly α
ααΌα
ααααααΎα’αααΈαα
αααα α
ααΆ WebAssembly (α α
ααΆααααΆ WASM)? αααααΊααΆααΆααααα½ααααααΆαα Asm.js αααααααΎαα»αααΆααΌα JavaScript ααααΉαααααΌαα αααα»ααα
αα·α ααΆααΊααΆαααααααααααααΈααα»αααααΆα αα·αααααΎα±αααααααΎα α αΎαααΌααααΈααααααΆαααααααααα
ααα½αααααα
αααα»αααΆαα·αααΆαααααααα»ααααααα αααααΆααααΆαααααα½α ααΆααααΌαααΆααααααΆαα»ααααα»ααααααα
α’ααααααα ααααΆααααΆααααΆαααΊα’αααΈαααα½ααααααααΆαααΆαααααα·αα‘αΎααα·ααααααΆαα Asm.js - αααααΊααΆααΆαααααΆαα‘αΎααα·αααΌαααΆαααααΆαα’αααΈααΆααααααααααααα αΌα "ααααα·αααααα" (αααααΊααααα·αααΎ - αααααΆαααα - αααααααα ααααα·ααα»αα αα ) ααααααΆαααΈα JS ααααΌαααΆααα ααΆα‘αΎαααΈ LLVM IR ααααα·αααΆα αα·ααα αα·ααααααΌααααΆαααΈααααααααΎαααΆαααααα½αααααΆαα ααΆαααααααΆαα· ααααΆαααααα·αααααααα QEMU ααΊαα·ααα αα·αααΈααΈαα ααΆα αΆααααΌα ααΆααΆαα ααΈαααααΆααΊααΆ bytecode α α»ααααα ααααααΆαααααΎααΆαα»ααααα... α αΎααααααΆααααααΆααααα»α ααααα·αααΎ-αααααΆαααα-αααααααα αα·αααααα·ααα»α!..
α αΎααααααΊααΆα ααα»αααα½αααααααααααα Binaryen ααΆααααααααα: ααΆα’αΆα ααα½ααααααα»αααααα·αααααααααααααααΆαα·αα αα·αα’αααΈαααααΉαααααΌαααΆααααααΆαα»ααα αααα»α WASM α ααα»ααααααΆααα’αΆα αααααΎαααΌαααΈααααΆα αααααααα»αααΌαααααΆα αα·αααΆαααααΆααααααΌααααΆααα½αααΆαααααα ααΆααΆααααααΎαααΆαα, αααα»αααΆααα·ααΆααα½α α αΎαααΆααΆααΆαααααααααααΆααααα»α WebAssembly αα ααΈααααα C/C ++ API αααααΆααααα½αα
TCG (αααΆαααΈααααααΎαααΌαααΌα )
αααΈααΈααΈ tcg_qemu_tb_exec
ααΆααΆααααααα
ααΆααΆαααααααααααααΆααααΆαααααααΆαααααα»αα
ααΎααααΈαααααααααααααΆαααααα TCG ααααΈαα
QEMU α’αααααααΌααααααΎααααα tcg/<ΠΈΠΌΡ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ>
(αααα»αααααΈβααα, tcg/binaryen
) α αΎαααΆααΆαα―αααΆαααΈαα tcg-target.h
ΠΈ tcg-target.inc.c
ΠΈ configure
. α’αααα’αΆα
ααΆααα―αααΆααααααααααα
ααΈααα ααα»ααααααΌα
αααα’αααα’αΆα
ααΆαααΆαααΈαααααααΆααααΈαααα αα½αααΆααΆααααΈαααΉαααααΌαααΆααα½ααααα
αΌααα
ααααααααΆαα½αα αα½αααΆα―αααΆαααααααΆααααααΆ (ααΆααααΌαααΆααα½ααααα
αΌααα
αααα»α tcg/tcg.h
α αΎαα―αααΆααααααΆααα½α
α αΎααα
αααα»αα―αααΆααααααααααα
αααα»ααα tcg
, accel
αα·ααα·αααααΉαααααα»ααααα) αα½αααα - ααααΆααααααΆααααααΆααααααααα
αααα»α tcg/tcg.c
ααα»ααααααΆααΆααα·αααα·α
αΌαααααΎαα»αααΆααα·αα·ααααααααααΆα
ααααααααα α α·αααααΆαααα»αααΉαα αααΆααααα αααΎααααααΎααΆααααΎαα’ααααααααα’α·αα’αααΈαααααααααΆααααΎαααΆα αααα»αααααΆααααα αααα "αααααααα’αΉα" ααα―αααΆαααΆααααΈααααααΈααΆαα’αα»αααααααααααΆαααααααα½ααααααααα ααααααα αΆαααααααααααααααα αααα»αααααααΆα’αΆααααΆαααααα
α―αααΆα tcg-target.h
ααΆαααΆααααααααΆα
αααααα
αααα»ααααααα #define
-sα
- ααΎααΆαααΆαα α»ααααααααα»ααααΆα αα·ααααΉαααα»ααααΆααα ααΎααααΆααααααααααααα (ααΎαααΆαα αααΎαααΆααααααΎαα ααααΆα α αααΎαααΆααααααΎαα ααααΆα - αααα½αααΊααααααα’αααΈα’αααΈαααααΉαααααΌαααΆααααααΎααα ααΆααΌααααααΆαααααα·αααααΆαααΆααα»αααααααααα·ααΈαα»αααααΆαα’ααΈαααΊαα·αααΎααααΆαααααααα "ααααα ααΆαααααα»α" ...)
- ααΆααααααΉαααααΆαααααΆααααααααΆαααΈαα αα ααΎ x86 αα·αααΌααααΈαααα αααα»α TCI ααΆαααααΆααα·αααααΌαααΆααααααΉαααΆααααααα ααα»αααααααα»αααΉαααΆαααα αααα»αααα·ααααααα’αΆααααααΌααα·ααααααΆααΆαααααΆαααΆααααααα ααα»ααααα ααα’α»ααα αα ααΆαααααααααααααΆααα Binaryen ααΌα αααααααα»αααΉααα·ααΆαααΆα 4 αα
- ααΆαααααΆαααΆαααααΎαα’αααΈααααααααα·ααΈααΆααααααα’αΆα αααααΎαααΆα - ααΎααα½ααααα αΌαα’αααΈααααααααΆααααααΎαααααΎααα αααα»α Binaryen α’αα»ααααΆαα±ααα§ααααααααααΎαααααΏαααααααααααααααα ααααα ααΆααΆααααααΆαααααααα½αααΆααααΆααα
- ααΎααα ααααα αΆαααααα ααααααααΆαααααααΆαα TLB αααααααΎαα»αααααααααααΆααααααα ααΆααα·αααΊααΆαα αααα»α QEMU α’αααΈααααααααΆαααΊααααααααα: αααααΈααΆααΆααα»αααΆααααα½ααααα’αα»ααααααΆααααα»α / α αΆαααααα·αααΈ MMU ααααα (ααΎααΎαααΉααα α―ααΆαααααααΆαααΆα₯α‘αΌαααα?) αα½ααααααααΆαα»αααααΆαααααααΆααααΆααααααααααααα½ααααααα»αααααααααΆαα ααΆααααααααα ααααΎαααΆααααααΆααααα½ααααααααααααααΆαααα αααα»ααααα»αααααΆαα αααα½αααΊααΆααΎα’αααΈαα ααΆα’α»α αααα·ααα αααα»ααα ααΆαααααααααααααααΌαααΆαααααΎαααΆαααααααααααααα·αααααΆααααα»ααααααααΆααααΌα αα·αααΏαααααΆααααααααΆ?
- αα
ααΈαααα’αααα’αΆα
αααααααααααααααααΆαα
α»αααααααααααΆαααααα»ααα»ααα½α α¬ααΈα ααΎαααΆαα α
TB ααΆαααααα»αααΆααα½α αα·ααααααΆααΆαααααΎαααΈαααΈααΌα
α
inline
- αα»αααΆαααΌα ααΆflush_icache_range
(ααα»ααααααααα·ααααααΆααααΈααααααΎααα)
α―αααΆα tcg-target.inc.c
ααΆααΆααα·αααΆαα ααΆααααααΆααΆαααα αααααΆα αα·αααΆααα»αααΆαα
αΆαααΆα
αααΆα
αααΎαα
- ααΆαα αΆααααααΎα αα½αααΆααααΆαααΉααααααΉαααΎααΆαααααΆααααα’αΆα ααααΎαααΆαααΎ operands ααΆαα½αα α ααααααααααα»αααΈαααααααΆαααααααα½αααα
- α’αα»ααααβαααβααα½αβααβααΆαααααΆαβααΌαβααβααΆααααα»αβαα½αβ
- α’αααααα’αΆα
ααΆαααα»αααΆααααα½ααα
ααΈααα α αΎαα’αααααα’αΆα
ααααΎαα»αααΆααα·αα·ααααααΈ
tcg/tcg.c
αααααΆαααααα½ααααα»αααααΆαα αααα»αααΆαααααΎαααΎααα»αααααΆαααααααΌα
ααΆααααααα αα
αααα»αααΆαααααααΌααααααα»ααααααααααααΆαα αααα»αααΆααααααα
ααα’α»αα
ααα½ααα½αα αααααΆα
αΆααααααΎα (αααααααΆααααΆαααα½ααα
αααα»αααααααα»ααα·αα 0xFFFFFFFF
ααααααααααααΆαααΆααα
αα
α»ααααααααααααΊαααα) ααα·αα αααΌαα»ααααααΆααααααΎα αα·ααααααααααααααααΆααααααΆααααα α»αα ααααΌαααααΆαααααααΆαααααΆαα 0xFFFFFFFF - n
αααααΆαααααα n
- α
ααα½ααα·αααααΆααα·α
αα½α
α αΎαααΆααααααααααΆααααΌαααΆαααααα·ααααα·ααΆααααα’ααααααααα ααΆααΎαα‘αΎα 1. αα
ααααααααΆααΆαααα 0xFFFFFFFE
ααΆαα
αααααααΆαααΎαα‘αΎα αααΌαα»αααααΌαααΆααααααΆαα»ααααα»αααΆααΆααα»αααΆα ααΆαα
αΌααα
αααα»α "αααααα·ααΈααΎαααααΎαααΆα" ααΌα
αα½α αααααΆαααααα·ααααα·ααΆαααααΈ tcg_qemu_tb_exec
α αΎααααΌαα»αααααΌαααΆαααα
ααααΈα’αααα
αα
αΆα QEMU α
ααΎααααΈααααααΆαααΏααα»ααΆα "ααΎα αααα ααΎααΆαααααΆααααααααααΆααα»ααααΆααααα»αααα‘ααααααααααΆαααααααΌαααααααααΌα αααΊ..."α ααααααΆαααΆααααα ααΆαα αα αΆαααΆαααα ααααΆααα ααααααααΆαα½αα ααΎαααΈααααα ααα ααΆααααΌαααΆααααααααααααα QEMU! αααα»αβααΆαβααΌαβαααβαααβαααααβααΆαβααααΆαβαααααΆαα (αααβααΊβααΆβααααα·α ) ααΆαβαα»αβαααβαααβααΆαβαα βααααααβαααβαα»αβααα ααα»ααααβααΆβαα·αβααΆαβαα½αβααα ααΆααα·ααααα»αααααΈααΆαααααααα»α QEMU αααα ααα’αααα αα αΆααα αααα αΆααααααΎα α αΎααααααααΌααααααΆααααααΎααα ααΈαααα αα ααααααααα·ααααααα’αΆααααα’αα αααααΌαααααΌαααΆααααα αα α αΎαααααααααΆααααΉαα αΆααααααΎαααααααα ααααααααααααΆα
αααααΆααααΈαα·ααααΆααΌα αααα»αααΆαααΉαααΆαααα·α
ααΆαα½αααααααααααααΆαα’αα»ααααΆαα±αααααα»ααα·ααααΆαααααΎααΆααααααα·α
ααααααΆαααααα»ααααααααααα’αααΈαα½ααα»ααα
ααΎααααα»αααααα·αααΆααααΆαααααααα
ααΎααΆαααααααΆααααααΌαα ααα»ααααααΎα’αααααΆααΆα’ααααααααααα·ααααααα’αΆααααααΎααααΈαααααα»αααΆααααααααα»ααα
αααααααα? ααΌα
αααα’αααα’αα·αααααα Emscripten ααααΆα αα
αααααααααα»ααα½ααααα αΆ αααα»αααΆααααααΌαααΌααααααααααα‘αααα
αααααα·ααΈααΎααα·α ααααα Mozilla Record-Replay αα
ααΎααΆ... ααΆααΌαα
αα
ααΈαααα
αααααα»αααΆαααΉαααΈααΏαααΆαααααα½αα αααααΆαααααα»αααΈαα½ααα α struct TranslationBlock
ααΆαα½αααΉαααΆααα·αααααΆααααααΆα ααΆααα
ααΆ... ααααΉαααααΌαα αΎα αα
αα»ααααα»αααΆαααααΆααα
αααα»αααααα»αα αααααΉαααΏαααα αααα»αααΆααααααα
α
α·ααααααααααΎααΎα
αααα (αααΆαα αα
ααΆαααααα) α αΎαααααΆαααααααα
αααααααααααα α αΎααααααααΆαααααααα
ααααα
struct TranslationBlock
αααααΎααααααΈααααΆαααααα½ααααα’αΆα
ααααααΆααααΆααααΆαααΏααα
ααααααααααΆαααααααΆααααΆαααααααααααΌαααΆααααααα‘αΎααα·α αα·ααααααΎαα’αααα
αα
αΆαα
ααΎα
αααααααααα
αααα α§ααΆα ααα α
ααα’α»ααααααΆαααα
αααα»αααα·ααααααα’αΆααααααΌα - ααααααΊααΆαααα BinaryenExpressionRef
αααααΊαα½αααααΎααααααααααα
αΆαααΆα
αααααΌαααΆααααΆααΈααα’ααααα
αααα»ααααα»αααΌαααααΆααααααΆααααααΎα αααααααΊααΆαααααααααααααΆααααΆαααααΆααααααΌααααΆα BBs αααααααΊααΆαααααααααααααΌααα
α ααΆααΆααααααΎαααΆαα, ααΆααααα»ααααααΆααααα
ααα½α
α αΎααααααΆαα Relooper αααα
αΆαααΆα
αααααΌαααααΆααααΆαααααααααα ααΎααααΈαααααΆαααα½αααΆ ααΆαααααααααααΌαααΆαααααΎααΆαα½αααΆααΆααα’ααααααΌαααΆααααααΉαααααααΆαα αα
ααΆαααα½ααα ααΌα
ααααα’αααα’αΆα
ααααΎαααΈαααΈααααΆααα·α
αααα»ααααααΆααααααΆαααααα»ααααα·ααΆα α’αααααααΆααααα
αΆαααΆααααΌαααααΆα
ααααααα·αααΎα
αΆαααΆα
αα ααααα·ααΈααα ααααΆαααααααααααΌαααΆαααααΎαα½α
α αΎααα
αααα»α QEMU ααΎααααΈαααα αΆαααΈα ααα»αααααααΆααααΆαα
αΆαα
ααααΈααααα·ααα»α TCG α
ααΆαααααΎααααΆαα Binaryen
αααΌαα»ααα αααα»α WebAssembly ααΆααα»αααΆα αααααΈαα½ααααΆααα½ αααααΆααααααα ααααααβααΊβααΆβααααα·ααααα·ααΆα unary αα·α binary αααα»αβαααβααΆαβαααααΈβααααααβαααααβααα ααα αΌαβααααα»βαααααΆααα ααΌα ααααααα»αααΆααα·ααΆααα½α ααα αΎα ααα αΌαααΆαααααααααααα ααΈαααααααΌαααΆααααα ααααΆαααΆααααΆααααΌα ααΆααΆααΆααααα·αααααα ααααα·ααα»α ααΆαα α αα»αααΆαααΆααΎαα α’αΆαα»αααααβαα βαα»αααΆαβαα·αβααααΌαβααΆαβαααααΌαβαα βααΎβαααβαααβαα ααα»ααααβα αααΆααβααΆαα ααΌα βααΆβαα βαααα»α JS αααα ααΆααααΆαα’ααααααααα ααα»αααααααα»ααα·αααΆαααααΎααΆαα ααΌα αααααααα»αααΉααα·αααααΆααα’αααα’αααΈαα½αααΆααα
α’αα»ααααβααβααΆαβα’αααβααΌαααααΆαβαααβααΆαβαααβααΈβααΌαααβααβααααααα int32 / int64 / float / double α αααα»αααααΈααα α’ααα n ααΌαααααΆαααααΌαααΊααΆα’αΆαα»ααααααααααΆααααααΌααα α’αα»ααααα ααΌαα αααΆαααΆ αααααΈααΆα’αααΈααα ααΈααααα·αααΆαααααα·αααΆαααΆαααααα»ααα αααα»αααααααααααααα αΌαααΆααααααααααααααα α ααα½αααααα αααα·αα’αα»αααααα»ααααααα "α α»αα αααααααΆ/αα·αααΆαα α»αα αααααααΆ"α ααααααααααααΆαα₯αα·ααΆααα’αΆαααααααΎαααααΌαααααα·ααααα·ααΆαα
αα·ααΆαααΆααΌαα
Binaryen ααααα
ααααααΆαααΆααααα ααααα·αααΎα’αααα ααααααααΆαααΌαααααΆααααααα·αα αΆαααΆα ααααααΎα αα·ααα»αα§ααΆα αααα’ααααααααα ααΆααα ααα»αααααα»αααΆαααΆαααααααα·ααααΆααααα αααα»αα―αααΆα C++ α αΎαααΈααΈααααααααααΆααααααααααα C++ API ααΆααααΌααααααααΆααα ααααααααα½α ααΆαα- ααΆαααααΎαα»αα
ααΌα ααααααΎααααΈαααααΎαααΌααααα’αααααααΌαααΆα
// Π½Π°ΡΡΡΠΎΠΈΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ (ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ ΠΏΠΎΡΠΎΠΌ)
BinaryenSetAPITracing(0);
BinaryenSetOptimizeLevel(3);
BinaryenSetShrinkLevel(2);
// ΡΠΎΠ·Π΄Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ
BinaryenModuleRef MODULE = BinaryenModuleCreate();
// ΠΎΠΏΠΈΡΠ°ΡΡ ΡΠΈΠΏΡ ΡΡΠ½ΠΊΡΠΈΠΉ (ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΡ
, ΡΠ°ΠΊ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ
)
helper_type BinaryenAddFunctionType(MODULE, "helper-func", BinaryenTypeInt32(), int32_helper_args, ARRAY_SIZE(int32_helper_args));
// (int23_helper_args ΠΏΡΠΈΠΎΠ±^WΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ)
// ΡΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΏΠ΅Ρ-ΠΌΠ΅Π³Π° Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
// ... Π½Ρ ΡΡΡ ΡΠΆ Π²Ρ ΠΊΠ°ΠΊ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠ°ΠΌΠΈ :)
// ΠΏΠΎΡΠΎΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ
BinaryenAddFunction(MODULE, "tb_fun", tb_func_type, func_locals, FUNC_LOCALS_COUNT, expr);
BinaryenAddFunctionExport(MODULE, "tb_fun", "tb_fun");
...
BinaryenSetMemory(MODULE, (1 << 15) - 1, -1, NULL, NULL, NULL, NULL, NULL, 0, 0);
BinaryenAddMemoryImport(MODULE, NULL, "env", "memory", 0);
BinaryenAddTableImport(MODULE, NULL, "env", "tb_funcs");
// Π·Π°ΠΏΡΠΎΡΠΈΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ
assert (BinaryenModuleValidate(MODULE));
BinaryenModuleOptimize(MODULE);
... ααΎαααα»αααααα α’αααΈαα½α ααΌαα’αααααα αααααααΆααααααΆααΆααααα αΆαααααΆαααα»ααααα α αΎαααααααΆααααα’α·αααΆααα αααα»αα―αααΆαα
α αΎαα₯α‘αΌαααα crack-fex-pex α αΆααααααΎα, α’αααΈαα½αααΌα ααα:
static char buf[1 << 20];
BinaryenModuleOptimize(MODULE);
BinaryenSetMemory(MODULE, 0, -1, NULL, NULL, NULL, NULL, NULL, 0, 0);
int sz = BinaryenModuleWrite(MODULE, buf, sizeof(buf));
BinaryenModuleDispose(MODULE);
EM_ASM({
var module = new WebAssembly.Module(new Uint8Array(wasmMemory.buffer, $0, $1));
var fptr = $2;
var instance = new WebAssembly.Instance(module, {
'env': {
'memory': wasmMemory,
// ...
}
);
// ΠΈ Π²ΠΎΡ ΡΠΆΠ΅ Ρ Π²Π°Ρ Π΅ΡΡΡ instance!
}, buf, sz);
ααΎααααΈααααΆαααα·ααααααα QEMU αα·α JS α αΎααααα»αααααααα½αα’αΆα
α
αΌαααααΎαα»αααΆααααααΆαα
αααααααΆααααΆαααΆαααα αα α’αΆαααα½αααααΌαααΆααααααΎαα‘αΎα (ααΆααΆααα»αααΆααααααΆαααααα
αΌααα
αααα»α launcher) α αΎααα»αααΆααααααΆααααααΎαααααΌαααΆαααΆαααα
ααΈαααα ααΎααααΈααααΆαα·αα·αααααααΆαααΆαααα αα αα·αα·αααααααααα»αααααααααΆαααααΌαααααααΌαααΆαααααΎααααΆααααααΌαααΆααΆ ααα»αααααααααΆαααααα·αα·αααααααααΆαααααΆαααααααΎααΌααααααααααΆαα
αΆααααααΎααααα
ααΉαααΆααα
αααα»α struct TranslationBlock
.
ααααα·ααΈααα,
αααα αΎαααΆααΆααα’αααααααΆααααααααα αααα ααααΆααΉαααΆαα’ααααααα½ααααααααα·αααΎα’αααααΆααααΆααα αΆααα’αΆααααααα αααααΊαααΆαα αα ααΆαααα ααα ααααα»ααααα ααααΎα±ααα§ααααααααα»αααααΎαααΆαα ααΆαααααα ααααΆααα ααα»ααααααααααα»αααΆαααααΎα±ααααΆαα ααααααααααΌαα»α WebAssembly ααΆαααΆαα’ααααΆα ααΌα αααααΆαααα αααα»ααα·αα JS α αΆααααΆααααΈαα ααααΆαα’ααααααααααααα’αΆα ααααΎα’αααΈαααΆααα’αααααααΆααα αΌαααααααΌαα»αααΎααα½α ααΆααα
ααΆβα α»αβαααααβααΆαβααΆαβαααβα ααα‘αβαα½αβ: α’αααααΆαα ααααααααααααααααααΈααα ααΎααααΆαααααααα 32 αααΈα ααα»ααααααΌαααΆααααααααα·ααααα·ααΆαα’αααα αα αΆα α‘αΎαααΈ Binaryen ααααααααΆαα½ααα ααΎααα α¬αααααααααααααααα αααααααΆαααΎ 2 GB ααααα αα’αΆααααααΆα 32 αααΈαα αααα αΆααΊααΆααΆααααααααααα Binaryen ααααααα»αα αΌαααααΎα’αΆααααααΆααααααααααααα ααΎααααΎααΌα ααααα ααΎααααΈααα½αααΆααα αα»ααα·αααα?
ααΆααα·ααΈααααadmin
αααα»ααα·αααΆααααα ααααΆαααΆαααααααααα ααα»αααααααα·αααααΌααααααααα»αααΊ "α α»αααΎαααα»αααα‘αΎαααΈαα»α 32 αααΈα?" αααααΆαααααααααααΆαααΎααααα αα’αΆααααααΆαααΉαααααΌαααΆαααΆααααΆαααααααΊαααα αααα½ααααα½ααααααΊααΆααΎα ααα½αααα»ααααΆαααΉαααααΌαααΆαααΆααααΆαα: 1 α¬ 2 Gb α
αα αααα»ααα·ααΈααααα’αααααααααααααα·ααΈ (αααααΎααααααΆααα’αααα’αα»αααα)
ααααααα»αααα»ααα½ααα αααααααΆαααΎααααααααα’αΆααααααΆαα αααα»αβααααΆααβαα·αβαααβααΆβα ααα»βα’αααΈβααΆαβααΆβααΆβααααΎβααΆα - αα βααΈαααβ αα½α αα α αΎα ααααΌαααααΆαααααα½αα ααα»αααα "ααΎαααΆα’αααα’αα»ααααα α’αααΈαααααΎαααΆααααααΆααααΎα ααα»ααααααααΆαααααΆααααΆααααΉαααΈααΌαα ααα»..."
// 2gbubble.c
// Usage: LD_PRELOAD=2gbubble.so <program>
#include <sys/mman.h>
#include <assert.h>
void __attribute__((constructor)) constr(void)
{
assert(MAP_FAILED != mmap(1u >> 31, (1u >> 31) - (1u >> 20), PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
}
... ααΆβααΆβααΆαβαα·αβαααβααΆβαα·αβααααΌαβααααΆβααΆαα½α Valgrind ααα»ααααβααΆβααααΆαβααα’ Valgrind αααα½αβααΆβααΆαβαααα»αβα’αααβααΆααβααααΆβα ααβααΈβααΈαααβαααΆαβααΆαβααααα·αααααΆα :)
αααα ααβααΆβααΆαβααααΆβααααΆααβααΉαβαααααβααΆαβααααααβααΆααβααβαααααΎαβα’αααΈβααααβαααβααΌαβααααβαααα»αβαααβααααΎαααΆα...
ααααα: www.habr.com