QEMU.js: ืขื›ืฉื™ื• ืจืฆื™ื ื™ ื•ืขื WASM

ืคืขื ื”ื—ืœื˜ืชื™ ื‘ืฉื‘ื™ืœ ื”ื›ื™ืฃ ืœื”ื•ื›ื™ื— ืืช ื”ืคื™ื›ื•ืช ื”ืชื”ืœื™ืš ื•ืœืžื“ ื›ื™ืฆื“ ืœื™ืฆื•ืจ JavaScript (ืœื™ืชืจ ื“ื™ื•ืง, Asm.js) ืžืงื•ื“ ืžื›ื•ื ื”. QEMU ื ื‘ื—ืจ ืœื ื™ืกื•ื™, ื•ื›ืขื‘ื•ืจ ื–ืžืŸ ืžื” ื ื›ืชื‘ ืžืืžืจ ืขืœ Habr. ื‘ื”ืขืจื•ืช ื”ืžืœื™ืฆื• ืœื™ ืœืขืฉื•ืช ืžื—ื“ืฉ ืืช ื”ืคืจื•ื™ืงื˜ ื‘-WebAssembly, ื•ืืคื™ืœื• ืœืคืจื•ืฉ ื‘ืขืฆืžื™ ื›ืžืขื˜ ืกื™ื™ืžืชื™ ืื™ื›ืฉื”ื• ืœื ืจืฆื™ืชื™ ืืช ื”ืคืจื•ื™ืงื˜... ื”ืขื‘ื•ื“ื” ื ืžืฉื›ื”, ืื‘ืœ ืœืื˜ ืžืื•ื“, ื•ืขื›ืฉื™ื•, ืœืื—ืจื•ื ื” ื”ื•ืคื™ืขื” ื”ื›ืชื‘ื” ื”ื”ื™ื ืคืจืฉื ื•ืช ืขืœ ื”ื ื•ืฉื "ืื– ืื™ืš ื”ื›ืœ ื ื’ืžืจ?" ื‘ืชื’ื•ื‘ื” ืœืชืฉื•ื‘ืชื™ ื”ืžืคื•ืจื˜ืช, ืฉืžืขืชื™ "ื–ื” ื ืฉืžืข ื›ืžื• ืžืืžืจ". ื•ื‘ื›ืŸ, ืื ืืชื” ื™ื›ื•ืœ, ืชื”ื™ื” ืžืืžืจ. ืื•ืœื™ ืžื™ืฉื”ื• ื™ืžืฆื ืืช ื–ื” ืฉื™ืžื•ืฉื™. ืžืžื ื• ื™ืœืžื“ ื”ืงื•ืจื ื›ืžื” ืขื•ื‘ื“ื•ืช ืขืœ ื”ืขื™ืฆื•ื‘ ืฉืœ ืงืฆื” ื’ื‘ื•ื™ ืœื™ืฆื™ืจืช ืงื•ื“ QEMU, ื›ืžื• ื’ื ื›ื™ืฆื“ ืœื›ืชื•ื‘ ืžื”ื“ืจ Just-in-Time ืขื‘ื•ืจ ื™ื™ืฉื•ื ืื™ื ื˜ืจื ื˜.

ืžืฉื™ืžื•ืช

ืžื›ื™ื•ื•ืŸ ืฉื›ื‘ืจ ืœืžื“ืชื™ ืื™ืš "ืื™ื›ืฉื”ื•" ืœื”ืขื‘ื™ืจ QEMU ืœ-JavaScript, ื”ืคืขื ื”ื•ื—ืœื˜ ืœืขืฉื•ืช ื–ืืช ื‘ื—ื•ื›ืžื” ื•ืœื ืœื—ื–ื•ืจ ืขืœ ื˜ืขื•ื™ื•ืช ื™ืฉื ื•ืช.

ืฉื’ื™ืื” ืžืกืคืจ ืื—ืช: ื”ืกืชืขืฃ ืžืฉื—ืจื•ืจ ื ืงื•ื“ื”

