á ááľ áá ááááááľ áá°áአá¨áá°áąá á°ááááááľ áŤá¨ááᥠáĽá á፠áľááŞááľá (á áá áἠá áľáááᣠAsm.js) á¨áá˝á áŽáľ áĽáá´áľ áááá¨áľ áĽáá°áá˝á áááᢠQEMU ááá¨áŤ á¨á°áá¨á á˛áá á¨á°áá°á áá á áá á ááĽá áá á ááľ á˝áá á°ááᢠá á áľá°áŤá¨áśáš ááľáĽ ááŽáááąá á WebAssembly ááľáĽ áĽáá°áá áĽááľá ፠áĽá ááá áááś áĽáŤá´á áĽááľá°á áĽáááŤáá áá ááá
á°ááá§á á áá ááááľ ááŽáááąá á ááááá áá á ... áľáŤá áĽá¨áá á áá á, áá á áŁá á áááł, áĽá á áá, á á
áἠáá á á፠á˝áá ááľáĽ áłá¨.
á°ááŁáŤáľ
QEMU á áá° á፠áľááŞááľ áĽáá´áľ âá áá ááááľâ áá°áĽ áĽáá°áá˝á á áľááľá áľáá°ááአá áá áá á áĽá ἠáááľáŤáľ áĽá á¨áአáľá á°áśá˝á ááááľáá á°áá°áá˘
áľá á°áľ ááĽá á ááľáĄ á¨ááĽáĽ áááľ á áááŤá
á¨ááááŞáŤ áľá
á°á´ á¨áĽáá áľáŞáľ á¨áááá áľáŞáľ 2.4.1 ášáŤ áá áᢠá¨á፠áĽáŠ ááłáĽ áá áłá¨á-ááĽáĽ áááá
áŤá ᣠááááŁáľ á¨ááá 2.4 á¨á áá á¨á°á¨áá áá ᣠáĽá á¨á áá á
áááŤáá áĽáá˛áᢠmaster
. áĽá áľáááá áá á áŤáá¸áá á¨áŤá´á áľá
á°áśá˝ ááá¨áá áĽá
áľ áľááá á¨áᣠááá áá á¨áááá á°á á áŤáľáááááᢠáĽáá°á áłááá á ááááᢠááá áá ááአáĽáá
á áᥠQEMU áá áĽá á áááá áĽá á á ááľ áá
áľ á¨á°áá á¨áá áŽáľ á 10 á ááś ááťáťáá á áľáłááá˘"á áᣠá áá áááá
á áá" áĽáŹ á á°áĽáŠá á°á áłá°ááᢠáĽáá
áłáááŹá˝á ááľá¨á á ááĽá-á QEMU.js áá á-áá á°ááĽáŽ áĽá á¨ááááŞáŤá QEMU áŁááĽá-áá á ááááá á áŤááááľá (áááľá ᣠá á°ááłáłá áá á ááŤáł á¨áááááą á¨áŽáľ áąáŤáá˝á á¨ááľáŤáľ á˝á᳠ᣠáĽá "áááá á¨áááá˝ á°á áá" áĽáť áłááá ááĽáą ááłá áá, á¨áá áá á°ááŁáŤáľ á¨áá ááá°áá "áá á" áá á¨áĽá. áá
á á áá
á°áą áá
áľ á ááłááľ á¨á°ááĽáŽ á˝ááŽá˝á áá á¨á˘ ááá áá, á¨á
áááŤá ááľáĽ á ááłááľ áááŚá˝ á¨ááá áĽáááł master
á¨áĽáá áŽáľ áááááľ á¨áá¨ááŠá ᾠᣠáĽáá˛áá á ááĽáĽ áááááŤá ááľáĽ (áĽá á á
áááŤá ááľáĽ) áźáŞ á°ááá áá áĽáá˛áá ááááŁáľ áážáľ á áá¨ááá áá áá˘
á á á áááᣠááŽáśáłááá ááŁáᣠááááá˝ áááá á áĽá á á˛áľ áľáŞáľ á¨áŁáś ááááŁáľ á ááá á áá áĽáá°áá ááľááá áĽáá á áá áŁáá á á˛áľ ááá áá á áááľá¨áľá˘ master
.
áľá á°áľ ááĽá áááľ: TLP áá´
á áá á¨áą áá áľá á°áľ á áá°áá ᣠá á á ááá ᣠâá¨áľ áĽá áĽáá´áľ ááááłááľ?â áĽá á á á ááá âáĽá፠áĽáá°ááłáá?â á¨áááá áááąáá áá á áá á ááááŁáŁáľ á ááá áá áľ áááł ááŽáááľ á¨ááá á áŁá ᪠áĽáť áá ᢠá áĽááá áááłáá˝ ááľáĽ áĽááš ááŽááŤá áľáááá á ááŤá áá áᣠááᣠá á°ááĽáŽáŁ áłáŤáľááá ááľáá á áááááᢠá áá áá á áĽá ἠáá áŤá ááááᥠá áśáá áľáááśá˝áŁ ááá° á ááá áŽáľ áááŚá˝ (áĽá âá¨áááá° ááááá˝á áĽáľáŞáŤá áá á áľá¨áľ (á¨ááľá ááá፠áá)â áłáááᣠáááľ áśááŤááľáľ á á ááľ áá áľ áľá á ááľ á°á áĽáá°á°ááá¨áᣠá á᪠áĽá áľ áá°á¨áľ) ááá°.
áľá á°áľ ááĽá áśáľáľ: áááąá áłáŤáá áá° áá ááľáĽ áááŁáľ
á ááá áá áá áá á áá á ááľáááľáŠá ᣠá áá áá á áľááš á¨áááá ááááľ áááá¨á°á áĽá âáĽáá° áľáá á°áâ áááľá¨á ááľááá ᣠáááľá ᣠᨠTCG áááŁáŹá á¨áŁáś ááá ᣠáľáááá á áá áĽáá˛á áááľ á ááĽá: "á á, áá á áĽáááĽ, ááľ á ááľ áá, ááá áá áááá ááá áááŁá á á áá˝áá - TCI á¨á°áťáá áĽáá°áá áá..." á¨áá á á áá áá ááááŞáŤ áá ááá˝ á¨áá áááľá áááľáá áááľáŽá˝ áŽáľ á áááŤááá˘. áĽááą áĽáá°áááľáŁ âáááľ á°á°áĽáľá§áŃ, áá ፠á áá°áá": áŽáą á áĽááἠáááľáŽá˝ áá, ááá áá ááĽáĽá á ááá áá° áĽáą áá°ááá á áá˝áá - ááá ááá áá° á áłáš ááľáĽ á ááá ááŤá á áá áľ, áá á ᨠJS ááá á¨á°áá°á áááá áŤááŁá, áá á á ááá áŤáľááááá. á¨áá áŚáł ááłá. ááá ᣠá áá°á á ᨠRISC á ááá´áá¸á ᣠáĽá áĽáľá¨ááŁá áľá¨áľ ᣠá ááľ á¨á°ááá° áááł ááłá°á° áŽáľ á¨áááŞáŤáá áá¸á፠á ááá áĽáá°áá ááľááá á áľááá áá - áá áĽá á¨áááááá áŤááá ᣠá¨á፠á ááááá áá᳠ᣠá áἠááᢠá á°á¨ááŞáᣠáŤááá áá¨áŤáŹáŁ áááŁá áŞáŤá áá° á¨áľááá áááá ááá á¨áá°ááá áĽáá°ááááľá á°á¨áľáťááᣠáľááá á á¨á¨áľááá ááŤáŤáť á á˘áľáŽáľ áá°ááá á áŤáľááááá áĽá á ááá á á˛á˘ áá áŤáá á°ááŁá áááá¨áľ áĽáá˝áááᢠ.
ááĽá°á á¨áá
á ááá áá áá áŽáąá áĽáá°áá ááá á¨ááááŠáľ á˘áááᣠá ááľ ááľááłá ááľ áłááłáá
ááá
ááᥠáĽá áá ᨠGitHub á¨ááአá°áĽáłá¤áá˝ áááłáŽá˝ áĽá áľá ááľáľ áĽáŤááá˝ ááá˝ áĽáá° ááłáá፠áá°ááłáᣠáá áĽáá
ᣠá áľáááľ á áá ááľáĽ ááĽááľ
á¨ááŤá á°á¨á᪠áá á
- áŤá ááá áááľ áľáá ááłá ááá ááľááá
- á¨áášáááááá˝á á iOS ááᣠá ááŹá áá°á¨áľáŁ á á á¨áŤ áá áŽáľ á¨áááá¨áľ ááĽáľ áŤáá áĽá¸áá áá°áá áŞáŤ á¨áá¤áľ áá°á áá (áá áĽáááľ áá?)
- á¨áá-áľááá° ááá ááłáŤ - áá á-ááá ᣠá áĽáŽ á¨á°á°áŤ ᣠááá ááááľ firmware ᣠááá°âŚ
á¨á áłá˝ á ááľ áá áŁá áŞáá˝
á áľááľá áĽáá°á°ááááŠáľ QEMU á¨áĽá-áááá áá á¨á°áłá°á¨ ááᣠáá á áłáš á¨áááᢠá°á
á ᣠáááľá ᣠá áá°áá⌠á ááááŞáŤ á ááŤá˝ á ááá á¨á ᣠá¨á፠áἠááá¨áŽá˝ áłáŠ - áĽá áĽáľá¨áááŁá ᣠáá
á áááĽááľ ááľá°ááá áá á¨á°áá á¨á° áŁááĽá-áá áá áŤá á¨á፠á°ááááŽá˝. á á°ááŤá á¨áá
á°á¨ áľááľáł áá´á áá á°ááľáá°á áŤááľá áŽáľ á˛áŤáľáᥠá á°ááĽáŽ áá
áľáá
á˝áá áááĽáŤáᢠá¨ááŤá á ááἠáááľáŁ á áľáá á°á°ááĽáŻáᢠSharedArrayBuffers
. ááľ á ááľ á°ááááᣠááááŠá á á°ááŤáŠ á áłážá˝ á á¨á áŠáŁ á¨ááŤá á á˛áľ á ááľá á á¨á áŠáŁ á¨ááŤá áááľáłáá... á¨á፠á áá áááłá ááá á¨á°ááá á¨áá áááŞáŤ áľááłá áá á°áá°ááᣠááá áá á á፠áá
á°á¨ áľááľáł áłááá áĽá á ááŁáŞáá á¨áá¨áá áá ᣠááá á°ááłáłá ááá˘
ááá°áá áŁá
᪠á¨ááá áá á¨áá
á°á á°á¨á ááá áá áŞáŤáá˝ á¨áááťá ááᥠá ááá ááá°áľáŁ á¨á ááá á ááľ ááľááἠáĽá á á á˛áľ ááá áá° á á˛áľ ááá¨á á áá˝ááᢠá¨áĽáŞ ááá á¨áá°áłá°á¨á á JS á¨áášáá áá˝á ááᢠá ááá á˘áá á¨ááľá áá°áśá˝á áá á áá á áĽá
áááľá°áłá°á áľááá°áá á˝áአáá áááľáá? áĽáááłá áá á QEMU ááľáĽ áŤáá I/O áĽáá á¨áá°áá á¨á á áŽáŽáłáá ááᣠáĽá áĽáá
áá áá áá
á°á á°á¨á ááá ááá áá á á áá á¨ááááᢠáĽáá° áĽáľá ááᣠEmscipten ááľáááá áŤáá°ááłá°á áľáŤáá˝á áá´ áááᣠáááąááŚ
á á áá áá áŽáąá á WASM áá°á°á ááá¨á áľ áĽá á Emterpreter á áá áá áá°ááá á ááťááŠá áľááá á¨ááá ááłáŞáŤáá˝ áĽáľáŤáá á áá°áŠá (á ááŁáŠ á°á¨áłáłá áááá¨áą, áĽáá°áááľ ...). áááľá ᣠá áá¨á¨áť áĽáá°áá áŤá á áľáá á¨á°ááŁá ᨠááá ááááľ á ááĽááľá˘
- á¨á°á°á¨áá áĽááł I/O. á°á áᣠá áĽááἠá¨á°áá°ááá NVMe á¨á¤á°á á ááťá¸á áá á áĽáá áá á? đ
- á áľáłá˛áľá˛ááľ á¨á°á ááᨠáá á¨QEMU áŽáľ (á°áááᣠááá˝ á¨á°áá°á ááŁáŞáŤáá˝áŁ ááá°.)
- á á°áááá á¨á°ááá ᨠá¨áĽáááł áŽáľ áá° WASM
á¨QEMU áááŽá˝ áŁá áŞáá˝
ááááŁáľ áĽááľá á áľááľáá áĽáá°áááąáľáŁ á¨áĽáááł á ááá´áá¸áá á¨ááŽá¨á áŽáľ áĽá á¨á áľá°ááá áá˝á áááŞáŤáá˝á á¨áááá¨áľ áŽáľ á QEMU ááľáĽ á°ááŤáá°ááᢠáĽáá˛áŤáá áľáá˝ á°ááŽáá áááĄ-
- á¨áĽáááł á ááá´áá¸á á áá˘
- ááľ á ááŁáᣠáááľá ᣠKVM ááááľáá á¨áášáá á ááááľ (ááĽáááśá˝ áĽá á áľá°ááá
áľáááśá˝ áĽááľ á ááłá¸á á¨ááľáá) ᣠTCG á JIT áŽáľ á¨áľá áŚáłá˘ á¨QEMU 2.9 áááŽáŁ á áááśá áá áHAXM áááľáá á¨áášááááľ á°á¨á áľáá áłá¨ (
ááááŽá˝áᢠ) - TCG áĽá á áá á¨áá áĽá á¨áááľáá á¨áášáá áŤááá ááĽáŤááłááą á áľá°ááá á ááá´áá¸á áĽá áá áá á áá á áľá°ááá á¨á°áᨠá¨áŽáľ áááá¨áľ áľáá á ááá˘
- ... áĽá á áá ááŞáŤ - á¨á°áľá°áŤá¨á á°ááłá á áŤáᾠᣠá¨á°á áá á áááὠᣠááá°áľ ᣠáŞáŽááľ-áĽáá°áá ᣠááá°.
á áááŤá˝á áá áá á áŤáá ááŻááĄ- QEMU áááá áŽáááŠá°á áĽáť áłááá ááŽá°á°áŠáá áá°áᨠá¨á°á áá áá°áľ á á áľá°ááá á¨ááá ááľáĽ ááŽá¨á áá˝ááᣠáá á áááłá á AFL fuzzer ááááľáŽá˝ ááłáŞáŤáá˝ áľáŤ áá ááááᢠááááŁáľ á¨áá á°á áá á á¨QEMU á á áŤá áá° JS ááá áááá ááá? đ
áĽáá° á áĽááááš á¨á
á áá á¨áአááť áśááľááŽá˝áŁ QEMU á áĽáŞá áá á¨á°á°áŤáᢠconfigure
и make
. á¨áá ááá ááá¨áá ááľááá áĽáá áᥠᨠTCG áááŁáŁ á¨áá áľáá áŤáŁ áá áááᢠá¨Autoconf áá á¨áááááľ áĽáľá áá ááá°á°áľ/áááľááŤáŤáľ (á á°áá˘á áá°á¨áľ áá°ááá áľ) á áľá¸áŠá - á áĽáááąáŁ configure
QEMU á áŤáą á¨á°áťá áááľáá áĽá á¨ááá á¨á°áá ᨠá áá°ááá˘
WebAssembly
áľááá
áá
ááá WebAssembly (ᨠWASM á ááŁá á¨ááłááá) áááľá áá? áá
á¨Asm.js ááľá ááᣠá¨á áá á áá á¨áá°áŤ ááŤáľááŞááľ áŽáľ á áľááľá á áá°ááᢠá á°ááŤáá ᣠáĽáą áá á áá áááľáŽá˝ áĽá á¨á°ááťá¸ áá ᣠáĽá á˘áá˛ááá áá° áĽáą ááá áĽááłá á áŁá ááá á áá°áá-ááłáá ᣠá á
áá¸áą ááľáĽ ááááŁáá˘
áľá Asm.js áľá relooping algorithm á°áá°á áááá - áá ᨠJS áá°áŽá˝ á¨á°áá¨áąá ᾠᨠâá¨áá°á á°á¨áâ áá°áľ áááŁá áŞáŤ áááŞáŤáá˝á (áááľá ᣠá¨ááŤ-áá ᣠááá°) áá°áá á¨á áľ ááááľ áá ᢠáá á°á-á°á¨á LLVM IRᣠá á áááŁáŁáŞá áá°á°á°áŤá á¨áá˝á áŽáľ á ááĽá˘ á á°ááĽáŽáŁ á¨QEMU ááŤá¨áá áááá áá° ááá°áá á áἠááᢠáĽáá áŤá áááľááᣠáŁááľáŽáľáŁ á¨áĽáአáá¨á¨áť... áĽá á¨ááŤá áĽááŽá˝áŁ áŤááá áĽá áááľ á á!...
áĽá áá Binaryen á áá á¨ááá áľ áá ááááŤáľ áááĄ- á á°ááĽáŽ á WASM ááľáĽ á¨áá¨áášáľ áá á áá áľ áŤáá¸á á¨áá°á á°á¨á áĽááŽá˝á ááá á áá˝ááᢠááá áá á ááŤá¨áá¸á áŤááľ áá°á¨áłá áĽááŽá˝ áĽá á˝áááŽá˝ ááŤá áŽáľ áááŁáľ áá˝ááᢠá°á áᣠá¨ááĽá á´áĽá áá¨ááť á áá¸áąá á¨ááá˝ C/C++ á¤áá á áá°áĽáá áĽáŹ á°áááŹáŤááá˘
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
-á°:
- á áááá áľá-á áá áá áá áŤá á ááááá˘áŤ áĽá áľááľ áá áŤá á áá (á¨ááááááá áŤá á á áá ᣠá¨ááááááá áŤá á - áĽáŤáá á á áłáš âáá á áá áááâ áĽá ááá áá á¨á áá áááŁá áŽáľ ááľáĽ áá áĽáá°ááá á á¨á áá ááᢠ...)
- á¨á áľá°ááá áááŞáŤáá˝á áááŁá á-á x86 ᣠáĽá á TCI ááľáĽ áĽááłá ᣠáááŞáŤáá˝ á ááŤá˝ á áá°áŁááŠá ᣠáá á áŽáľ ááľ ááľáĽ á ááŤá˝ áááŞáŤáá˝á áłááá áááŞáŤáá˝á áá° Binaryen á¤á°-áá˝áááľ á ááááŽá˝ á áľááŁáá ᣠáľááá áĽááá: 4 áŁááľ
- áááŁá áá ááááľ á ááŤá áááŞáŤáá˝á ááŤááá áá˝áá - á Binaryen ááľáĽ áŤááááá áá áĽááŤáľáłáá ᣠá ááŁá á¨áá¨áá áá° áŤáą ááá áĽáá˛á áŤáľáá
- á áááá á¨á°á á¨áá á¨TLB áá¸á፠áááłá áá á áľááľ ááᢠáĽáááłá áá á QEMU ááľáĽ ááá ááá á¨áŁáľ áá: ááá áĽááłá á¨áĽáááłáá MMU áááľ ááľáĽ á ááľááŁáľ á¸áá / áá¨ááťá á¨ááŤá¨ááá á¨á¨áłáľ á°ááŁáŤáľ á˘ááŠá (á áá áŤá áĽá á¨áľ áĽááááá?), á¨áľááá áá¸ááŤá¸áá á ááá á ááá áŤáľáááŁá, á¨ááááŁá áŞáŤá áá°áľ á ááĽáł áá° áľáááľ áĽááŽá˝ áááá°áľ ááš ááᢠáĽáŤáá á áá ááá á ááľáĽ á¨áľáá ááŤáŤáť á áľáá˝ áĽá ááŁá á¨áľááá á á°á á°á¨á°á á áŁá áááŁá áá?
- áĽáá
á ááľ ááá áááľ á¨á°áŤá ááááŚá˝á ááá ááľá°áŤá¨áᣠá˛á˘á á á ááľ á°ááŁá ááĽáŤáľá ááááľ áĽá áĽáá° á ááŤá áááľ áľááá˝ áááá˝ áá˝ááá˘
inline
- á°ááŁáŤáľflush_icache_range
(ááá áá áá á¨áĽá ááłá á áá°áá)
ááá tcg-target.inc.c
áĽááἠááᣠá áá á áá á á áŁá áľáá
áá áĽá á ááŤáł á áľááłá
á°ááŁáŤáľá ááááá˘
- á áááá ᣠá á¨áľáááš áŚááŹá°áŽá˝ áá á¨áľáááš áááŞáŤáá˝ áá°áŠ áĽáá°áá˝á áá áá°áŚá˝á á¨ááŽá˘ á¨áá á°áá á ááá á áĽá á¨á°ááł
- á ááľ á¨ááľáĽ áŁááľáŽáľ áááŞáŤ á¨áááľáľ á°ááŁá
- áĽáá˛áá á¨áłáľ á°ááŁáŤáľá áĽáá
ááľááἠáá˝áá, áĽá áĽáá˛áá á¨áááááἠá°ááŁáŤáľá ᨠáá áá áá˝áá
tcg/tcg.c
ááŤá´, á¨áá¨á°ááá áľááľ áááŤáá-á áááĽáá á¨áľááá áĽááł á¨ááááŞáŤ áááśá˝ ááľáĽ, á áŤáľ á áááá˝á áťááŠá-á¨ááááŞáŤ ááááľ (á á áŤáŁá˘á á¨á°áá°á áĽá´áľ) 0xFFFFFFFF
á¨á˛á˘áá áá
áłá áááł á¨áááľáá)ᣠá ááľáŁ á¨á°áá ᨠááá áĽá ááá¨á á áľááľ ááĽáᢠááááŞáŤ áá ááááą á°ááá§á 0xFFFFFFFF - n
á¨áľ n
- áľáá˝ á áááłá ááĽá, áĽá á áĽáŤááłááą áá á á áľá°áááá á˛ááá á 1. á˛á°ááľ áá¨ááŤá 0xFFFFFFFE
, áá ááá á°áŤááˇá, ááá á á°ááŁá á áá á¨áĽ ááľáĽ á°ááá§á, áá° áľáá˝ "á áľáááŞ" ááĽáˇá, áá
á á áááá á¨ááá¨á áľ áá ááᎠáá á. tcg_qemu_tb_exec
áĽá ááá á¨QEMU áá
á°á¨ áľááľáł á°áááˇáá˘
ááá˛áŽá˝á áááĽáŤáŤáľ, "ááŤá˝, á áá áľáá˝ ááľáĽ áááŽáááą áἠáá áŤá á á¨á°á ááá áá ...". ááá ᣠáľááľáłá á¨áá áŚáł áĽá¨áá°á° áá áᢠá¨áá á á áá á QEMU á¨áá°áłá°á áá á°á¨ áľááľáł áá á! á¨áááĽááá áááŞáŤ á áá˝áá áľ áá (áááŤá ᣠáááľá á áá) ᣠá ááá áá°á áĽá á áá áŚáł á¨áá á¨áá á¨áá°áá áŽáľ áá á¨á ᣠáá áá á áá¨áłáᢠá áĽáááąáŁ á ááá áááłáŁ QEMU á áááłá áľ áá áá á°á¨ áľááľáłá áááľáŁá áĽá á¨ááá¨áá áŽáľ áĽá፠áá˝ááᢠááľáááŤá á˛áŤáá áŽáą ááŁáá áĽá á¨áááĽáá á áĽáą áŚáł ááá ááááŤá.
áŽáąá áŤá áá á ááᣠá á áľááľ ááĽá áŤáá áĽáááľ á ááááŞáŤá ááá፠áá áŁááłáá ááľ áá áľá
á°áľ á¨áá ááá á ááľááá
á á¨áŁáľ ááľááľ áá áĽááłáááľá
áĽáá°ááá° á°á¨áłáᢠáá á áá áá á°ááŁáŹá áááá ááąá á¨áá˝áá ááá? á¨Emscripten ááá˘áá˝ áĽáá°ááááŠáľ á ááľ á˝áá á˛áŤááĽáá á¨á°áááá áŽáľ áá° á¤á°á á áááŹá˝á áááľáŠááľáŁ ááá áŞá¨ááľ-áľáá á áŤááľá áľ... á á á áááᣠá áá¨á¨áť á ááľ ááá ááá á°ááááĽáŠáĄ ááĽáŤááłááą áĽááᢠá struct TranslationBlock
á¨áááťá áá. á¨áľ áĽáá°áá áááľ... áá ááᣠáá á ááľ ááľáĽ á¨ááááą á ááľá˘ áá
áá á ááááἠááŤáá˝ áá ááá áááá áá°áአ(á˘áŤááľ á ááłááśáš) áĽá á ááá á¨á áľááľ ááĽáŠá áá¨ááአáĽá á¨ááŠáľá áááľ áá° áá á áľá°áááá ááᢠstruct TranslationBlock
á¨áľááá áá¸á፠áłáá á˛ááá á ááĽááľ ááŤáá á¨áá˝á áá á á¨á°ááá áááá ááá á áĽá áá
á°á¨ áľááľáłá ááť ááľá¨áá˘
á ááłááľ ááŤáá˝ áááŤá: áááłá, á áŽáľ ááľ ááľáĽ ááááľ á¨á°á°á¨ááŁá¸á á áááá˝ - á ááłááśáš á ááá áá¸á BinaryenExpressionRef
ᣠáááľá ᣠá á°áá á¨á áá°á¨áłá áĽááł ááľáĽ á ááľáá áá áááἠáŤááŁá¸áá á áááážá˝ áááá¨áłá ᣠá¨áá á BBs ááŤá¨á á¨áá°á¨á á˝ááá áááł áá ᣠá¨áá á¨áľ áááľ áĽááłáá áľ áá ᢠá°á
áᣠáĽáá° á
áľá áááłá ââáááááľ á¨ááŤáľáááá¸á á Relooper á áľááľáá á¨á°ááá áĽááŽá˝ á áᢠáĽááąá áááá¨áľ ᣠááá á˘áŤááľ á á áŤáľ áŁááľ á¨á°áľá°áŤá¨á áá¸á á¨ááá áááľ áĽá
á áá áááá ᣠáľáááá ááááŤá á áŁá áľáášá áááľ á˘áľ á á°á
á áá áá áá˝áá ᣠá áľááá á¨áá áĽáąá ááľáááľ áĽáť ááľáłááľ áŤáľáááááłáᢠá áááŤá˝á áá ᨠTCG loop ááááŁáľ ááááŤáąá ááááá¨áľ á QEMU ááľáĽ áĽáá°áá
áŤá áááŤáá˝ ááľááá áĽá
á áá ááááá˘
Binaryen á áá áá
á WebAssembly ááľáĽ áŤá áááá˝ á°ááŁáŤáľá áááá, áĽáŤááłááłá¸á á áŤáá áááá, áĽáąá ááá፠áá. á áááážá˝ áŤáá°áááą áĽá áááľáŽá˝ áľáŤáá˝ áá¸á, áĽááŽá˝ á¨ááá˝ ááááŤáá˝á ááááŽá˝ áŤáŤá°áą, á¨ááĽáĽá áá°áľ, ááá°. áá°á áĽáŹ áĽáá°á°ááááŠáľáŁ áĽáá áŤáá á¨ááĽáĽá áá°áľ áá áĽáá° á¨áá°á á°á¨á á áááŤáá˝áŁ loopsᣠá¨á°ááŁá áĽáŞáá˝áŁ ááá° á¨á°á°áŤá ááᢠáá°ááŁáŽá˝ á¨áááą ááááŽá˝ á ááá áá á áá°ááááᣠááá áá á ááá˝áŁ áá á JS ááľáĽá˘ á ááá áá á°ááááŽá˝á á á, ááá áá áĽá á áá°á áááŠá, áľááá áľááĽááą á ááááááľá.
á°ááŁáŤáľ áĽáá˛á á¨á áŤáŁá˘ á°ááááŽá˝ á áá¸á ᣠá¨áᎠá¨á°áá አᣠá ááááľ: int32 / int64 / á°ááłáá / áľááĽá˘ á áá áááł, á¨ááááŞáŤá n á¨á áŤáŁá˘ á°ááááŽá˝ áá° á°ááŁáŠ á¨áá°ááá ááááŽá˝ áá¸á. áĽáŁááá áŤáľáłááą ááá áĽááłá áĽáá ááá ááá á¨ááĽáĽá áá°áľ á ááá áá á áá áá á°á á°á¨á áŁáááá á˘áá˛ááŽá˝ á ááá "á¨á°áá¨á / áŤáá°áá¨á" áŁá áŞá á áá¸á¨áá: ááĽáŠ áĽáá´áľ áĽáá°áá ፠á áŚááŹá˝á áŽáľ áá á¨á°áá°á¨á° áá.
á á á ááá, Binaryen áŤáááŁá
ááá ááᣠáŤáá ááľááá áááł ááá á áĽá á¨á áľá°ááá ááłáá áłáá°áá áŽáľá á á á¨áŤ áá ááá°ááá á¨áááᣠáá áá á áááᎠáá° C++ ááá ááľááŁáľ ááááŤáłá ááá áá˝áá áĽá á¨á፠á ááĽáł á¨áááĽá¨áŞáá C++ á¤áá á á ááĽáł áŤáľá°áłáľáŠ áĽá áááááľá á ááá á¨á°á°áŠ áá á ááŤáá˝.
áľááá á¨áááááľá áŽáľ áááá á
// наŃŃŃОиŃŃ ĐłĐťĐžĐąĐ°ĐťŃĐ˝ŃĐľ паŃаПоŃŃŃ (ПОМнО пОПонŃŃŃ ĐżĐžŃОП)
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);
... ááá ááá á¨á¨áłáᣠáá ááłáŁ áá ááŹáąá áááá¨á áĽáť ááᣠáĽá ááááŽáš á á°ááľ ááľáĽ á áá˘
áĽá á áá ááŤá-áááľ-áááľ ááááŤáᣠáĽáá°áá áŤá ááááĄ-
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 áááá˝á á áá ááááľ ááááááľ áĽá á á°ááłáłá áá á¨á°á ááአá°ááŁáŤáľá á ááĽááľ áááľá¨áľ á ááľ áľááľá á°áá ᨠ(áá° á áľáááŞá áááľááŁáľ á¨á°ááŁá á°áá á¨áĽ) áĽá á¨á°áá አá°ááŁáŤáľ áĽá፠á°ááá ááᢠá˘áá´ááľá á ááĽááľ áááľááľ á¨áᎠáá á¨áľááá áĽáá á˘áá´ááľ ááááŞáŤ áá áĽáá° áĽáą áĽá
á áá áá áá áᣠááá áá áá
á áááá á áá áá á¨á°á°áá á˘áá´ááľ á ááá á ááľá ááľáĽ ááá á ááá¨á˘ struct TranslationBlock
.
á áááŤá˝á áá,
áááá ááá áá. ááááŁáľ ááá ááááľ áŤáá áá á˝áá ááá áá˝áá. áá¸áá á˘áŤááľ áááŤá áĽáť á¨ááá ááłáŞáŤáá˝ áĽáá˛á°áŠ áŤáľáá. á JS á áá áĽáá°á°ááá°á á¨WebAssembly áááá˝á áá ááá áŤáá°ááłá°á ááľá¨á ááááŤáłá ááá áá˝ááᣠááááŤáąá á¤á°á ááá áĽáľáŞááá áľá¨áľ áá á áá ááľá¨á á¨áá˝á á áľá°ááá á ááá á áá˘
á áá¨á¨áťá áĽááá áá˝áĄ- á 32-á˘áľ á ááá´áá¸á áá áááľáŽá˝ á°áĽáľá ááᣠááá áá áŽáąáŁ á ááľáłááť áľáŤáá˝áŁ á¨Binaryen áááŁáľáŁ ááá ááᣠááá áá áŚáł áá áŁá 2-á˘áľ á¨á áľáŤáť áŚáł áááá 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));
}
á¨áŤáááŞááľ áá á°áłáá á áááá áĽáááľ áá ᣠáá áĽáá° áĽáľá áá ᣠáŤáááŞááľ áĽáŤáą áááá á°á á¨á፠áŤáľááŁá :)
ááááŁáľ á ááľ á°á áá á¨áĽá áŽáľ áĽáá´áľ áĽáá°áá°áŤ á¨á°áťá ááĽáŤáŞáŤ áá°áĽ áááá...
ááá: hab.com