ืคืขื ืืืืืชื ืืฉืืื ืืืืฃ ืืืืืื ืืช ืืคืืืืช ืืชืืืื ืืืื ืืืฆื ืืืฆืืจ JavaScript (ืืืชืจ ืืืืง, Asm.js) ืืงืื ืืืื ื. QEMU ื ืืืจ ืื ืืกืื, ืืืขืืืจ ืืื ืื ื ืืชื ืืืืจ ืขื Habr. ืืืขืจืืช ืืืืืฆื ืื ืืขืฉืืช ืืืืฉ ืืช ืืคืจืืืงื ื-WebAssembly, ืืืคืืื ืืคืจืืฉ ืืขืฆืื ืืืขื ืกืืืืชื ืืืืฉืื ืื ืจืฆืืชื ืืช ืืคืจืืืงื... ืืขืืืื ื ืืฉืื, ืืื ืืื ืืืื, ืืขืืฉืื, ืืืืจืื ื ืืืคืืขื ืืืชืื ืืืื
ืืฉืืืืช
ืืืืืื ืฉืืืจ ืืืืชื ืืื "ืืืืฉืื" ืืืขืืืจ QEMU ื-JavaScript, ืืคืขื ืืืืื ืืขืฉืืช ืืืช ืืืืืื ืืื ืืืืืจ ืขื ืืขืืืืช ืืฉื ืืช.
ืฉืืืื ืืกืคืจ ืืืช: ืืกืชืขืฃ ืืฉืืจืืจ ื ืงืืื
ืืืขืืช ืืจืืฉืื ื ืฉืื ืืืืชื ืืืืง ืืช ืืืจืกื ืฉืื ืืืจืกื 2.4.1 ืืืขืื ืืืจื. ืืื ืื ื ืจืื ืื ืจืขืืื ืืื: ืื ืงืืื ืฉืืจืืจ ื ืงืืืชื, ืื ืืื ืื ืจืื ืืฆืื ืืืชืจ ื-2.4 ืคืฉืื, ืืขืื ืืืชืจ ืืขื ืฃ master
. ืืืืืืื ืฉืชืื ื ืชื ืืืืกืืฃ ืืืืช ื ืืืื ืฉื ืืืืื ืืฉืื, ืื ืืืืชื ืฆืจืื ืืืื ืฉื ืืฃ ืืื ืืืจ. ืื ืจืื ืฉืื ืื ืืฆื. ืืื ืื ืืขื ืืื: QEMU ืื ืขืืื ืืืงืื, ืืืฉืื ืืกืืื ืื ืืคืืื ืืืจืืื ืขื ืืืคืืืืืืฆืื ืฉื ืืงืื ืฉื ืืฆืจ ื-10 ืืืื. "ืื, ืขืืฉืื ืื ื ืืืื ืืืงืคืื", ืืฉืืชื ืื ืฉืืจืชื. ืืื ืื ืื ื ืฆืจืืืื ืืขืฉืืช ืกืืืื: ืืฉื ืืืืคื ืืื-ืคืชืื ืฉื QEMU.js ืืืขืืืื ืฉื-QEMU ืืืงืืจื ืืื ื ืืจืื ืขื ืืืขืืจ ืจืืืื-ืฉืจืฉืืจืื (ืืืืืจ, ืืืืืืช ืืืคืขืื ืื-ืืื ืืช ืืกืคืจ ื ืชืืื ืงืื ืื ืงืฉืืจืื, ืืื ืื ืจืง "ืืฉืชืืฉ ืืื ืืืจืขืื ืื") ืืื ืงืจืืื ืขืืืจื, ืืคืื ืงืฆืืืช ืืขืืงืจืืืช ืฉื ืฉืจืฉืืจืื ืืืืชื ืฆืจืื "ืืืคืื ืืช ืื" ืืื ืืืืืช ืืกืืื ืืืชืงืฉืจ ืืืืืฅ. ืื ืืฆืจ ืืื ืืขืืืช ืืืขืืืช ืืืืื ืืืืืื. ืขื ืืืช, ืืขืืืื ืฉืืืง ืืืฉืื ืืืื ืืืกื ืืฃ master
, ืฉืืืชื ื ืืกืืชื ืืืื ืืช ืืงืื ืฉืื, ืื ื ืืืจื ืืืืืื ืืฉืืจืืจ ืื ืงืืืืช (ืืืื ืืกื ืืฃ ืฉืื) ืื ืื ืจืื ืื ืืื ืืืกืืคืื ื ืืืืช.
ืืืืคื ืืืื, ืืืืืชื ืฉืขืืืื ืืืืื ื ืืืจืืง ืืช ืื ืืืืคืืก, ืืคืจืง ืืืชื ืืืืงืื ืืืื ืืช ืืจืกื ืืืฉื ืืืคืก ืืืืืกืกืช ืขื ืืฉืื ืจืขื ื ืืืชืจ ืืขืืฉืื ื- master
.
ืืขืืช ืืกืคืจ ืฉืชืืื: ืืชืืืืืืืืืช TLP
ืืขืืงืจื ืฉื ืืืจ, ืื ืื ืืขืืช, ืืืืคื ืืืื, ืื ืจืง ืชืืื ื ืฉื ืืฆืืจืช ืคืจืืืงื ืืชื ืืื ืฉื ืื ืืื ื ืืืืืืช ืฉื "ืืื ืืืื ืืขืืืจ?" ืืืืืคื ืืืื "ืืื ื ืืืข ืืฉื?" ืืชื ืืื ืืืื ืชืื ืืช ืืืืฉื ืืืืชื ืืคืฉืจืืช ืืืฆืืงืช, ืืื, ืืืืคื ืืืขื, ืื ืจืฆืืชื ืืืืืจ ืขืืื ืฉืื ืืฆืืจื. ืืคืขื ืจืฆืืชื ืืขืฉืืช ืืช ืื ืืืืืื: ืืืืืืืช ืืืืืืืช, ืฉืื ืืืื ืืงืื ืืืืข (ืืื "ืืืจืืืช ืชืืืื ืืงืจืืืื ืขื ืืืืืืจ (ืขื ืืืืจืืช)", ืืคื ืฉืืืจ ืคืขื ืืื ืืก ืืืจืืืืืืก ืขื ืืืฉืื, ืืคื ืืืงืืฆืืืื) ืืื'.
ืืขืืช ืืกืคืจ ืฉืืืฉ: ืืืืื ืก ืืืื ืืื ืืืืืจ ืืช ืืคืืจ
ืขืืืื ืื ื ืคืืจืชื ืืื ืืืืจื, ืืื ืขืืฉืื ืืืืืชื ืืืื ืื ืืืืช ืืืจื ืฉื ืืืชื ืืืืช ืืงืื ื ืืืืชืจ, ืืืขืฉืืช ืืช ืื "ืืืืืืจ", ืืืืืจ ืืืชืื ืืช ื-TCG ืืืืืจื ืฉืื ืืืคืก, ืืื ืื ืฆืจืื ืืืืจ ืืืืืจ ืืืชืจ, "ืื, ืื ืืืืื, ืืื, ืืื ืื ื ืื ืืืื ืืฉืืื ืขื ืืื - ืืื ืืชืื TCI..." ืืชืจ ืขื ืื, ืื ื ืจืื ืืืชืืื ืืื ืคืชืจืื ืืจืืจ, ืฉืื ืื ื ืืืืฆืจ ืงืื ืืื ืืจื. ืืื ืฉืืืืจืื, "ืื ื ืืชืืกืคืั, ืืื ืื ืืืื": ืืงืื ืืื, ืืืืื, ืืื ืืจื, ืืื ืื ืืคืฉืจ ืืืขืืืจ ืืืื ืฉืืืื ืคืฉืื - ืืฉ ืืืืืฃ ืืืชื ืืืคืืจืฉ ืืืคืืคื ืืฆืืจื ืืืืืจ, ืืืชืืฆืื ืืื ืืืืืืงื ืืกืืื ืืขืืื JS, ืฉืขืืืื ืฆืจืื ืืืืฉืืจ ืืืคืฉืื. ืขื ืืืช, ืืืจืืืืงืืืจืืช RISC ืจืืืืืช, ืืืืื ืืื ืชื, ืืฆื ืืืคืืกื ืืื ืืฆืืจื ืืืคืก ืืืคืืจืฉ ืืช ืืืืื ืืืืจืืืช ืขืืืจ ืงืื ืืฉืืืืจ - ืื ืื ืื ืื ืฉืื ืื ื ืฆืจืืืื, ืื ืืื ืืงืจื, ืื ืงืจืื. ืื ืืกืฃ, ืืื ืืกืืื ืืืืจืื ืฉืื, ืืืืชื ืฉืืฉืืืื ืื ืืืขืืจืช ืืืืฆืข ืืืืง ืืชืจืืื, ืื ืื ืื ื ืื ืืืืช ืฆืจืืืื ืงืื ืืืื ืฉืืคืืจืฉ ืืื ืืืคืกื, ืืื ืื ื ืืืืืื ืคืฉืื ืืืฆืืจ ืืืชื ืืืคืื ืงืฆืื ื-TB .
ืื ืืื ืืืขืื
ืืืจืืช ืฉืืชืืืชื ืืฉืืชื ืืช ืืงืื ืืืืื, ืืขืืืช ืงืกื ืืชืื ืื ืืื ืืฉืื ืื: ืืืจื ืืื ืืืชืืื ื-GitHub ืืืืขืื ืืืชืจืืืช ืืืื ืชืืืืืช ืืืขืืืช ืืืืงืฉืืช ืืฉืืื, ืืื ืืื, ืคึผึดืชึฐืืึนื ืืืืืืจ ืืฉืจืฉืืจ
ืืืจ ืื ืืื ืขืื
- ืืฉืงืช ืืฉืื ืืื ืืื ืืื ืืชืงื ื ืืื
- ืืืจืืืืืืืฆืื ื-iOS, ืฉืื, ืืคื ืืฉืืืขืืช, ืืืคืืืงืฆืื ืืืืืื ืฉืืฉ ืื ืืช ืืืืืช ืืืฆืืจ ืงืื ืชืื ืืื ืชื ืืขื ืืื ืื ืืข JS (ืืื ืื ื ืืื?)
- ืืืืื ืฉื ืืื ื ืืขืจืืช ืืคืขืื - ืชืงืืื ืืืื, ืืืื ื, ืื ืกืืื ืืงืืฉืื ืืื'...
ืชืืื ืืช ืืื ืจืืฆื ืฉื ืืคืืคื
ืืคื ืฉืืืจ ืืืจืชื, QEMU ืงืฉืืจ ื-multithreading, ืืื ืืืคืืคื ืืื ืืช ืื. ืืืื, ืืืืืจ, ืื... ืืืชืืื ืื ืื ืืื ืงืืื ืืืื, ืืื ืืืคืืขื WebWorkers - ืืืืื ืืื ืชื, ืื ืจืืืื ืืฉืจืฉืืจืื ืืืืืกืกืื ืขื ืืขืืจืช ืืืืขืืช ืืื ืืฉืชื ืื ืืฉืืชืคืื. ืืืืคื ืืืขื, ืื ืืืฆืจ ืืขืืืช ืืฉืืขืืชืืืช ืืขืช ืืขืืจืช ืงืื ืงืืื ืขื ืืกืืก ืืืื ืืืืืจืื ืืืฉืืชืฃ. ืืืจ ืื, ืืืืฅ ืฆืืืืจื, ืืื ืืืฉื ืื ืืฉื SharedArrayBuffers
. ืื ืืืฆื ืืืืจืื, ืื ืืืื ืืช ืืืฉืงื ืฉืื ืืืคืืคื ืื ืฉืื ืื, ืืืจ ืื ืืืื ืืช ืืฉื ื ืืืืฉื, ืืืืจ ืื Meltdown... ืืืืจ ืืื ืืืืขื ืืืกืงื ื ืฉืืก ืื ืืก ืืช ืืืืืช ืืืื, ืืื ืืขืืจืช ืืืืจืื ืืฉืืชืฃ ื- ืืื ืืืืื ืืช ืืืื ื, ืืื ืืืชื ืืืจ
ืืชืืื ื ืืฉื ืืื ืืื ืืืกืจ ืืืคืฉืจืืช ืฉื ืื ืืคืืืฆืืืช ืืจืื ื ืืืื ืขื ืืขืจืืื: ืืชื ืื ืืืื ืคืฉืื ืืงืืช, ืืฉืืืจ ืืช ืืืงืฉืจ ืื ืืืื ืืืขืืืจ ืืืงืฉืจ ืืืฉ ืขื ืืืกื ืืช ืืืฉื. ืืืกื ืืช ืืฉืืืืช ืื ืืืืช ืขื ืืื ืืืืื ื ืืืืจืืืืืืช JS. ื ืจืื, ืื ืืืขืื, ืืืืืื ืฉืืื ืืืช ืืืืื ื ืื ืื ืืช ืืืจืืื ืืงืืืืื ืืืืคื ืืื ื ืืืืืืื? ืืขืืืื ืืื ืฉืืืืง I/O ื-QEMU ืืืืฉื ืืืืฆืขืืช ืงืืจืืืื ืื, ืืืื ืื ืืคืืืฆืืืช ืืืกื ืืืช ืืจืื ื ืืืื ืืืื ืฉืืืืฉืืืช. ืืืจืื ืืืื, Emscipten ืืืจ ืืืื ืื ืื ืื ืืคืขืืืืช ืืกืื ืืจืื ืืืช, ืืคืืื ืฉื ืืื:
ืืจืืข ืขืื ืื ืืฆืืืชื ืืคืฆื ืืช ืืงืื ืืืื ืฉืงืืืคืืื ื-WASM ืืคืืจืฉ ืืืืฆืขืืช Emterpreter, ืื ืฉืืืฉืืจื ืืืืง ืขืืืื ืื ืขืืืืื (ืจืื ืืกืืจื ืืืื, ืืื ืฉืืืืจืื...). ืืืืืจ, ืืกืืคื ืฉื ืืืจ ืืชื ืืืืจ ืืงืื ืืฉืื ืืื ืืืืจ ืืฉืืืชื ืืืฆืืืง ืืื:
- ืืืืง I/O ืืคืืจืฉ. ืืืื, ืืื ืืืืช ืฆืืคืืช ื-NVMe ืืืืืง ืขื ืืืฆืืขืื ืืงืืจืืื? ๐
- ืงืื QEMU ืจืืฉื ืืขื ืงืืืคืืืฆืื ืกืืืืช (ืืชืจืื, ืืืฉืืจื ืืืืืฆืื ืืืจืื ืืื')
- ืงืื ืืืจื ืฉืืืจืื ืืืืคื ืืื ืื ื-WASM
ืชืืื ืืช ืฉื ืืงืืจืืช QEMU
ืืคื ืฉืืื ืืืจ ื ืืืฉืชื, ืืงืื ืืืืงืื ืืจืืืืงืืืจืืช ืืืจืืื ืืืงืื ืืืคืงืช ืืืจืืืช ืืืื ื ืืืจื ืืืคืจืืื ื-QEMU. ืืืขืฉื, ืื ืืคืืื ืงืฆืช ืืืชืจ ืืกืืื:
- ืืฉ ืืจืืืืงืืืจืืช ืืืจืืื
- ืืฉ ืืืืฆืื, ืืืืืจ, KVM ืืืืืจืืืืืืืฆืื ืฉื ืืืืจื ืืืื ืืงืก (ืขืืืจ ืืขืจืืืช ืืืจืืืช ืืืืจืืืช ืืชืืืืืช ืื ืืช ืื), TCG ืืืฆืืจืช ืงืื JIT ืืื ืืงืื. ืืื ื-QEMU 2.9, ืืืคืืขื ืชืืืื ืืชืงื ืืืืืจืืืืืืืฆืื ืฉื ืืืืืจื HAXM ื-Windows (
ืืช ืืคืจืืื ) - ืื ื ืขืฉื ืฉืืืืฉ ื-TCG ืืื ืืืืืจืืืืืืืฆืื ืฉื ืืืืจื, ืื ืืฉ ืื ืชืืืื ื ืคืจืืช ืืืฆืืจืช ืงืื ืขืืืจ ืื ืืจืืืืงืืืจืช ืืืจื, ืืื ืื ืขืืืจ ืืืชืืจืืื ืืืื ืืืจืกืื
- ... ืืืกืืื ืืื ืื - ืฆืืื ืืืงืคื ืืืืื, ืืืฉืง ืืฉืชืืฉ, ืืืืจื, ืฉืืืืจ ืืืืจ ืืื'.
ืืื, ืืืขืช: QEMU ืืืื ืืืงืืช ืื ืจืง ืืช ืืืืฉื ืืืื, ืืื ืื ืืช ืืืขืื ืขืืืจ ืชืืืื ืืฉืชืืฉ ื ืคืจื ืืืืืช ืืืืจื, ืืืฉืืฉ, ืืืฉื, ืืช Fuzzer AFL ืขืืืจ ืืืฉืืจ ืืื ืืจื. ืืืื ืืืฉืื ืืจืฆื ืืืขืืืจ ืืช ืืืคื ืืคืขืืื ืืื ืฉื QEMU ื-JS? ๐
ืืื ืจืื ืืชืืื ืืช ืืืื ืืืืช ืืืืชืืงืืช, QEMU ื ืื ืืช ืืืืฆืขืืช ืืฉืืื configure
ะธ make
. ื ื ืื ืฉืืชื ืืืืื ืืืืกืืฃ ืืฉืื: ืงืฆื ืืืืจื ืฉื TCG, ืืืฉืื ืฉืจืฉืืจ, ืืฉืื ืืืจ. ืื ืชืืืจื ืืืืืช ืฉืืืื/ืืืืขืฉืื (ืืืืฉืืช ืืืชืื) ืืืกืืืื ืืชืงืฉืจ ืขื Autoconf - ืืืขืฉื, configure
ื-QEMU's ืื ืจืื ื ืืชื ืืขืฆืื ืืืื ื ื ืืฆืจ ืืืืื.
WebAssembly
ืื ืื ืื ืืืืจ ืืื ืฉื ืงืจื WebAssembly (aka WASM)? ืืื ืชืืืืฃ ื-Asm.js, ืฉืืื ื ืืชืืืืจ ืขืื ืืืืืช ืงืื JavaScript ืืืงื. ืืืืคื, ืืื ืืื ืืจื ืืืืืื ืืืื, ืืืคืืื ืืชืืืช ืืกืคืจ ืฉืื ืืชืืื ืืื ืื ืคืฉืืื ืืืืืื: ืืฉืืื ืืงืืืคืงืืืืช, ืืื ืืืืืกื ืืคืืจืื
ืืืื ืฉืืขืชื ืขื ืืืืืจืืชื ื-relooping ืขืืืจ Asm.js - ืืื ืฉืืืืจ ืฉื ืืืจืืืช ืืงืจืช ืืจืืื "ืืจืื ืืืืื" (ืืืืืจ, ืื-ืื-ืืืจ, ืืืืืืช ืืื'), ืฉืขืืืจื ืืืืขืืื ืื ืืขื JS, ื- ื-LLVM IR ืืจืื ื ืืืื, ืงืจืื ืืืชืจ ืืงืื ืืืืื ื ืฉืืืืฆืข ืขื ืืื ืืืขืื. ืืืืข ืืืืจืื, ืืืฆืื ืืืื ืืื ืฉื QEMU ืงืจืื ืืืชืจ ืืฉื ื. ื ืจืื ืฉืื ื ืื, bytecode, ืกืืฃ ืืืืกืืจืื... ืืื ืืฉ ืืืืงืื, ืื-ืื-ืืืจ ืืืืืืืช!..
ืืื ืกืืื ื ืืกืคืช ืืื ืฉ-Binaryen ืฉืืืืฉื: ืืืืคื ืืืขื ืืื ืืืื ืืงืื ืืืืงืื ืืจืื ืืืืื ืืงืจืืืื ืืื ืฉืืื ืืืืืกื ื-WASM. ืืื ืืื ืืืื ืื ืืืืฆืจ ืงืื ืืืจืฃ ืฉื ืืืืงืื ืืกืืกืืื ืืืขืืจืื ืืื ืืื. ืืืื, ืืืจ ืืืจืชื ืฉืืื ืืกืชืืจ ืืช ืคืืจืื ืืืืกืื ืฉื WebAssembly ืืืืืจื ื-API ืื ืื ืฉื C/C++.
TCG (ืืืืื ืงืื ืืขืืจ)
TCG tcg_qemu_tb_exec
, ืืชืืจืจ ืฉืื ืืืื ืฉืืืืฉื ืขืืืจื.
ืืื ืืืืกืืฃ TCG backend ืืืฉ ื-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
, ืืืืื, ืืื ืืืจื ืืื ืืจืื ืืืชืจ ืืืืืื ืืืืื ืืกืคืจ ืคืื ืงืฆืืืช ืืืื:
- ืืชืืื, ืืืื ืืืืืืช ืขื ืืืื ืืืจืืืช ืืืืืืช ืืคืขืื ืขื ืืืื ืืืคืจื ืืื. ืืืขืชืง ืขื ืืื ืืืืคื ืืืื ืืงืฆื ืืืืจื ืืืจ
- ืคืื ืงืฆืื ืฉืืืงืืช ืืืจืืช ืงืื ืืชืื ืคื ืืืืช ืืืช
- ืืชื ืืืื ืื ืืฉืื ืืื ืคืื ืงืฆืืืช ืขืืจ, ืืืคืฉืจ ืื ืืืฉืชืืฉ ืืคืื ืงืฆืืืช ืกืืืืืช ื
tcg/tcg.c
ืืขืฆืื ืืืจืชื ืืืกืืจืืืื ืืืื: ืืืืืื ืืจืืฉืื ืืช ืฉื ืืืืง ืืชืจืืื ืืื, ืจืฉืืชื ืืจืืขื ืืฆืืืขืื: ืกืืื ืืชืืื (ืขืจื ืืกืืื ืืกืืืื 0xFFFFFFFF
, ืฉืงืืข ืืช ืืืฆื ืื ืืืื ืฉื ื-TB), ืืืงืฉืจ, ืืืืืื ืฉื ืืฆืจ ืืืกืคืจ ืงืกื ืืืืคืื ืืืืื. ืืืชืืื ืืกืืื ืืืื ืก ืคื ืืื 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 ืืืืืื ืคืื ืงืฆืืืช ืฉืื ืืืช ืืื ืืืืื ืืืฃ, ืฉืืื ืืืืื. ืืืืืืื ืื ืคืขืืืืช ืืื ืืจืืืช ืืืื ืืจืืืช, ืืืืงืื ืืืืจืืืื ืืจืฉืืืืช ืฉื ืืืืืืื ืืืจืื, ืืจืืืช ืืงืจื ืืื'. ืืคื ืฉืืืจ ืืืจืชื, ืืจืืืช ืืืงืจื ืืื ืืืืจืื ืช ืืืืืง ืืื ืขื ืคืื ืืจืื ืืืืื, ืืืืืืช, ืงืจืืืืช ืคืื ืงืฆืืืช ืืื'. ืืืขืื ืื ืืคืื ืงืฆืืืช ืื ืืืขืืจืื ืืขืจืืื, ืืื ืืืคืืจืฉ, ืืืืืง ืืื ื-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 ืืืืืจ ืืืืฉื ืืืชืืืช ืืืืื ืืื. ืืื ืืขืงืืฃ ืืช ืื?
ืืืจื ืฉื ืื ืื
ืืกืืคื ืฉื ืืืจ ืื ืืืงืชื ืืช ืื, ืืื ืืืืฉืื ืืจืืฉืื ื ืฉืื ืืืืชื "ืื ืื ืืชืงื ืชื 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));
}
... ืื ื ืืื ืฉืื ืื ืชืืื ื-Valgriind, ืืื, ืืืจืื ืืืื, ืืืืจืื ื ืขืฆืื ืืืืฃ ืืช ืืืื ืืืขืืืืช ืจืื ืืฉื :)
ืืืื ืืืฉืื ืืืชื ืืกืืจ ืืื ืืืชืจ ืืื ืืงืื ืืื ืฉืื ืขืืื...
ืืงืืจ: www.habr.com