ื”ื˜ืขื•ืช ื”ืจืืฉื•ื ื” ืฉืœื™ ื”ื™ื™ืชื” ืœื—ืœืง ืืช ื”ื’ืจืกื” ืฉืœื™ ืžื’ืจืกื” 2.4.1 ื‘ืžืขืœื” ื”ื–ืจื. ื•ืื– ื–ื” ื ืจืื” ืœื™ ืจืขื™ื•ืŸ ื˜ื•ื‘: ืื ืงื™ื™ื ืฉื—ืจื•ืจ ื ืงื•ื“ืชื™, ืื– ื”ื•ื ื›ื ืจืื” ื™ืฆื™ื‘ ื™ื•ืชืจ ืž-2.4 ืคืฉื•ื˜, ื•ืขื•ื“ ื™ื•ืชืจ ื”ืขื ืฃ master. ื•ืžื›ื™ื•ื•ืŸ ืฉืชื›ื ื ืชื™ ืœื”ื•ืกื™ืฃ ื›ืžื•ืช ื ื›ื‘ื“ื” ืฉืœ ื‘ืื’ื™ื ืžืฉืœื™, ืœื ื”ื™ื™ืชื™ ืฆืจื™ืš ื‘ื›ืœืœ ืฉืœ ืืฃ ืื—ื“ ืื—ืจ. ื›ื ืจืื” ืฉื›ืš ื–ื” ื™ืฆื. ืื‘ืœ ื–ื” ื”ืขื ื™ื™ืŸ: QEMU ืœื ืขื•ืžื“ ื‘ืžืงื•ื, ื•ื‘ืฉืœื‘ ืžืกื•ื™ื ื”ื ืืคื™ืœื• ื”ื›ืจื™ื–ื• ืขืœ ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ื”ืงื•ื“ ืฉื ื•ืฆืจ ื‘-10 ืื—ื•ื–. "ื›ืŸ, ืขื›ืฉื™ื• ืื ื™ ื”ื•ืœืš ืœื”ืงืคื™ื", ื—ืฉื‘ืชื™ ื•ื ืฉื‘ืจืชื™. ื›ืืŸ ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืขืฉื•ืช ืกื˜ื™ื™ื”: ื‘ืฉืœ ื”ืื•ืคื™ ื”ื—ื“-ืคืชื™ืœ ืฉืœ QEMU.js ื•ื”ืขื•ื‘ื“ื” ืฉื”-QEMU ื”ืžืงื•ืจื™ ืื™ื ื• ืžืจืžื– ืขืœ ื”ื™ืขื“ืจ ืจื™ื‘ื•ื™-ืฉืจืฉื•ืจื™ื (ื›ืœื•ืžืจ, ื”ื™ื›ื•ืœืช ืœื”ืคืขื™ืœ ื‘ื•-ื–ืžื ื™ืช ืžืกืคืจ ื ืชื™ื‘ื™ ืงื•ื“ ืœื ืงืฉื•ืจื™ื, ื•ื›ืŸ ืœื ืจืง "ื”ืฉืชืžืฉ ื‘ื›ืœ ื”ื’ืจืขื™ื ื™ื") ื”ื•ื ืงืจื™ื˜ื™ ืขื‘ื•ืจื•, ื”ืคื•ื ืงืฆื™ื•ืช ื”ืขื™ืงืจื™ื•ืช ืฉืœ ืฉืจืฉื•ืจื™ื ื”ื™ื™ืชื™ ืฆืจื™ืš "ืœื”ืคื•ืš ืืช ื–ื”" ื›ื“ื™ ืœื”ื™ื•ืช ืžืกื•ื’ืœ ืœื”ืชืงืฉืจ ืžื‘ื—ื•ืฅ. ื–ื” ื™ืฆืจ ื›ืžื” ื‘ืขื™ื•ืช ื˜ื‘ืขื™ื•ืช ื‘ืžื”ืœืš ื”ืžื™ื–ื•ื’. ืขื ื–ืืช, ื”ืขื•ื‘ื“ื” ืฉื—ืœืง ืžื”ืฉื™ื ื•ื™ื™ื ืžื”ืกื ื™ืฃ master, ืฉืื™ืชื ื ื™ืกื™ืชื™ ืœืžื–ื’ ืืช ื”ืงื•ื“ ืฉืœื™, ื’ื ื ื‘ื—ืจื• ื“ื•ื‘ื“ื‘ืŸ ื‘ืฉื—ืจื•ืจ ื”ื ืงื•ื“ื•ืช (ื•ืœื›ืŸ ื‘ืกื ื™ืฃ ืฉืœื™) ื’ื ื›ื ืจืื” ืœื ื”ื™ื• ืžื•ืกื™ืคื™ื ื ื•ื—ื•ืช.

ื‘ืื•ืคืŸ ื›ืœืœื™, ื”ื—ืœื˜ืชื™ ืฉืขื“ื™ื™ืŸ ื”ื’ื™ื•ื ื™ ืœื–ืจื•ืง ืืช ืื‘ ื”ื˜ื™ืคื•ืก, ืœืคืจืง ืื•ืชื• ืœื—ืœืงื™ื ื•ืœื‘ื ื•ืช ื’ืจืกื” ื—ื“ืฉื” ืžืืคืก ื”ืžื‘ื•ืกืกืช ืขืœ ืžืฉื”ื• ืจืขื ืŸ ื™ื•ืชืจ ื•ืขื›ืฉื™ื• ืž- master.

ื˜ืขื•ืช ืžืกืคืจ ืฉืชื™ื™ื: ืžืชื•ื“ื•ืœื•ื’ื™ื™ืช TLP

ื‘ืขื™ืงืจื• ืฉืœ ื“ื‘ืจ, ื–ื• ืœื ื˜ืขื•ืช, ื‘ืื•ืคืŸ ื›ืœืœื™, ื–ื” ืจืง ืชื›ื•ื ื” ืฉืœ ื™ืฆื™ืจืช ืคืจื•ื™ืงื˜ ื‘ืชื ืื™ื ืฉืœ ืื™ ื”ื‘ื ื” ืžื•ื—ืœื˜ืช ืฉืœ "ืœืืŸ ื•ืื™ืš ืœืขื‘ื•ืจ?" ื•ื‘ืื•ืคืŸ ื›ืœืœื™ "ื”ืื ื ื’ื™ืข ืœืฉื?" ื‘ืชื ืื™ื ื”ืืœื” ืชื›ื ื•ืช ืžื’ื•ืฉื ื”ื™ื™ืชื” ืืคืฉืจื•ืช ืžื•ืฆื“ืงืช, ืื‘ืœ, ื‘ืื•ืคืŸ ื˜ื‘ืขื™, ืœื ืจืฆื™ืชื™ ืœื—ื–ื•ืจ ืขืœื™ื” ืฉืœื ืœืฆื•ืจืš. ื”ืคืขื ืจืฆื™ืชื™ ืœืขืฉื•ืช ืืช ื–ื” ื‘ื—ื•ื›ืžื”: ืžื—ื•ื™ื‘ื•ืช ืื˜ื•ืžื™ื•ืช, ืฉื™ื ื•ื™ื™ื ื‘ืงื•ื“ ืžื•ื“ืข (ื•ืœื "ืžื—ืจื•ื–ืช ืชื•ื•ื™ื ืืงืจืื™ื™ื ืขื“ ืœื”ื™ื“ื•ืจ (ืขื ืื–ื”ืจื•ืช)", ื›ืคื™ ืฉืืžืจ ืคืขื ืœื™ื ื•ืก ื˜ื•ืจื•ื•ืืœื“ืก ืขืœ ืžื™ืฉื”ื•, ืœืคื™ ื•ื™ืงื™ืฆื™ื˜ื•ื˜) ื•ื›ื•'.

ื˜ืขื•ืช ืžืกืคืจ ืฉืœื•ืฉ: ืœื”ื™ื›ื ืก ืœืžื™ื ื‘ืœื™ ืœื”ื›ื™ืจ ืืช ื”ืคื•ืจ

ืขื“ื™ื™ืŸ ืœื ื ืคื˜ืจืชื™ ืžื–ื” ืœื’ืžืจื™, ืื‘ืœ ืขื›ืฉื™ื• ื”ื—ืœื˜ืชื™ ื‘ื›ืœืœ ืœื ืœืœื›ืช ื‘ื“ืจืš ืฉืœ ื”ื”ืชื ื’ื“ื•ืช ื”ืงื˜ื ื” ื‘ื™ื•ืชืจ, ื•ืœืขืฉื•ืช ืืช ื–ื” "ื›ืžื‘ื•ื’ืจ", ื›ืœื•ืžืจ ืœื›ืชื•ื‘ ืืช ื”-TCG ื”ืื—ื•ืจื™ ืฉืœื™ ืžืืคืก, ื›ื“ื™ ืœื ืฆืจื™ืš ืœื•ืžืจ ืžืื•ื—ืจ ื™ื•ืชืจ, "ื›ืŸ, ื–ื” ื›ืžื•ื‘ืŸ, ืœืื˜, ืื‘ืœ ืื ื™ ืœื ื™ื›ื•ืœ ืœืฉืœื•ื˜ ืขืœ ื”ื›ืœ - ื›ื›ื” ื›ืชื•ื‘ TCI..." ื™ืชืจ ืขืœ ื›ืŸ, ื–ื” ื ืจืื” ื‘ื”ืชื—ืœื” ื›ืžื• ืคืชืจื•ืŸ ื‘ืจื•ืจ, ืฉื›ืŸ ืื ื™ ืžื™ื™ืฆืจ ืงื•ื“ ื‘ื™ื ืืจื™. ื›ืžื• ืฉืื•ืžืจื™ื, "ื’ื ื˜ ื”ืชืืกืคื”ัƒ, ืื‘ืœ ืœื ื”ื”ื•ื": ื”ืงื•ื“ ื”ื•ื, ื›ืžื•ื‘ืŸ, ื‘ื™ื ืืจื™, ืื‘ืœ ืื™ ืืคืฉืจ ืœื”ืขื‘ื™ืจ ืืœื™ื• ืฉืœื™ื˜ื” ืคืฉื•ื˜ - ื™ืฉ ืœื“ื—ื•ืฃ ืื•ืชื• ื‘ืžืคื•ืจืฉ ืœื“ืคื“ืคืŸ ืœืฆื•ืจืš ื”ื™ื“ื•ืจ, ื•ื›ืชื•ืฆืื” ืžื›ืš ืื•ื‘ื™ื™ืงื˜ ืžืกื•ื™ื ืžืขื•ืœื JS, ืฉืขื“ื™ื™ืŸ ืฆืจื™ืš ืœื”ื™ืฉืžืจ ืื™ืคืฉื”ื•. ืขื ื–ืืช, ื‘ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช RISC ืจื’ื™ืœื•ืช, ืœืžื™ื˜ื‘ ื”ื‘ื ืชื™, ืžืฆื‘ ื˜ื™ืคื•ืกื™ ื”ื•ื ื”ืฆื•ืจืš ืœืืคืก ื‘ืžืคื•ืจืฉ ืืช ืžื˜ืžื•ืŸ ื”ื”ื•ืจืื•ืช ืขื‘ื•ืจ ืงื•ื“ ืžืฉื•ื—ื–ืจ - ืื ื–ื” ืœื ืžื” ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื, ืื– ื‘ื›ืœ ืžืงืจื”, ื–ื” ืงืจื•ื‘. ื‘ื ื•ืกืฃ, ืžื”ื ื™ืกื™ื•ืŸ ื”ืื—ืจื•ืŸ ืฉืœื™, ืœืžื“ืชื™ ืฉื”ืฉืœื™ื˜ื” ืœื ืžื•ืขื‘ืจืช ืœืืžืฆืข ื‘ืœื•ืง ื”ืชืจื’ื•ื, ืื– ืื ื—ื ื• ืœื ื‘ืืžืช ืฆืจื™ื›ื™ื ืงื•ื“ ื‘ื™ื™ื˜ ืฉืžืคื•ืจืฉ ืžื›ืœ ืื•ืคืกื˜, ื•ืื ื—ื ื• ื™ื›ื•ืœื™ื ืคืฉื•ื˜ ืœื™ืฆื•ืจ ืื•ืชื• ืžื”ืคื•ื ืงืฆื™ื” ื‘-TB .

ื”ื ื‘ืื• ื•ื‘ืขื˜ื•

ืœืžืจื•ืช ืฉื”ืชื—ืœืชื™ ืœืฉื›ืชื‘ ืืช ื”ืงื•ื“ ื‘ื™ื•ืœื™, ื‘ืขื™ื˜ืช ืงืกื ื”ืชื’ื ื‘ื” ื‘ืœื™ ืœืฉื™ื ืœื‘: ื‘ื“ืจืš ื›ืœืœ ืžื›ืชื‘ื™ื ืž-GitHub ืžื’ื™ืขื™ื ื›ื”ืชืจืื•ืช ืœื’ื‘ื™ ืชื’ื•ื‘ื•ืช ืœื‘ืขื™ื•ืช ื•ืœื‘ืงืฉื•ืช ืžืฉื™ื›ื”, ืื‘ืœ ื›ืืŸ, ืคึผึดืชึฐืื•ึนื ืœื”ื–ื›ื™ืจ ื‘ืฉืจืฉื•ืจ Binaryen ื‘ืชื•ืจ ืงืฆื” ืงืฆื” ืฉืœ qemu ื‘ื”ืงืฉืจ, "ื”ื•ื ืขืฉื” ืžืฉื”ื• ื›ื–ื”, ืื•ืœื™ ื”ื•ื ื™ื’ื™ื“ ืžืฉื”ื•." ื“ื™ื‘ืจื ื• ืขืœ ืฉื™ืžื•ืฉ ื‘ืกืคืจื™ื™ื” ื”ืงืฉื•ืจื” ืฉืœ Emscripten ื‘ื™ื ืืจื™ื™ืŸ ื›ื“ื™ ืœื™ืฆื•ืจ WASM JIT. ื•ื‘ื›ืŸ, ืืžืจืชื™ ืฉื™ืฉ ืœืš ืฉื ืจื™ืฉื™ื•ืŸ Apache 2.0, ื•-QEMU ื‘ื›ืœืœื•ืชื• ืžื•ืคืฅ ืชื—ืช GPLv2, ื•ื”ื ืœื ืžืื•ื“ ืชื•ืืžื™ื. ืคืชืื•ื ื”ืชื‘ืจืจ ืฉืจืฉื™ื•ืŸ ื™ื›ื•ืœ ืœื”ื™ื•ืช ืœืชืงืŸ ืืช ื–ื” ืื™ื›ืฉื”ื• (ืื ื™ ืœื ื™ื•ื“ืข: ืื•ืœื™ ืœืฉื ื•ืช ืืช ื–ื”, ืื•ืœื™ ืจื™ืฉื•ื™ ื›ืคื•ืœ, ืื•ืœื™ ืžืฉื”ื• ืื—ืจ...). ื–ื” ื›ืžื•ื‘ืŸ ืฉื™ืžื— ืื•ืชื™, ื›ื™ ืื– ื›ื‘ืจ ื”ืกืชื›ืœืชื™ ืžืงืจื•ื‘ ืคื•ืจืžื˜ ื‘ื™ื ืืจื™ WebAssembly, ื•ื”ื™ื™ืชื™ ืื™ื›ืฉื”ื• ืขืฆื•ื‘ ื•ืœื ืžื•ื‘ืŸ. ื”ื™ื™ืชื” ื’ื ืกืคืจื™ื™ื” ืฉื”ื™ื™ืชื” ื–ื•ืœืœืช ืืช ื”ื‘ืœื•ืงื™ื ื”ื‘ืกื™ืกื™ื™ื ืขื ื’ืจืฃ ื”ืžืขื‘ืจ, ืžื™ื™ืฆืจืช ืืช ื”-bytecode, ื•ืืคื™ืœื• ืชืคืขื™ืœ ืื•ืชื• ื‘ืžืชื•ืจื’ืžืŸ ืขืฆืžื•, ื‘ืžื™ื“ืช ื”ืฆื•ืจืš.

ืื—ืจ ื›ืš ื”ื™ื” ืขื•ื“ ืžื›ืชื‘ ื‘ืจืฉื™ืžืช ื”ืชืคื•ืฆื” ืฉืœ QEMU, ืื‘ืœ ื–ื” ื™ื•ืชืจ ืขืœ ื”ืฉืืœื”, "ืžื™ ืฆืจื™ืš ืืช ื–ื” ื‘ื›ืœืœ?" ื•ื–ื” ืคึผึดืชึฐืื•ึนื, ื”ืชื‘ืจืจ ืฉื–ื” ื”ื›ืจื—ื™. ืœื›ืœ ื”ืคื—ื•ืช, ืืชื” ื™ื›ื•ืœ ืœื’ืจื“ ื™ื—ื“ ืืช ืืคืฉืจื•ื™ื•ืช ื”ืฉื™ืžื•ืฉ ื”ื‘ืื•ืช, ืื ื–ื” ืขื•ื‘ื“ ื™ื•ืชืจ ืื• ืคื—ื•ืช ืžื”ืจ:

  • ื”ืฉืงืช ืžืฉื”ื• ื—ื™ื ื•ื›ื™ ืœืœื ื”ืชืงื ื” ื›ืœืœ
  • ื•ื™ืจื˜ื•ืืœื™ื–ืฆื™ื” ื‘-iOS, ืฉื‘ื”, ืœืคื™ ื”ืฉืžื•ืขื•ืช, ื”ืืคืœื™ืงืฆื™ื” ื”ื™ื—ื™ื“ื” ืฉื™ืฉ ืœื” ืืช ื”ื–ื›ื•ืช ืœื™ืฆื•ืจ ืงื•ื“ ืชื•ืš ื›ื“ื™ ืชื ื•ืขื” ื”ื™ื ืžื ื•ืข JS (ื”ืื ื–ื” ื ื›ื•ืŸ?)
  • ื”ื“ื’ืžื” ืฉืœ ืžื™ื ื™ ืžืขืจื›ืช ื”ืคืขืœื” - ืชืงืœื™ื˜ ื‘ื•ื“ื“, ืžื•ื‘ื ื”, ื›ืœ ืกื•ื’ื™ ื”ืงื•ืฉื—ื” ื•ื›ื•'...

ืชื›ื•ื ื•ืช ื–ืžืŸ ืจื™ืฆื” ืฉืœ ื“ืคื“ืคืŸ

ื›ืคื™ ืฉื›ื‘ืจ ืืžืจืชื™, QEMU ืงืฉื•ืจ ืœ-multithreading, ืื‘ืœ ืœื“ืคื“ืคืŸ ืื™ืŸ ืืช ื–ื”. ื•ื‘ื›ืŸ, ื›ืœื•ืžืจ, ืœื... ื‘ื”ืชื—ืœื” ื–ื” ืœื ื”ื™ื” ืงื™ื™ื ื‘ื›ืœืœ, ื•ืื– ื”ื•ืคื™ืขื• WebWorkers - ืœืžื™ื˜ื‘ ื”ื‘ื ืชื™, ื–ื” ืจื™ื‘ื•ื™ ื”ืฉืจืฉื•ืจื™ื ื”ืžื‘ื•ืกืกื™ื ืขืœ ื”ืขื‘ืจืช ื”ื•ื“ืขื•ืช ืœืœื ืžืฉืชื ื™ื ืžืฉื•ืชืคื™ื. ื‘ืื•ืคืŸ ื˜ื‘ืขื™, ื–ื” ื™ื•ืฆืจ ื‘ืขื™ื•ืช ืžืฉืžืขื•ืชื™ื•ืช ื‘ืขืช ื”ืขื‘ืจืช ืงื•ื“ ืงื™ื™ื ืขืœ ื‘ืกื™ืก ืžื•ื“ืœ ื”ื–ื™ื›ืจื•ืŸ ื”ืžืฉื•ืชืฃ. ืื—ืจ ื›ืš, ื‘ืœื—ืฅ ืฆื™ื‘ื•ืจื™, ื”ื•ื ื™ื•ืฉื ื’ื ื‘ืฉื SharedArrayBuffers. ื–ื” ื”ื•ืฆื’ ื‘ื”ื“ืจื’ื”, ื”ื ื—ื’ื’ื• ืืช ื”ื”ืฉืงื” ืฉืœื• ื‘ื“ืคื“ืคื ื™ื ืฉื•ื ื™ื, ืื—ืจ ื›ืš ื—ื’ื’ื• ืืช ื”ืฉื ื” ื”ื—ื“ืฉื”, ื•ืื—ืจ ื›ืš Meltdown... ืœืื—ืจ ืžื›ืŸ ื”ื’ื™ืขื• ืœืžืกืงื ื” ืฉื’ืก ืื• ื’ืก ืืช ืžื“ื™ื“ืช ื”ื–ืžืŸ, ืื‘ืœ ื‘ืขื–ืจืช ื–ื™ื›ืจื•ืŸ ืžืฉื•ืชืฃ ื•- ื—ื•ื˜ ืžื’ื“ื™ืœ ืืช ื”ืžื•ื ื”, ื”ื›ืœ ืื•ืชื• ื“ื‘ืจ ื–ื” ื™ืกืชื“ืจ ื“ื™ ืžื“ื•ื™ืง. ืื– ื”ืฉื‘ืชื ื• ืจื™ื‘ื•ื™ ืฉืจืฉื•ืจื™ื ืขื ื–ื™ื›ืจื•ืŸ ืžืฉื•ืชืฃ. ื ืจืื” ืฉืžืื•ื—ืจ ื™ื•ืชืจ ื”ืคืขื™ืœื• ืื•ืชื• ืžื—ื“ืฉ, ืื‘ืœ ื›ืคื™ ืฉื”ืชื‘ืจืจ ืžื”ื ื™ืกื•ื™ ื”ืจืืฉื•ืŸ, ื™ืฉ ื—ื™ื™ื ื‘ืœืขื“ื™ื•, ื•ืื ื›ืŸ, ื ื ืกื” ืœืขืฉื•ืช ื–ืืช ืžื‘ืœื™ ืœื”ืกืชืžืš ืขืœ ืจื™ื‘ื•ื™ ื”ืœื™ื›ื™ื.

ื”ืชื›ื•ื ื” ื”ืฉื ื™ื™ื” ื”ื™ื ื—ื•ืกืจ ื”ืืคืฉืจื•ืช ืฉืœ ืžื ื™ืคื•ืœืฆื™ื•ืช ื‘ืจืžื” ื ืžื•ื›ื” ืขื ื”ืขืจื™ืžื”: ืืชื” ืœื ื™ื›ื•ืœ ืคืฉื•ื˜ ืœืงื—ืช, ืœืฉืžื•ืจ ืืช ื”ื”ืงืฉืจ ื”ื ื•ื›ื—ื™ ื•ืœืขื‘ื•ืจ ืœื”ืงืฉืจ ื—ื“ืฉ ืขื ืžื—ืกื ื™ืช ื—ื“ืฉื”. ืžื—ืกื ื™ืช ื”ืฉื™ื—ื•ืช ืžื ื•ื”ืœืช ืขืœ ื™ื“ื™ ื”ืžื›ื•ื ื” ื”ื•ื™ืจื˜ื•ืืœื™ืช JS. ื ืจืื”, ืžื” ื”ื‘ืขื™ื”, ืžื›ื™ื•ื•ืŸ ืฉื‘ื›ืœ ื–ืืช ื”ื—ืœื˜ื ื• ืœื ื”ืœ ืืช ื”ื–ืจืžื™ื ื”ืงื•ื“ืžื™ื ื‘ืื•ืคืŸ ื™ื“ื ื™ ืœื—ืœื•ื˜ื™ืŸ? ื”ืขื•ื‘ื“ื” ื”ื™ื ืฉื‘ืœื•ืง I/O ื‘-QEMU ืžื™ื•ืฉื ื‘ืืžืฆืขื•ืช ืงื•ืจื•ื˜ื™ื ื™ื, ื•ื›ืืŸ ืžื ื™ืคื•ืœืฆื™ื•ืช ืžื—ืกื ื™ื•ืช ื‘ืจืžื” ื ืžื•ื›ื” ื™ื”ื™ื• ืฉื™ืžื•ืฉื™ื•ืช. ืœืžืจื‘ื” ื”ืžื–ืœ, Emscipten ื›ื‘ืจ ืžื›ื™ืœ ืžื ื’ื ื•ืŸ ืœืคืขื•ืœื•ืช ืืกื™ื ื›ืจื•ื ื™ื•ืช, ืืคื™ืœื• ืฉื ื™ื™ื: ืืกืชื ื›ืจืŸ ะธ ืžืชื•ืจื’ืžืŸ. ื”ืจืืฉื•ืŸ ืคื•ืขืœ ื‘ืืžืฆืขื•ืช ื ืคื™ื—ื•ืช ืžืฉืžืขื•ืชื™ืช ื‘ืงื•ื“ ื”-JavaScript ืฉื ื•ืฆืจ ื•ืื™ื ื• ื ืชืžืš ืขื•ื“. ื”ืฉื ื™ ื”ื•ื "ื”ื“ืจืš ื”ื ื›ื•ื ื”" ื”ื ื•ื›ื—ื™ืช ื•ืคื•ืขืœ ื‘ืืžืฆืขื•ืช ื™ืฆื™ืจืช ืงื•ื“ ื‘ืชื™ื ืขื‘ื•ืจ ื”ืžืชื•ืจื’ืžืŸ ื”ืžืงื•ืžื™. ื–ื” ืขื•ื‘ื“, ื›ืžื•ื‘ืŸ, ืœืื˜, ืื‘ืœ ื–ื” ืœื ืžื ืคื— ืืช ื”ืงื•ื“. ื ื›ื•ืŸ, ืชืžื™ื›ื” ื‘-coroutines ืœืžื ื’ื ื•ืŸ ื”ื–ื” ื”ื™ื™ืชื” ืฆืจื™ื›ื” ืœื”ื™ืชืจื ื‘ืื•ืคืŸ ืขืฆืžืื™ (ื›ื‘ืจ ื”ื™ื• ืงื•ืจื•ื˜ื™ื™ื ื™ื ืฉื ื›ืชื‘ื• ืขื‘ื•ืจ Asyncify ื•ื”ื™ื™ืชื” ื™ื™ืฉื•ื ืฉืœ ืื•ืชื• API ืœ-Emterpreter ื‘ืขืจืš, ืจืง ืฆืจื™ืš ืœื—ื‘ืจ ืื•ืชื).

ื›ืจื’ืข ืขื•ื“ ืœื ื”ืฆืœื—ืชื™ ืœืคืฆืœ ืืช ื”ืงื•ื“ ืœืื—ื“ ืฉืงื•ืžืคื™ืœื“ ื‘-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 ื—ื•ืงื™. ืœื”ื™ืคืš, ื”ื•ื ื‘ื™ื ืืจื™ ื•ืžื™ื•ื˜ื‘ ื‘ืœื‘ื“, ื•ืืคื™ืœื• ื›ืชื™ื‘ืช ืžืกืคืจ ืฉืœื ืœืชื•ื›ื• ื”ื™ื ืœื ืคืฉื•ื˜ื” ื‘ืžื™ื•ื—ื“: ื‘ืฉื‘ื™ืœ ื”ืงื•ืžืคืงื˜ื™ื•ืช, ื”ื•ื ืžืื•ื—ืกืŸ ื‘ืคื•ืจืžื˜ LEB128.

ืื•ืœื™ ืฉืžืขืชื ืขืœ ืืœื’ื•ืจื™ืชื ื”-relooping ืขื‘ื•ืจ Asm.js - ื–ื”ื• ืฉื—ื–ื•ืจ ืฉืœ ื”ื•ืจืื•ืช ื‘ืงืจืช ื–ืจื™ืžื” "ื‘ืจืžื” ื’ื‘ื•ื”ื”" (ื›ืœื•ืžืจ, ืื-ืื–-ืื—ืจ, ืœื•ืœืื•ืช ื•ื›ื•'), ืฉืขื‘ื•ืจืŸ ืžื™ื•ืขื“ื™ื ืžื ื•ืขื™ JS, ืž- ื”-LLVM IR ื‘ืจืžื” ื ืžื•ื›ื”, ืงืจื•ื‘ ื™ื•ืชืจ ืœืงื•ื“ ื”ืžื›ื•ื ื” ืฉืžื‘ื•ืฆืข ืขืœ ื™ื“ื™ ื”ืžืขื‘ื“. ืžื˜ื‘ืข ื”ื“ื‘ืจื™ื, ื™ื™ืฆื•ื’ ื”ื‘ื™ื ื™ื™ื ืฉืœ QEMU ืงืจื•ื‘ ื™ื•ืชืจ ืœืฉื ื™. ื ืจืื” ืฉื”ื ื” ื–ื”, bytecode, ืกื•ืฃ ื”ื™ื™ืกื•ืจื™ื... ื•ืื– ื™ืฉ ื‘ืœื•ืงื™ื, ืื-ืื–-ืื—ืจ ื•ืœื•ืœืื•ืช!..

ื•ื–ื• ืกื™ื‘ื” ื ื•ืกืคืช ืœื›ืš ืฉ-Binaryen ืฉื™ืžื•ืฉื™: ื‘ืื•ืคืŸ ื˜ื‘ืขื™ ื”ื•ื ื™ื›ื•ืœ ืœืงื‘ืœ ื‘ืœื•ืงื™ื ื‘ืจืžื” ื’ื‘ื•ื”ื” ื”ืงืจื•ื‘ื™ื ืœืžื” ืฉื”ื™ื” ืžืื•ื—ืกืŸ ื‘-WASM. ืื‘ืœ ื”ื•ื ื™ื›ื•ืœ ื’ื ืœื™ื™ืฆืจ ืงื•ื“ ืžื’ืจืฃ ืฉืœ ื‘ืœื•ืงื™ื ื‘ืกื™ืกื™ื™ื ื•ืžืขื‘ืจื™ื ื‘ื™ื ื™ื”ื. ื•ื‘ื›ืŸ, ื›ื‘ืจ ืืžืจืชื™ ืฉื”ื•ื ืžืกืชื™ืจ ืืช ืคื•ืจืžื˜ ื”ืื—ืกื•ืŸ ืฉืœ WebAssembly ืžืื—ื•ืจื™ ื”-API ื”ื ื•ื— ืฉืœ C/C++.

TCG (ืžื—ื•ืœืœ ืงื•ื“ ื–ืขื™ืจ)

TCG ื”ื™ื” ื‘ืžืงื•ืจ ืื—ื•ืจื™ ืขื‘ื•ืจ ืžื”ื“ืจ C. ืœืื—ืจ ืžื›ืŸ, ื›ื›ืœ ื”ื ืจืื”, ื”ื•ื ืœื ื™ื›ื•ืœ ื”ื™ื” ืœืขืžื•ื“ ื‘ืชื—ืจื•ืช ืขื GCC, ืื‘ืœ ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ื”ื•ื ืžืฆื ืืช ืžืงื•ืžื• ื‘-QEMU ื›ืžื ื’ื ื•ืŸ ื™ืฆื™ืจืช ืงื•ื“ ืขื‘ื•ืจ ื”ืคืœื˜ืคื•ืจืžื” ื”ืžืืจื—ืช. ื™ืฉ ื’ื ืงืฆื” ืื—ื•ืจื™ ืฉืœ TCG ืฉืžื™ื™ืฆืจ ืงื•ื“ ื‘ืชื™ื ืื‘ืกื˜ืจืงื˜ื™ ื›ืœืฉื”ื•, โ€‹โ€‹ืฉืžื‘ื•ืฆืข ืžื™ื“ ืขืœ ื™ื“ื™ ื”ืžืชื•ืจื’ืžืŸ, ืื‘ืœ ื”ื—ืœื˜ืชื™ ืœื”ื™ืžื ืข ืžืฉื™ืžื•ืฉ ื‘ื• ื”ืคืขื. ืขื ื–ืืช, ื”ืขื•ื‘ื“ื” ืฉื‘-QEMU ื›ื‘ืจ ื ื™ืชืŸ ืœืืคืฉืจ ืืช ื”ืžืขื‘ืจ ืœืฉื—ืคืช ืฉื ื•ืฆืจื” ื‘ืืžืฆืขื•ืช ื”ืคื•ื ืงืฆื™ื” 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-API ืคืฉื•ื˜: ืืชื” ื™ื•ืฆืจ ืžื•ื“ื•ืœ, ื‘ื• ืœื™ืฆื•ืจ ื‘ื™ื˜ื•ื™ื™ื - unary, ื‘ื™ื ืืจื™, ื‘ืœื•ืงื™ื ืžื‘ื™ื˜ื•ื™ื™ื ืื—ืจื™ื, ื–ืจื™ืžืช ื‘ืงืจื” ื•ื›ื•'. ื•ืื– ืืชื” ื™ื•ืฆืจ ืคื•ื ืงืฆื™ื” ืขื ื‘ื™ื˜ื•ื™ ื›ื’ื•ืฃ ืฉืœื”. ืื ื™ืฉ ืœืš, ื›ืžื•ื ื™, ื’ืจืฃ ืžืขื‘ืจ ื‘ืจืžื” ื ืžื•ื›ื”, ืจื›ื™ื‘ ื”-relooper ื™ืขื–ื•ืจ ืœืš. ืœืžื™ื˜ื‘ ื”ื‘ื ืชื™, ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืฉืœื™ื˜ื” ื‘ืจืžื” ื’ื‘ื•ื”ื” ืขืœ ื–ืจื™ืžืช ื”ื‘ื™ืฆื•ืข ื‘ื‘ืœื•ืง, ื›ืœ ืขื•ื“ ื–ื” ืœื ืขื•ื‘ืจ ืืช ื’ื‘ื•ืœื•ืช ื”ื‘ืœื•ืง - ื›ืœื•ืžืจ, ืืคืฉืจ ืœืขืฉื•ืช ื ืชื™ื‘ ืžื”ื™ืจ / ืื™ื˜ื™ ืคื ื™ืžื™ ื ืชื™ื‘ ืžืกืชืขืฃ ื‘ืชื•ืš ืงื•ื“ ืขื™ื‘ื•ื“ ืžื˜ืžื•ืŸ TLB ื”ืžื•ื‘ื ื”, ืืš ืœื ื›ื“ื™ ืœื”ืคืจื™ืข ืœื–ืจื™ืžืช ื”ื‘ืงืจื” ื”"ื—ื™ืฆื•ื ื™ืช". ื›ืืฉืจ ืืชื” ืžืฉื—ืจืจ ืจืœื•ื•ืคืจ, ื”ื‘ืœื•ืงื™ื ืฉืœื• ืžืฉืชื—ืจืจื™ื; ื›ืืฉืจ ืืชื” ืžืฉื—ืจืจ ืžื•ื“ื•ืœ, ื”ื‘ื™ื˜ื•ื™ื™ื, ื”ืคื•ื ืงืฆื™ื•ืช ื•ื›ื•' ืฉื”ื•ืงืฆื• ืœื• ื ืขืœืžื™ื ื–ึดื™ืจึธื”.

ืขื ื–ืืช, ืื ืืชื” ืจื•ืฆื” ืœืคืจืฉ ืงื•ื“ ืชื•ืš ื›ื“ื™ ืชื ื•ืขื” ืœืœื ื™ืฆื™ืจื” ื•ืžื—ื™ืงื” ืžื™ื•ืชืจืช ืฉืœ ืžื•ืคืข ืžืชื•ืจื’ืžืŸ, ืื•ืœื™ ื”ื’ื™ื•ื ื™ ืœื”ื›ื ื™ืก ืืช ื”ื”ื™ื’ื™ื•ืŸ ื”ื–ื” ืœืงื•ื‘ืฅ 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.

ืื’ื‘, ื”ื“ื’ืžื” (ื›ืจื’ืข ืขื ืจื™ืฉื™ื•ืŸ ืขื›ื•ืจ) ืขื•ื‘ื“ ืžืฆื•ื™ืŸ ืจืง ื‘ืคื™ื™ืจืคื•ืงืก. ืžืคืชื—ื™ Chrome ื”ื™ื• ืื™ื›ืฉื”ื• ืœื ืžื•ื›ืŸ ืœืขื•ื‘ื“ื” ืฉืžื™ืฉื”ื• ื™ืจืฆื” ืœื™ืฆื•ืจ ื™ื•ืชืจ ืžืืœืฃ ืžื•ืคืขื™ื ืฉืœ ืžื•ื“ื•ืœื™ WebAssembly, ืื– ื”ื ืคืฉื•ื˜ ื”ืงืฆื• ื’ื™ื’ื”-ื‘ื™ื™ื˜ ืฉืœ ืฉื˜ื— ื›ืชื•ื‘ื•ืช ื•ื™ืจื˜ื•ืืœื™ ืœื›ืœ...

ื–ื” ื”ื›ืœ ืœืขืช ืขืชื”. ืื•ืœื™ ื™ื”ื™ื” ืžืืžืจ ื ื•ืกืฃ ืื ืžื™ืฉื”ื• ืžืขื•ื ื™ื™ืŸ. ื›ืœื•ืžืจ, ื ืฉืืจื™ื ืœืคื—ื•ืช ืคืฉื•ื˜ ืœื’ืจื•ื ืœืžื›ืฉื™ืจื™ ื—ืกื™ืžื” ืœืขื‘ื•ื“. ืื•ืœื™ ื’ื ื”ื’ื™ื•ื ื™ ืœื”ืคื•ืš ืืช ื”ืงื•ืžืคื™ืœืฆื™ื” ืฉืœ ืžื•ื“ื•ืœื™ 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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”