ืืคื ื ืืื ืฉื ืื ืคืืจืืก ืืืืจื
- ืงืื ืคืชืื
- ืืืืืช ืืขืืื ืืื ืื ืื ืืชืงื ืืืื
- ืืืืืช ืขืืืื ืืืฆื ืืชืืจืืื
- ืชืืืื ืืืกืคืจ ืจื ืฉื ืืจืืืืงืืืจืืช ืืืจื ืืืืจื
ืืืื ืื ืงืืื ืืฉืืืฉืืช, ืื ื ืืืื ืืืกืืืจ ืืขืช ืฉืืืขืฉื, ืืืฆื TCI, ืื ืืชืคืจืฉืืช ืืืจืืืช ืืืื ืช ืืืืจื ืขืฆืื, ืืื ื-bytecode ืืืชืงืื ืืื, ืืื ืื ืื ืืฉื ื ืืช ืืืืืช - ืขื ืื ืช ืืื ืืช ืืืืคืขืื Qemu ืขื ืืจืืืืงืืืจื ืืืฉื, ืื ืืชืืื ืืืืื, ืืกืคืืง ืืืืจ C - ืืชืืืช ืืืืื ืงืื ืืืืื ืืืืืืืช.
ืืขืืฉืื, ืืืจื ืฉื ืชืืื ืฉื ืืชืขืกืงืืช ื ืื ืืื ืขื ืงืื ืืืงืืจ ืฉื Qemu ืืืื ื ืืคื ืื, ืืืคืืข ืื ืืืคืืก ืขืืื, ืฉืื ืืืจ ืืคืฉืจ ืืืจืืฅ, ืืืฉื, ืืช ืืขืจืืช ืืืคืขืื Kolibri.
ืื ืื Emscripten
ืืืื, ืืืคืืขื ืืืืจืื ืจืืื, ืฉืืชืืฆืื ืืกืืคืืช ืฉืืื ืืื JavaScript. ืืืงื, ืืื Type Script, ื ืืขืื ืืืงืืจ ืืืืืช ืืืจื ืืืืื ืืืืชืจ ืืืชืื ืขืืืจ ืืืื ืืจื ื. ืืื ืขื ืืืช, Emscripten ืืื ืืจื ืืงืืช ืงืื C ืื C++ ืงืืื ืืืืืจ ืืืชื ืืฆืืจื ืื ืืชื ืช ืืงืจืืื ืืืคืืคื. ืขึทื
ื ืืกืืื ืจืืฉืื
ืืืืคื ืืืื, ืื ื ืื ืืืื ืืจืืฉืื ืฉืืขืื ืืช ืืจืขืืื ืฉื ืืขืืจื ืฉื Qemu ื-JavaScript. ื ืฉืืื ืฉืืื ืืคืืจืื ReactOS ืื ืื ืืคืฉืจื ืืืืฆืขืืช Emscripten. ืขืื ืงืืื ืืื, ืืื ืฉืืืขืืช ืฉืคืืจืืก ืืืืจื ืขืฉื ืืืช ืืืืคื ืืืฉื, ืืื ืืืืจื ื ืขื jslinux, ืฉืืื ืืืืืข ืื ืืื ืจืง ื ืืกืืื ืืืฉืื ืืืฆืืขืื ืืกืคืงืื ืืืืคื ืืื ื ื-JS, ืืืื ื ืืชื ืืืคืก. ืืืืืจ ืืืชืจ, Virtual x86 ื ืืชื - ืคืืจืกืื ืขืืืจื ืืงืืจืืช ืื ืืขืืจืคืืื, ืืืืืืจ, ื"ืจืืืืืื" ืืืืื ืืืชืจ ืฉื ืืืืืืฆืื ืืคืฉืจื ืืืฉืชืืฉ ื-SeaBIOS ืืชืืจ ืงืืฉืื. ืื ืืกืฃ, ืืื ืืคืืืช ื ืืกืืื ืืื ืืืขืืืจ ืืช Qemu ืืืืฆืขืืช Emscripten - ื ืืกืืชื ืืขืฉืืช ืืืช
ืื, ืื ื ืจืื, ืื ื ืืืงืืจืืช, ืื ื Emscripten - ืงื ืืืชื ืืืืืืจ. ืืื ืืฉ ืื ืกืคืจืืืช ืฉ-Qemu ืชืืื ืืื, ืืกืคืจืืืช ืฉืืกืคืจืืืช ืืืื ืชืืืืืช ืืื ืืื', ืืืืช ืืื ืืื
ืืืชืืื ืืื ืจืขืืื ืคืฉืื ืืืชืื ืชืืืืฃ ื-libffi ืขื JS ืืืืจืืฅ ืืืืงืืช ืกืื ืืจืืืืช, ืืื ืืกืืฃ ืืชืืืืืชื ืืื ืืขืฉืืช ืืช ืงืืฆื ื-header ืฉืื ืื ืฉืื ืืขืืื ืขื ืืงืื ืืงืืื - ืื ืื ื ืืืื ืืขืฉืืช, ืืื ืฉืืืืจืื, "ืืื ืืืฉืืืืช ืื ืื ืืืจืืืืช "ืืื ืื ืื ื ืื ืื ืืืคืฉืื?" ืืืืชื ืฆืจืื ืืืขืืืจ ืืช libffi ืืืจืืืืงืืืจื ืืืจืช, ืืืืืื - ืืืจืื ืืืื, ื-Emscripten ืืฉ ืื ืคืงืืืืช ืืืงืจื ืืืจืืื ืืืืืขืช (ื-Javascript, ืื - ืืืื, ืื ืืฉื ื ืื ืืืจืืืืงืืืจื, ืื ืืืกืืืืจ), ืืื ืืช ืืืืืืช ืืืจืืฅ ืงืื ืฉื ืืฆืจ ืชืื ืืื ืชื ืืขื. ืืืืคื ืืืื, ืืืืจ ืืชืขืกืงืืช ืขื ืฉืืจื libffi ืืชืืืืื ืืคืืืคืืจืื ืืืฉื ืืื ืื, ืงืืืืชื ืงืื ืงืืืคืืืฆืื ืืืจืฆืชื ืืืชื ืืืืืงื ืืจืืฉืื ื ืฉื ืชืงืืชื ืื. ืืืคืชืขืชื, ืืืืื ืืฆืืื. ืืืื ืืืืืื ืืช ืฉืื - ืืื ืืืืื, ืื ืขืื ืืืืฉืงื ืืจืืฉืื ื - ืื ื, ืขืืืื ืื ืืืืื ืืืจืื ืขืื ืื, ืืืืชื ืืืกืชืื ืฉืื ืขื ืืงืื ืฉืืชืงืื, ืืื ืืืขืจืื ืืืื ืืืคืืจ ืืืื. ืืื ืืฉืชืืขืชื ืืคืขื ืืฉื ืืื - ืืืืจ ืืืืื ืฉืืคืื ืงืฆืื ืฉืื ืขืฉืชื ืืื ffi_call
- ืื ืืืืื ืขื ืฉืืื ืืืฆืืืช. ืื ืืืืชื ืฉืืื ืขืฆืื. ืื ืฉืืืชื ืืช ืืงืฉืช ืืืฉืืื ืืจืืฉืื ื ืฉืื, ืฉืชืืงื ื ืืขืืช ืืืืื ืฉืืจืืจื ืืื ืชืืืื ืืืืืืคืืืื - ืืื ืืืฉืืืช ืืกืคืจืื ืืืืชืืื a == b
ืืืคืืื ืืื a - b < EPS
- ืฆืจืื ืืืืืจ ืื ืืช ืืืืืื, ืืืจืช 0 ืืชืืจืจ ืืฉืืื ืืืื ื-1/3... ืืืืคื ืืืื, ืืืขืชื ืืคืืจื ืืกืืื ืฉื libffi, ืฉืขืืืจ ืืช ืืืืื ืื ืืคืฉืืืื ืืืืชืจ, ืืืืชื glib ืืื ืืืืืจ - ืืืืืชื ืฉืื ื ืืืฅ, ืืืกืืฃ ืืช ืื ืืืืืจ ืืืชืจ. ืืืื ืงืืืื, ืื ื ืืืื ืฉืืคื ืฉืืชืืจืจ, ืืืืืจ ืืคืืื ืื ืืื ืืช ืืคืื ืงืฆืื libffi ืืงืื ืืกืืคื.
ืืื, ืืคื ืฉืืืจ ืืืจืชื, ืืฉื ื ืืื ืืืืืืช, ืืืื ืืฉืืืืฉ ืืืืคืฉื ืืืชื ืืืืช ืื ืืืืืจืช ืืืื ืืื, ืืืกืชืจื ืชืืื ื ืื ื ืขืืื ืืืชืจ - JavaScript ืืขืืฆืืื ืืื ื ืชืืื ื-multithreading ืขื ืืืืจืื ืืฉืืชืฃ. ืืืืคื ืขืงืจืื ื, ืื ืืืื ืืืืงืจื ืืืจื ืืื ืจืขืืื ืืื, ืืื ืื ืขืืืจ ืืขืืจืช ืงืื ืฉืืืจืืืืงืืืจื ืฉืื ืงืฉืืจื ื-C threads. ืืืืคื ืืืื, ืคืืืจืคืืงืก ืืชื ืกื ืืชืืืื ืืขืืืืื ืืฉืืชืคืื, ืื-Emscripten ืืฉ ืืืฉืื pthread ืขืืืจื, ืืื ืื ืจืฆืืชื ืืกืืื ืขืืื. ื ืืืฆืชื ืืื ืืื ืืืืฆืื ืืช ื-multithreading ืืงืื ื-Qemu - ืืืืืจ, ืืืจืจ ืืืื ื-threads ืจืฆืื, ืืืขืืืจ ืืช ืืืฃ ืืืืืื ืืคืืขืืช ืืฉืจืฉืืจ ืืื ืืคืื ืงืฆืื ื ืคืจืืช, ืืืงืจืื ืืคืื ืงืฆืืืช ืืืื ืืืช ืืืช ืืืืืืื ืืจืืฉืืช.
ื ืืกืืื ืฉื ื
ืืฉืื ืืกืืื, ืืชืืจืจ ืฉืืืขืื ืขืืืื ืงืืืืช, ืืฉืืืืคื ืืงืจืืืช ืฉื ืงืืืื ืกืืื ืืงืื ืื ืชืืืื ืืฉืื ืืื. ืืกืงื ื: ืขืืื ื ืืขืฉืืช ืืืืฉืื ืฉืืืชืืืช ืฉื ืชืืืื ืืืกืคืช ืงืืืื. ืืื ื ืืงืื ืืจืกื 2.4.1 ืฉืืืืชื ืืจืืื ืื (ืื 2.5.0, ืื ืื ืืืืข ืืืื ืืืืื ืืืจืกื ืืืืฉื ืฉืขืืืื ืื ื ืชืคืกื, ืืืฉ ืื ืืกืคืืง ืืืืื ืืฉืื ), ืืืืืจ ืืจืืฉืื ืืื ืืฉืืชื ืืืชื ืืืืื thread-posix.c
. ืืืื, ืืืืืจ, ืืื ืืืื: ืื ืืืฉืื ื ืืกื ืืืฆืข ืคืขืืื ืืืืืืื ืืืกืืื, ืืคืื ืงืฆืื ื ืงืจืื ืืื abort()
- ืืืืื, ืื ืื ืคืชืจ ืืช ืื ืืืขืืืช ืืืช ืืืช, ืืื ืืคืืืช ืื ืืื ืืืืฉืื ื ืขืื ืืืชืจ ืืืฉืจ ืืงืื ืืฉืงื ื ืชืื ืื ืื ืขืงืืืื.
ืืืืคื ืืืื, ืืคืฉืจืืืืช Emscripten ืืืขืืืืช ืืืื ืืืขืืจืช ืงืื ื-JS -s ASSERTIONS=1 -s SAFE_HEAP=1
- ืื ืชืืคืกืื ืกืืืื ืืกืืืืื ืฉื ืืชื ืืืืช ืื ืืืืืจืช, ืืื ืงืจืืืืช ืืืชืืืช ืื ืืืืฉืจืช (ืฉืื ืขืืื ืืงื ื ืืื ืขื ืืงืื ืฉื ืืขืจืืื ืืืงืืืื ืืื HEAP32[addr >> 2] = 1
) ืื ืงืจืืื ืืคืื ืงืฆืื ืขื ืืกืคืจ ืื ื ืืื ืฉื ืืจืืืื ืืื.
ืืื, ืฉืืืืืช ืืืฉืืจ ืื ื ืืฉื ื ืคืจื. ืืคื ืฉืืืจ ืืืจืชื, ื-Qemu ืืฉ ืงืฆื ืคืจืฉื ื "ืื ืืื" ืืืฆืืจืช ืงืื TCI (ืืชืืจืืื ืงืื ืืขืืจ), ืืืื ืืื ืืช ืืืืคืขืื ืืช Qemu ืขื ืืจืืืืงืืืจื ืืืฉื, ืื ืืชืืื ืืืืื, ืืกืคืืง ืืืืจ C. ืืืืืช ืืคืชื. "ืื ืืชื ืืจ ืืื". ืืื ืื ืืื, ืืืชืืจืจ ืฉ-TCI ืืฉืชืืฉืช ืืืืฉื ืื ืืืืฉืจืช ืืขืช ื ืืชืื ื-bytecode ืฉืื. ืืืืืจ, ืืื ืืื ื ืืจืืืืงืืืจืืช ARM ืืืจืืืืงืืืจืืช ืืืจืืช ืขื ืืืฉื ืืคืืืกืช ืืืืจื, Qemu ืืืฆืข ืงืืืคืืืฆืื ืื ืืฉ ืืื TCG backend ืจืืื ืฉืืืืฆืจ ืงืื ืืงืืจื, ืืื ืืื TCI ืืขืืื ืขืืืื ืื ืฉืืื ืืืจืช. ืขื ืืืช, ืืคื ืฉืืชืืจืจ, ืชืืขืื TCI ืืฆืืืข ืืืืจืืจ ืขื ืืฉืื ืืืื. ืืชืืฆืื ืืื ื ืืกืคื ืืงืื ืงืจืืืืช ืคืื ืงืฆืื ืืงืจืืื ืื ืืืืฉืจืช, ืฉื ืืฆืื ืืืืง ืืืจ ืฉื Qemu.
ืืจืก ืขืจืืื
ืืชืืฆืื ืืื, ืชืืงื ื ืืืฉื ืื ืืืืฉืจืช ื-TCI, ื ืืฆืจื ืืืืื ืจืืฉืืช ืืฉืจ ืืชืืจื ืงืจืื ืืืขืื, RCU ืืขืื ืืื ืืืจืื ืงืื ืื. ืืื ืื ื ืืฉืืง ืืช Qemu ืขื ืืืคืฉืจืืช -d exec,in_asm,out_asm
, ืื ืฉืืืืจ ืฉืืชื ืฆืจืื ืืืืจ ืืืื ืืืืงืื ืฉื ืงืื ืืืืฆืขืื, ืืื ืืืื ืืฉืืืืจ ืืืชืื ืื ืืื ืงืื ืืืืจื, ืื ืืคื ืืงืื ืืืืจื (ืืืงืจื ืื, bytecode). ืื ืืชืืื, ืืืฆืข ืืกืคืจ ืืืืงืื ืฉื ืชืจืืื, ืืืชื ืืช ืืืืขืช ืืืชืืจ ืืืืืื ืฉืืฉืืจืชื ืฉ-RCU ืืชืืื ืขืืฉืื ื... ืงืืจืก abort()
ืืชืื ืคืื ืงืฆืื free()
. ืขื ืืื ืืชืขืกืงืืช ืขื ืืคืื ืงืฆืื free()
ืืฆืืื ื ืืืืืช ืฉืืจืืฉ ืืืืง ืืขืจืืื, ืฉื ืืฆื ืืฉืืื ื ืืชืื ืฉืืคื ื ืืืืืจืื ืฉืืืงืฆื, ืืืงืื ืืืื ืืืืืง ืื ืืฉืื ืืืื, ืืื ืืื.
ืืจืก ืืขืจืืื - ืืื ืืืื... ืืืงืจื ืืื, ืืฉ ืชืจืืคื ืฉืืืืฉืืช - ืืืืชื ืืงืืจืืช (ืื ืืคืฉืจ) ืืจืืืื ืืื ืืจื ืืืื ืืืจืืฆื ืืืชื ืชืืช Valgrind. ืืืืจ ืืื ืื, ืืืื ืืจื ืืื ืืืื. ืื ื ืืฉืืง ืืืชื ืขื ืืืชื ืืคืฉืจืืืืช - ืืื ืงืืจืก ืืคืืื ืืืื ืืืชืืื, ืืคื ื ืฉืืื ืืืืข ืืืืฆืืข ืืคืืขื. ืื ืื ื ืขืื, ืืืืื - ืืื ืื ืจืื, ืืืงืืจืืช ืื ืืื ืืืืืง ืืืื, ืืื ืื ืืคืชืืข, ืื ืืชืฆืืจื ืืกืชืืื ืขื ืืคืฉืจืืืืช ืงืฆืช ืฉืื ืืช, ืืื ืืฉ ืื Valgrind - ืงืืื ืื ื ืืชืงื ืืช ืืืื ืืื, ืืื, ืื ืืืื ืื ืืื , ืืืงืืจื ืืืคืืข. ืื ื ืืจืืฅ ืืช ืืืชื ืืืืจ ืชืืช Valgrind... Y-y-y, y-y-y, ืื-ืื, ืื ืืชืืื, ืขืืจ ืืชืืื ืืจืืื ืืขืืจ ืืช ืืืื ืืืงืืจื ืืื ืืืืจื ืืืช ืขื ืืืฉื ืื ื ืืื ื ืืืืืจืื, ืฉืื ืืืืจ ืขื ื ืคืืืืช. ืืืืื, ืืื ืฉืืืืจืื, ืื ืืืื ื ืืืชื ืืื - ืชืืื ืืช ืงืืจืกืช ืืคืกืืงื ืืงืจืืก ืืฉืืื ืืืคืขืืช ืชืืช Walgrind. ืื ืื ืืื ืชืขืืืื. ืืืฉืขืจื ืฉืื ืืื ืฉืคืขื ืืืช ืืงืจืืช ืืืืจืื ืื ืืืืืช ืืืืจ ืืชืจืกืงืืช ืืืืื ืืืชืืื, gdb ืืจืื ืขืืืื memset
-a ืขื ืืฆืืืข ืืืงื ืืืืฆืขืืช ืืื ืืื mmx
, ืื xmm
ืจืืฉืืื, ืื ืืืื ืื ืืืืชื ืืืืืฉืื ืฉืืืืช ืืืฉืืจ, ืื ืื ืขืืืื ืงืฉื ืืืืืื.
ืืกืืจ, ื ืจืื ืฉืืืจืื ื ืื ืขืืืจ ืืื. ืืืื ืืชืืื ืืืืจ ืืื ืืืขืื - ื ืจืื ืฉืืื ืืคืืื ืืชืืื, ืืื ืงืืจืก ืืกืืืืช ืื ืืืืขืืช ืืืืืืื ืืืื ืืืจืืข ืฉืืืื ืืื ืืืชืจืืฉ ืืคื ื ืืืืืื ื ืืืจืืืช. ืืจืื ืืื ืืคืืื ืื ืืื ืืจืืจ ืืื ืืืฉืช. ืืกืืคื ืฉื ืืืจ, ืขืืืื ืืืืชื ืฆืจืื ืืฉืืช ืืืืฆืข ื ืืคืื ืืืืื. ืืืคืกืช ืื ืฉืืืืชืจืช ื ืืชืื ืืืชื ืืจืืชื ืฉืืื ืื ื ืจืืืช ืืื ืืกืคืจ, ืืื ืกืื ืฉื ื ืชืื ืื ืืื ืืจืืื. ืืื ื, ืืืืจืืืช ืืืื ืืจืืช ืืื ื ืืฆืื ืืงืืืฅ ื-BIOS โ ืืืืืจ, ืขืืฉืื ืืคืฉืจ ืืื ืืืืจ ืืืืืืื ืกืืืจ ืฉืืืืืจ ื-buffer overflow, ืืืคืืื ืืจืืจ ืฉืืื ื ืืชื ืืืืืจ ืืื. ืืืื, ืื ืืฉืื ืืื - ื-Emscripten, ืืืจืื ืืืื, ืืื ืืงืจืื ืฉื ืืจืื ืืืชืืืืช, ืื ืืื ืื ืืืจืื, ืื ืืชื ืืืื ืืืชืื ืืืคืฉืื ืืืืฆืข ืืงืื ืืื ืืืืฆืื ื ืชืื ืื ืืคื ืืฆืืืข ืืืืฉืงื ืืืืจืื ื, ืืกืชืืื ืขื ืื ืชืื ืื, ืืกืชืืื ืขื ืืืฆืืืข, ืืื ืื ืื ืืฉืชื ื, ืงืืื ืืืืจ ืืืืฉืื. ื ืืื, ืืืงื ืืื ืืงืืช ืืงืฉืจ ืืืจื ืื ืฉืื ืื, ืืื ืื ืืชื ืืืื ืืขืฉืืช? ืืชืืฆืื ืืื, ื ืืฆืื ืฉืืจื ืกืคืฆืืคืืช ืฉืืขืชืืงื ืืช ื-BIOS ืืืืืืจ ืืืื ื ืืืืืจืื ืืืืจื - ืืืื, ืื ืืื ืืกืคืืง ืืงืื ืืืืืจ. ืืฆืืืช ืืืงืืจ ืฉื ืืชืืืช ืืืืืจ ืืืืืจื ืืื ืืืืืื ืืคืื ืงืฆืื qemu_anon_ram_alloc
ืืงืืืฅ oslib-posix.c
- ืืืืืืื ืฉื ืืื ืื: ืืคืขืืื ืื ืืืื ืืืืืช ืฉืืืืฉื ืืืืฉืจ ืืช ืืืชืืืช ืืขืืื ืขื ืง ืืืืื 2 ืืื-ืืืื, ืืฉืืื ืื ื ืืงืฉ mmap
ืชืืืื ืขืื ืงืฆืช, ืืื ื ืืืืจ ืืช ืืขืืืฃ ืืขืืจืชื munmap
. ืืื ืื ื ืืจืฉ ืืืฉืืจ ืืื, ื ืฆืืื ืืช ืืชืืฆืื ืืืงืื 2 ืืื-ืืืื getpagesize()
- mmap
ืื ืขืืืื ืืืกืืจ ืืชืืืช ืืืืฉืจืช... ืื ื-Emscripten mmap
ืจืง ืฉืืืืช malloc
, ืืื ืืืืื ืฉืื ืื ืืชืืืฉืจ ืืืฃ. ืืืืคื ืืืื, ืืื ืฉืชืกืื ืืืชื ืืืฉื ืืื ืืืืฉืื ืชืืงื ืขื ืืื ืฉืื ืื ื ะดะฒัั
ืฉืืจืืช.
ืชืืื ืืช ืฉื ืคืื ืงืฆืืืช ืฉืืืืช
ืืขืืฉืื ืืืขืื ืกืืคืจ ืืฉืื, Qemu ืื ืงืืจืก, ืืื ืืืกื ืื ื ืืืง, ืืืืขืื ื ืื ืก ืืืืืจืืช ืืืืืืืช, ืื ืืฉืคืื ืืคื ืืคืื -d exec,in_asm,out_asm
. ืขืืชื ืืฉืขืจื: ืคืกืืงืืช ืืืืืจ (ืื, ืืืืคื ืืืื, ืื ืืืคืกืงืืช) ืืื ื ืืืืขืืช. ืืืื, ืื ืืืจืืื ืืช ืืืคืจืขืืช ืืืืกืคืช ืืืืืืื, ืฉืืฉืื ืื ืขืืื, ืืชืงืืืช ืชืืื ื ืืืื. ืืื ืื ืื ืืืืชื ืืชืฉืืื ืืืื: ืืฉืืืื ืฉื ืืขืงืืืช ืฉืืืคืงื ืขื ืืืคืฉืจืืช ืื "ื ืืจืืชื ืฉืืกืืืื ืืืืฆืืข ืืชืคืฆืื ืืืงืื ืืืื. ืืื ืืฉ ืืืืจ ืืฉืืืื ืฉื ืื ืฉื ืจืฉื ืืืืฆืขืืช ืืืฉืืจ emrun
ืืืชืืจ ืืืืื ืืคืื ืขื ืืคืื ืฉื ืืืจืืื ืืืงืืืืช ืืื ื ืชืืืื ืืื ื ืืืืืืื. ืื ื ืื ืืืืข ืืื ืืืืืง ืืชืืืจืช ืชืืื ืืช ืืคืืขืืช ืืืคืืคื emrun
, ืืื ืืื ืงืืืื ืืคืื ืืกืชืืจ ืฉืื ืืกืืืจืื ืืืืฉ, ืื ืฉืืืืื ื-diff ืืื ืขืืืื ืื ืกืืื ืืื ืื ืฉืืืกืืืืื ืืชืคืฆืื. ืืืืคื ืืืื, ืืชืืจืจ ืื ืขื ืคื ืืื ืืืืช ljmpl
ืืฉ ืืขืืจ ืืืชืืืืช ืฉืื ืืช, ืื-bytecode ืฉื ืืฆืจ ืฉืื ื ืืืืชืืช: ืืื ืืืื ืืืจืื ืืงืจืื ืืคืื ืงืฆืืืช ืขืืืจ, ืืฉื ื ืื. ืืืืจ ืฉืืืืืชื ืืช ืืืืจืืืช ืืืืืื ืืงืื ืฉืืชืจืื ืืืจืืืช ืืื, ืืชืืจืจ ืื ืจืืฉืืช, ืืื ืืคื ืื ืืคื ืงืก cr0
ืืืฆืขื ืืงืืื - ืื ืืืืฆืขืืช ืขืืืจ - ืฉืืขืืืจื ืืช ืืืขืื ืืืฆื ืืืื, ืืฉื ืืช, ืฉืืจืกืช ื-js ืืขืืื ืื ืขืืจื ืืืฆื ืืืื. ืืื ืืขืืืื ืืื ืฉืชืืื ื ื ืืกืคืช ืฉื Emscripten ืืื ืืืกืจ ืืจืฆืื ืฉืื ืืกืืื ืงืื ืืื ืืืฉืื ืืืจืืืช call
ื-TCI, ืฉืื ืืฆืืืข ืคืื ืงืฆืื ืืืื ืืกืื long long f(int arg0, .. int arg9)
- ืืฉ ืืงืจืื ืืคืื ืงืฆืืืช ืขื ืืืกืคืจ ืื ืืื ืฉื ืืจืืืื ืืื. ืื ืืืื ืืื ืืืคืจ, ืืืชืื ืืืืืจืืช ืืืชืืจ ืืืืืื, ืืชืืื ืืช ืชืชืจืกืง (ืืื ืืื) ืื ืชืงืจื ืืคืื ืงืฆืื ืืื ื ืืื ื ืืืื (ืฉืื ืืืื ืขืฆืื ืื ืคืืช ืืืืื). ืืฉื ื ืื ืืคืฉืจืืช ืฉืืืฉืืช - ืืคืฉืจ ืืฆืืจืช ืขืืืคืืช ืฉืืืกืืคืืช / ืืกืืจืืช ืืจืืืื ืืื, ืืื ืืกื ืืื ืืขืืืคืืช ืืืื ืชืืคืกืืช ืืจืื ืืงืื, ืืืจืืช ืฉืืืขืฉื ืื ื ืฆืจืื ืจืง ืงืฆืช ืืืชืจ ืืืื ืขืืืคืืช. ืื ืืืื ืขืฆืื ืืืื, ืืื ืืชืืจืจ ืฉืืฉ ืืขืื ืืืืจื ืืืชืจ: ืืงืื ืฉื ืืฆืจ ืฉื ืคืื ืงืฆืืืช ืืขืืืคื, ืืืจืืืื ืืื ืืืืจื ืืืืืจื, ืืื ืืคืขืืื ืืคืื ืงืฆืื ืขื ืืืจืืืื ืืื ืฉื ืืฆืจื ืื ื ืงืจืื - ืืืื, ืืืืืง ืืื ื ืืืฉืื libffi ืฉืื. ืืืืืจ, ืืืง ืืืขืืืจืื ืคืฉืื ืื ืืืฆืื ืืืืจื.
ืืืจืื ืืืื, ื-Qemu ืืฉ ืจืฉืืืืช ืงืจืืืืช ืืืืื ื ืฉื ืขืืืจืื ืืฆืืจื ืฉื ืงืืืฅ ืืืชืจืช ืืื
DEF_HELPER_0(lock, void)
DEF_HELPER_0(unlock, void)
DEF_HELPER_3(write_eflags, void, env, tl, i32)
ืื ืืฉืืฉืื ืื ืืฆืืืง: ืจืืฉืืช, ืคืงืืืืช ืืืงืจื ืืืืืจืืช ืืืืฉ ืืฆืืจื ืืืืืจื ืืืืชืจ DEF_HELPER_n
, ืืืืืจ ืืื ื ืืืง helper.h
. ืืืืื ืฉืืืืงืจื ืืืจืื ืืืชืืื ืืื ื ืืคืกืืง, ืืื ืืืืืจ ืืขืจื, ืืืืงืื ืืืื ืืื - #include <helper.h>
ืืชืืฆืื ืืื, ืกืืฃ ืกืืฃ ืืืืชื ืื ืืืืื ืืช ืื ืกืืช ืืช ืืกืคืจืืื ืืขืืืื
ืืื, ืืืจื ืื ื ืจืื ืืื ืฉืืืขืื ืขืืื. ื ืจืื ืฉืื ืืืื ืฉืืืกื ืืขืืื ืื ืืืชืื, ืืืจืืช ืฉ-memtest86+ ืืฆืืืื ืืจืืฅ ื-Native assembly. ืืื ืืฉ ืฆืืจื ืืืืืืจ ืฉืงืื Qemu block I/O ืืชืื ืืงืืจืืืื ืืช. ื-Emscripten ืืฉ ืืืฉืื ืืืื ืืกืืื ืืฉืื, ืืื ืขืืืื ืืื ืฆืืจื ืืชืืื ืื ืืงืื Qemu, ืืืชื ืืืื ืืืฆืข ื ืืคืื ืืืืื ืืืขืื ืขืืฉืื: Qemu ืชืืื ืืืคืฉืจืืืืช -kernel
, -initrd
, -append
, ืฉืืืืฆืขืืชื ืืชื ืืืื ืืืชืื ืืช ืืื ืืงืก ืื, ืืืฉื, memtest86+, ืืืื ืืืฉืชืืฉ ืืืืฉืืจื ืืกืืื ืืื. ืืื ืื ื ืืืขืื: ืืืจืืื ืืืงืืจืืช ืืคืฉืจ ืืื ืืจืืืช ืืช ืคืื ืืืืช ืืื ืืงืก ืืงืื ืกืืื ืขื ืืืคืฉืจืืช -nographic
, ืืืื ืคืื ืืืืคืืคื ืืืกืืฃ ืฉืืื ื ืืืฉืง emrun
, ืื ืืืืข. ืืืืืจ, ืื ืืจืืจ: ืืืขืื ืื ืขืืื ืื ืืคืื ืืืจืคื ืื ืขืืื. ืืื ืขืื ืืืขืชื ืืืืืช ืงืฆืช. ืืชืืจืจ ืฉ"ืืืขืื ืื ืืฉื, ืืื ืคืฉืื ืืืืื ืืื", ืืืืจื ืืืืฉ ืืงืืช ืืงืจื ื ืืจืง ืฆืจืืจ ืืืืขืืช ืืงืื ืกืืื ืืืืฉืื ืืืืชืงืข. ืืชืืจืจ ืฉืืืขืื, ืืืืคื ืืืื, ืขืืื, ืืขืืื ื ืืืคืืจ ืืงืื ืืขืืืื ืขื SDL2. ืืฆืขืจื, ืื ื ืื ืืืืข ืืื ืืืฉืชืืฉ ืืกืคืจืืื ืืื, ืื ืืืงืืืืช ืืกืืืืื ื ืืืฆืชื ืืคืขืื ืืืงืจืื. ืืฉืื ืืกืืื, ืืงื parallel0 ืืืื ืขื ืืืกื ืขื ืจืงืข ืืืื, ืื ืฉืืฆืืข ืืื ืืืฉืืืช. ืืกืืคื ืฉื ืืืจ ืืชืืจืจ ืฉืืืขืื ืืื ืฉ-Qemu ืคืืชืืช ืืกืคืจ ืืืื ืืช ืืืจืืืืืืื ืืืืื ืคืืื ืืื, ืืื ืืื ื ืืชื ืืขืืืจ ืืืืฆืขืืช Ctrl-Alt-n: ืื ืขืืื ื-Native build, ืืื ืื ื-Emscripten. ืืืืจ ืืืืคืืจ ืืืืื ืืช ืืืืชืจืื ืืืืฆืขืืช ืืคืฉืจืืืืช -monitor none -parallel none -serial none
ืืืืจืืืช ืืฆืืืจ ืืืืฉ ืืืื ืืช ืื ืืืกื ืขื ืื ืคืจืืื, ืืื ืคืชืืื ืขืื.
ืงืืจืืืื ืื
ืื, ืืืืืฆืื ืืืคืืคื ืขืืืืช, ืืื ืืชื ืื ืืืื ืืืคืขืื ืื ืฉืื ืชืงืืืืื ืืขื ืืื, ืืืืืื ืฉืืื ืงืื/ืคืื ืืกืื - ืืชื ืฆืจืื ืืืืฉื ืชืืืื ืืงืืจืืืื ืื. ื-Qemu ืืืจ ืืฉ ืืกืคืจ ืงืฆื ืงืฆื ืฉื Coroutine, ืืื ืืืื ืืืืคื ืฉื JavaScript ืืืืืื ืืงืื ืฉื Emscripten, ืืชื ืื ืืืื ืคืฉืื ืืืชืืื ืืืืื ืืขืจืืืืช. ื ืจืื ืฉ"ืืื ื ืขืื, ืืืื ืืืกืจ", ืืื ืืคืชืื Emscripten ืืืจ ืืืื ืืืื. ืื ืืืืฉื ืื ืืฆืืืง: ืืืื ื ืงืจื ืืงืจืืืช ืคืื ืงืฆืื ืืื ืืืฉืืื emscripten_sleep
ืืขืื ืืื ืืืจืื ืืืฉืชืืฉืื ืืื ืื ืื Asyncify, ืืื ืื ืงืจืืืืช ืืฆืืืข ืืงืจืืืืช ืืื ืคืื ืงืฆืื ืฉืื ืืื ืืฉื ื ืืืงืจืื ืืงืืืืื ืขืฉืื ืืืชืจืืฉ ืืืืฉื ืืขืจืืื. ืืืขืช, ืืคื ื ืื ืงืจืืื ืืฉืืื, ื ืืืจ ืืงืฉืจ ืืกืื ืืจืื ื, ืืืื ืืืืจ ืืงืจืืื ื ืืืืง ืืื ืืชืจืืฉื ืงืจืืื ืืกืื ืืจืื ืืช, ืืื ืื ื ืฉืืืจ ืืช ืื ืืืฉืชื ืื ืืืงืืืืื ืืืงืฉืจ ืืกืื ืืจืื ื ืื, ื ืฆืืื ืืืื ืคืื ืงืฆืื ืืืขืืืจ ืืช ืืฉืืืื ืืืืขื ืฉืื ืื ืื ื ืฆืจืืืื ืืืืฉืื ืืืืฆืืข ืืืฆืืช ืืืคืื ืงืฆืื ืื ืืืืืช. ืื ืืืงืื ืฉืื ืืฉ ืืงืื ืืืงืืจ ืืช ืืืฉืคืขื -O3
. ืื ื ืืจืืฅ ืืช ืืงืื ืฉื ืืฆืจ, ื-Chromium ืืืื ืืช ืืืืืจืื ืืืชืจืกืง. ืืื ืืกืชืืืชื ืืืขืืช ืขื ืื ืฉืืื ื ืืกื ืืืืจืื... ืืืื, ืื ืื ื ืืืื ืืืืจ, ืื ืื ื ืืืืชื ืงืืคืืช ืื ืืื ืืืงืฉืื ืืื ื ืืืืื ืืืืฆืข ืืืคืืืืืืฆืื ืฉื 500+ MB Javascript.
ืืจืืข ืืืื, ืืืืืงืืช ืืงืื ืกืคืจืืืช ืืชืืืื ืฉื Asyncify ืื ืืื ืืืืืืชืืื ืืืืืืื longjmp
-s ืืืฉืืฉืื ืืงืื ืืืขืื ืืืืจืืืืื, ืืื ืืืืจ ืชืืงืื ืงืื ืฉืืืื ืืช ืืืืืงืืช ืืืื ืืืฉืืืจ ืืืื ืืงืฉืจืื ืืืืื ืืื ืืกืืจ, ืืงืื ืขืื. ืืื ืืชืืื ืืืจ ืืืืจ: ืืคืขืืื ืืืคืขืื ืืืืงืืช ืืงืื ืืกื ืืจืื - ืืืชื ืืืืงืืช ืฉืืจืกืงืืช ืืช ืืงืื ืื, ืืคื ืืืืืื ืืืืฆืืข, ืฆืจืื ืืืกืื ืืืชื - ืืืฉืื ื ืืกื ืืชืคืืก mutex ืฉืืืจ ื ืืื. ืืืจืื ืืืื, ืืชืืจืจ ืฉืื ืื ืืขืื ืืืืื ืืช ืืงืื ืืกืืจืชื - ืคืฉืื ืืฉืชืืฉืชื ืืคืื ืงืฆืืื ืืืืช ืืืืืื ืืจืืฉืืช ืืกืื ืืจืืืช ืฉืกืืคืงื Emscripten, ืืื ืืคืขืืื ืืงืจืืื ืืืกืื ืืจืื ืืช ืืืืชื ืืคืจืงืช ืืืืืืื ืืช ืืขืจืืื, ืืืืืชื ืจืืข ืืื ืชืืืฉื setTimeout
ืืืืืืื ืืจืืฉืืช - ืื, ืืงืื ื ืื ืก ืืืืืจืฆืื ืฉื ืืืืืื ืืจืืฉืืช ืืืื ืืฆืืช ืืืืืืจืฆืื ืืงืืืืช. ื ืืชื ืืืืฉ ืขื ืืืืื ืืื ืกืืคืืช ื emscripten_sleep
, ืืืืขืืืช ืขื mutexes ืคืกืงื. ืืงืื ืืคืืื ืืคื ืืืืชืจ ืืืืื ื - ืืืจื ืืื, ืืืขืฉื, ืืื ืื ืืืื ืงืื ืฉืืืื ืืช ืืืกืืจืช ืืื ืืืฆืื ืืืื - ืืืขืื ืคืฉืื ืืืฉื ืืฉืื ืืืืกื ืืชืขืืื ืืขืช ืืขืช. ืขื ืืืช, ืืืขืืืช ืื ื ืขืฆืจื ืฉื: ืืคืขืืื ืืืฆืืข Qemu ืคืฉืื ืืื ืืกืชืืื ืืฉืงื ืืื ืืจืืืื ืื ืฉืืืืืช. ืืืืชื ืจืืข ืืืชืจืชื ืขื ืื, ืืื ืืืกืชืืืืช ืงืืืื, ืื ื ืืืื ืฉืืืขืื ืืืืชื ืืื: ืืืขืฉื, ืงืื ืืงืืจืืืื ืืื ื ืืฉืชืืฉ setTimeout
(ืื ืืคืืืช ืื ืืชืืืจืืช ืฉืื ืืชื ืขืฉืื ืืืฉืื): ืคืื ืงืฆืื emscripten_yield
ืคืฉืื ืืืืืจ ืืช ืืื ืืฉืืื ืืืกืื ืืจืื ืืช. ืื ืืขื ืืื ืืื ืื emscripten_coroutine_next
ืืื ื ืคืื ืงืฆืื ืืกืื ืืจืื ืืช: ืคื ืืืืช ืืื ืืืืงืช ืืช ืืืื, ืืืคืกืช ืืืชื ืืืขืืืจื ืืช ืืฉืืืื ืืืงืื ืืืจืืฉ. ืืืืืจ, ืงืืืื ืืืืกื ืืช ืืกืชืืื ืฉื. ืืืขืื ืืืืชื ืฉืืืื use-after-free, ืฉืืืคืืข ืืืฉืจ ืืืืจ ื-coroutine ืืืฉืืช ืขืงื ืืขืืืื ืฉืื ืืขืชืงืชื ืฉืืจืช ืงืื ืืฉืืื ืื-backend ืืงืืื ืฉื coroutine, ืืคืื ืงืฆืื qemu_in_coroutine
ืืืืืจ ืืืช ืืฉืืืขืฉื ืื ืืื ืฆืจืื ืืืืืืจ ืฉืงืจ. ืื ืืืืื ืืฉืืื emscripten_yield
, ืฉืืขืืื ืื ืืื ืืืฉ ืขื ืืขืจืืื emscripten_coroutine_next
, ืืขืจืืื ื ืคืจืฉื ืขื ืืืขืื, ืืื ืื setTimeout
, ืืคื ืฉืืืจ ืืืจืชื, ืื ืืืฆื.
ืืฆืืจืช ืงืื JavaScript
ืืื ื, ืืืขืฉื, ืืืืืืช "ืืืืจืช ืืืฉืจ ืืืืื ืืืืืจ". ืื ืืืืช. ืืืืื ืฉืื ื ืจืืฅ ืืช Qemu ืืืคืืคื, ื-Node.js ืื, ืื, ืืืืคื ืืืขื, ืืืืจ ืืฆืืจืช ืงืื ื-Qemu ื ืงืื JavaScript ืฉืืื ืืืืืืื. ืืื ืืื ืืืช, ืืืืืฉืื ืืจื ืกืคืืจืืฆืื ืืคืืื.
ืจืืฉืืช, ืงืฆืช ืขื ืืื Qemu ืขืืื. ืื ื ืกืื ืื ืืื: ืื ื ืื ืืคืชื Qemu ืืงืฆืืขื ืืืืกืงื ืืช ืฉืื ืขืฉืืืืช ืืืืืช ืฉืืืืืช ืืืงืืืืช ืืกืืืืื. ืืคื ืฉืืืืจืื, "ืืขืชื ืฉื ืืชืืืื ืืื ื ืืืืืช ืืืืืช ืชืืืืช ืืช ืืขืชื ืฉื ืืืืจื, ืืืงืกืืืืืืงื ืืืฉืื ืืืฉืจ ืฉื ืคืืื ื". ื-Qemu ืืฉ ืืกืคืจ ืืกืืื ืฉื ืืจืืืืงืืืจืืช ืืืจืืื ื ืชืืืืช ืืืื ืืืช ืืฉ ืกืคืจืืื ืืื target-i386
. ืืขืช ืื ืืื, ืืชื ืืืื ืืฆืืื ืชืืืื ืขืืืจ ืืื ืืจืืืืงืืืจืืช ืืืจืืื, ืืื ืืชืืฆืื ืชืืื ืจืง โโืืื ืืื ืืจืืื. ืืงืื ืืชืืืื ืืืจืืืืงืืืจืช ืืืืจื, ืืชืืจื, ืืืฆืจ ืืื ืคืขืืืืช Qemu ืคื ืืืืืช, ืฉื-TCG (ืืืืื ืงืื ืืขืืจ) ืืืจ ืืืคื ืืงืื ืืืื ื ืขืืืจ ืืจืืืืงืืืจืช ืืืืจื. ืืคื ืฉืฆืืื ืืงืืืฅ readme ืฉื ืืฆื ืืกืคืจืืืช tcg, ืื ืืื ืืืงืืจ ืืืง ืืืืืจ C ืจืืื, ืฉืืืชืื ืืืืืจ ืืืชืจ ื-JIT. ืืื, ืืืฉื, ืืจืืืืงืืืจืช ืืขื ืืืืื ืช ืืกืื ืื ืืื ื ืขืื ืืจืืืืงืืืจืช ืืืจื, ืืื ืืจืืืืงืืืจืช ืืืจื. ืืฉืื ืืกืืื ืืืคืืข ืจืืื ื ืืกืฃ - Tiny Code Interpreter (TCI), ืฉืืืืจ ืืืฆืข ืงืื (ืืืขื ืืืชื ืคืขืืืืช ืคื ืืืืืช) ืืืืขืืจ ืืืืื ืงืื ืืืจืืืืงืืืจืช ืืืจื ืกืคืฆืืคืืช. ืืืขืฉื, ืืคื ืฉืฆืืื ืืชืืขืื ืฉืื, ืืืชืื ืฉืืืชืืจืืื ืืื ืื ืชืืื ืืชืคืงื ืืื ืืืืื ืงืื JIT, ืื ืจืง ืืืืื ื ืืืืชืืช ืืืืื ืช ืืืืจืืช, ืืื ืื ืืืืื ื ืืืืืชืืช. ืืืจืืช ืฉืื ื ืื ืืืื ืฉืืชืืืืจ ืฉืื ืจืืืื ืื ืืืืืืื.
ืืืชืืื ื ืืกืืชื ืืืฆืืจ TCG backend ืืื, ืืื ืืืจ ืืืื ืืชืืืืืชื ืืงืื ืืืงืืจ ืืืชืืืืจ ืื ืืืืจื ืืจืืจ ืฉื ืืืจืืืช ื-bytecode, ืื ืืืืืชื ืืขืืืฃ ืืช ืืืชืืจืืื TCI. ืื ื ืชื ืืกืคืจ ืืชืจืื ืืช:
- ืืขืช ืืืฉืื ืืืืื ืงืื, ืืชื ืืืื ืืืกืชืื ืื ืขื ืชืืืืจ ืืืืจืืืช, ืืื ืขื ืงืื ืืืชืืจืืื
- ืืชื ืืืื ืืืฆืืจ ืคืื ืงืฆืืืช ืื ืขืืืจ ืื ืืืืง ืชืจืืื ืฉื ืชืงื ืื, ืืื, ืืืฉื, ืจืง ืืืืจ ืืืืฆืืข ืืืื
- ืื ืืงืื ืฉื ืืฆืจ ืืฉืชื ื (ืื ืจืื ืฉืื ืืคืฉืจื, ืื ืืฉืคืื ืืคื ืืคืื ืงืฆืืืช ืขื ืฉืืืช ืืืืืืื ืืช ืืืืื patch), ืืฆืืจื ืืืื ืืช ืชืืงืฃ ืงืื ื-JS ืฉื ืืฆืจ, ืืื ืืคืืืช ืืืื ืื ืืื ืืืฆืืจ ืืืชื ืืืืฉ.
ืืืื ืื ืงืืื ืืฉืืืฉืืช, ืื ื ืื ืืืื ืฉืชืืงืื ืืคืฉืจื ืืืืจ ืืืฆืืข ืืงืื ืืคืขื ืืจืืฉืื ื, ืืื ืฉืชื ืื ืงืืืืช ืืจืืฉืื ืืช ืืกืคืืงืืช.
ืืชืืืื, ืืงืื ื ืืฆืจ ืืฆืืจื ืฉื ืืชื ืืืื ืืืชืืืช ืฉื ืืืจืืช ื-bytecode ืืืงืืจืืช, ืืื ืืืืจ ืืื, ืืฉื ืืืจืชื ืืืืืจ ืขื Emscripten, ืืืคืืืืืืฆืื ืฉื JS ืฉื ืืฆืจ ื-relooping, ืืืืืชื ืืืฆืืจ ืงืื ืื ืืฉื ืืืชืจ, ืืืืืื ืืืืืื ืฉืืืืื ื ืืืคืืจืืช ืื ืืชืืจืจ ืฉื ืงืืืช ืืื ืืกื ืืืืืื ืืืืืง ืืชืจืืื ืืื ืืืชืืื ืฉืื. ืื ืืืงืื ืืืชืจ ืืืฉืจ ื ืขืฉื, ืืืืจ ืืื ืื ืืื ืื ื ืืืืื ืงืื ืฉืืฆืจ ืงืื ืขื ifs (ืื ืื ืืื ืืืืืืช). ืืื ืืื ืจืข, ืื ืืชืจืกืง, ื ืืชื ืืืืขื ืฉืืืืจืืืช ืืื ืืืืจื ืื ื ืืื. ืืชืจื ืืื, ืืืืจืื ืืืืจืื ื ืืจืืช ืืจืงืืจืกืื ืืื ืืืืชื brcond
. ืืืงืื, ืื ื ืืืกืืฃ ืฆ'ืง ืืื ืืืคืงืช ืืืืจืื ืืื ืืคื ื ืืืืจื ืืฉืืื ืืจืงืืจืกืืืืช ื... ืืฃ ืืืช ืืื ืื ืืืฆืขื, ืืื ืืืจื ื-assert switch ืื ืขืืืื ื ืืฉืื. ืืกืืคื ืฉื ืืืจ, ืืืืจ ืืืืื ืืงืื ืฉื ืืฆืจ, ืืื ืชื ืฉืืืจื ืืืขืืจ, ืืืฆืืืข ืืืืจืื ืื ืืืืืช ื ืืขื ืืืืฉ ืืืืืกื ืืช ืืืื ืื ืจืื ืืืืืฃ ืขื ืืื ืงืื ื-JavaScript ืฉื ืืฆืจ. ืืื ืืฆื. ืืืืืช ืืืืืจ ืืืื-ืืืื ืืื ืืขืฉืจื ืื ืืืืืื ืืืืื, ืืืชืืจืจ ืฉืืืืื ืืงืื ืคืืขื ืืืขืืืื. ืืืื ื ืฆืจืืืื ืืืืืง ืฉืื ืืจืื ื ืืืืืืืช ืืฉืืคืช ืื ืืืืืช, ืืื ืื ืื ืชืืฆืื ืืช ืืืชืืืช ืฉื ืืฉืืคืช ืืืื ืขื ืกืืื ืืื ืืก ืืื ืฉื ืืื ืืืืฉืื ืืืืฆืืข. ืื ืืกืฃ, ืื ืคืืชืจ ืืช ืืืขืื "ืืืื ืคืื ืงืฆืืืช ืฉื ืืฆืจื ืฆืจืืืืช ืืืืืช ืื ืืืงืืืช ืื ืคืืกืช ืืืชืื ืืื ืืฉืชื ืชื?" - ืืฉ ืืืื ืจืง ืืช ืืคืื ืงืฆืื ืืชืืืืช ืืืืืง ืืชืจืืื ืืื. ืืื, ืืืจืืช ืฉื ืืคืืชื ืืืืื ื-Chromium (ืืืืจ ืฉืื ื ืืฉืชืืฉ ืืคืืืจืคืืงืก ืืงื ืื ืืืชืจ ืืืฉืชืืฉ ืืืคืืคื ื ืคืจื ืื ืืกืืืื), ืคืืืจืคืืงืก ืขืืจ ืื ืืชืงื ืื-ืชืืืืืช ืขื ืชืงื asm.js, ืืืืืจ ืืื ืืงืื ืืชืืื ืืขืืื ืืืจ ืืืชืจ ื- ืึผึฐืจืึนื.
ืืืืื ืืงืื ืฉื ืืฆืจ
Compiling 0x15b46d0:
CompiledTB[0x015b46d0] = function(stdlib, ffi, heap) {
"use asm";
var HEAP8 = new stdlib.Int8Array(heap);
var HEAP16 = new stdlib.Int16Array(heap);
var HEAP32 = new stdlib.Int32Array(heap);
var HEAPU8 = new stdlib.Uint8Array(heap);
var HEAPU16 = new stdlib.Uint16Array(heap);
var HEAPU32 = new stdlib.Uint32Array(heap);
var dynCall_iiiiiiiiiii = ffi.dynCall_iiiiiiiiiii;
var getTempRet0 = ffi.getTempRet0;
var badAlignment = ffi.badAlignment;
var _i64Add = ffi._i64Add;
var _i64Subtract = ffi._i64Subtract;
var Math_imul = ffi.Math_imul;
var _mul_unsigned_long_long = ffi._mul_unsigned_long_long;
var execute_if_compiled = ffi.execute_if_compiled;
var getThrew = ffi.getThrew;
var abort = ffi.abort;
var qemu_ld_ub = ffi.qemu_ld_ub;
var qemu_ld_leuw = ffi.qemu_ld_leuw;
var qemu_ld_leul = ffi.qemu_ld_leul;
var qemu_ld_beuw = ffi.qemu_ld_beuw;
var qemu_ld_beul = ffi.qemu_ld_beul;
var qemu_ld_beq = ffi.qemu_ld_beq;
var qemu_ld_leq = ffi.qemu_ld_leq;
var qemu_st_b = ffi.qemu_st_b;
var qemu_st_lew = ffi.qemu_st_lew;
var qemu_st_lel = ffi.qemu_st_lel;
var qemu_st_bew = ffi.qemu_st_bew;
var qemu_st_bel = ffi.qemu_st_bel;
var qemu_st_leq = ffi.qemu_st_leq;
var qemu_st_beq = ffi.qemu_st_beq;
function tb_fun(tb_ptr, env, sp_value, depth) {
tb_ptr = tb_ptr|0;
env = env|0;
sp_value = sp_value|0;
depth = depth|0;
var u0 = 0, u1 = 0, u2 = 0, u3 = 0, result = 0;
var r0 = 0, r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = 0, r7 = 0, r8 = 0, r9 = 0;
var r10 = 0, r11 = 0, r12 = 0, r13 = 0, r14 = 0, r15 = 0, r16 = 0, r17 = 0, r18 = 0, r19 = 0;
var r20 = 0, r21 = 0, r22 = 0, r23 = 0, r24 = 0, r25 = 0, r26 = 0, r27 = 0, r28 = 0, r29 = 0;
var r30 = 0, r31 = 0, r41 = 0, r42 = 0, r43 = 0, r44 = 0;
r14 = env|0;
r15 = sp_value|0;
START: do {
r0 = HEAPU32[((r14 + (-4))|0) >> 2] | 0;
r42 = 0;
result = ((r0|0) != (r42|0))|0;
HEAPU32[1445307] = r0;
HEAPU32[1445321] = r14;
if(result|0) {
HEAPU32[1445322] = r15;
return 0x0345bf93|0;
}
r0 = HEAPU32[((r14 + (16))|0) >> 2] | 0;
r42 = 8;
r0 = ((r0|0) - (r42|0))|0;
HEAPU32[(r14 + (16)) >> 2] = r0;
r1 = 8;
HEAPU32[(r14 + (44)) >> 2] = r1;
r1 = r0|0;
HEAPU32[(r14 + (40)) >> 2] = r1;
r42 = 4;
r0 = ((r0|0) + (r42|0))|0;
r2 = HEAPU32[((r14 + (24))|0) >> 2] | 0;
HEAPU32[1445307] = r0;
HEAPU32[1445308] = r1;
HEAPU32[1445309] = r2;
HEAPU32[1445321] = r14;
HEAPU32[1445322] = r15;
qemu_st_lel(env|0, r0|0, r2|0, 34, 22759218);
if(getThrew() | 0) abort();
r0 = 3241038392;
HEAPU32[1445307] = r0;
r0 = qemu_ld_leul(env|0, r0|0, 34, 22759233)|0;
if(getThrew() | 0) abort();
HEAPU32[(r14 + (24)) >> 2] = r0;
r1 = HEAPU32[((r14 + (12))|0) >> 2] | 0;
r2 = HEAPU32[((r14 + (40))|0) >> 2] | 0;
HEAPU32[1445307] = r0;
HEAPU32[1445308] = r1;
HEAPU32[1445309] = r2;
qemu_st_lel(env|0, r2|0, r1|0, 34, 22759265);
if(getThrew() | 0) abort();
r0 = HEAPU32[((r14 + (24))|0) >> 2] | 0;
HEAPU32[(r14 + (40)) >> 2] = r0;
r1 = 24;
HEAPU32[(r14 + (52)) >> 2] = r1;
r42 = 0;
result = ((r0|0) == (r42|0))|0;
if(result|0) {
HEAPU32[1445307] = r0;
HEAPU32[1445308] = r1;
}
HEAPU32[1445307] = r0;
HEAPU32[1445308] = r1;
return execute_if_compiled(22759392|0, env|0, sp_value|0, depth|0) | 0;
return execute_if_compiled(23164080|0, env|0, sp_value|0, depth|0) | 0;
break;
} while(1); abort(); return 0|0;
}
return {tb_fun: tb_fun};
}(window, CompilerFFI, Module.buffer)["tb_fun"]
ืืกืงื ื
ืื ืืขืืืื ืขืืืื ืื ืืืฉืืื, ืืื ื ืืืก ืื ืืืืื ืืช ืืื ืืื ืืจืืืช ืืืืื ืืื ืืฉืืืืช ืืกืชืจ. ืืื ืืืืืชื ืืคืจืกื ืืช ืื ืฉืืฉ ืื ืืขืช ืขืชื. ืืงืื ืงืฆืช ืืคืืื ืืืงืืืืช, ืื ืื ื ืืกืื, ืืื ืืจืืจ ืืจืืฉ ืื ืฆืจืื ืืขืฉืืช. ืื ืจืื, ืื ืืืื ืืืืฆืื ืืชืืืืืืืืช ืืืืืืืช ืจืืืืืช ืขื ืืื ืืจืกื ืืืืจื ืืช ืืืชืจ ืฉื Qemu. ืืื ืชืืื ืืฉ ืฉืจืฉืืจ ืืืืื ืืคืืจืื ืืืื: ืขื ืื "ืจืื" ืฉืขืืจื ืืคืืืช ืืืืฉืื, ื ืืกืคื ืคืจืฉื ืืช ืืคืืจืืช ืืจืืกืืช. ืืืขืฉื, ืืืืจ ืื ืืื ืืืืื ืจืื ืืกืคืจ ืืืืฉ ืฉื ืืืกืงื ื git log
.
ืืชื ืืืื ืื ืกืืช ืืื
ืื ืืืจ ืขืืื:
- ืืขืื ืืืจืืืืื x86 ืคืืขื
- ืืฉ ืื ืืืคืืก ืขืืื ืฉื ืืืืื ืงืื JIT ืืงืื ืืืื ื ืืขื JavaScript
- ืืฉ ืชืื ืืช ืืืจืืืช ืืจืืืืงืืืจืืช ืืืจื ืืืจืืช ืฉื 32 ืกืืืืืช: ืืจืืข ืืชื ืืืื ืืืชืคืขื ื-Linux ืขืืืจ ืืจืืืืงืืืจืช MIPS ืฉืงืคืื ืืืคืืคื ืืฉืื ืืืขืื ื
ืื ืขืื ืืชื ืืืื ืืขืฉืืช
- ืืืฆืช ืืืืืื. ืืคืืื ืืืฆื JIT ื ืจืื ืฉืืื ืคืืขื ืืื ืืืชืจ ืืืฉืจ Virtual x86 (ืืื ืืฉ ืคืืื ืฆืืื Qemu ืฉืื ืขื ืืจืื ืืืืจื ืืืจืืืืงืืืจืืช ืืืงืืช)
- ืืื ืืืฆืืจ ืืืฉืง ื ืืจืืื - ืืืขื ืืืืช, ืื ื ืื ืืคืชื ืืื ืืจื ื ืืื, ืื ืืขืช ืขืชื ืืฆืจืชื ืืืืฉ ืืช ืืขืืคืช Emscripten ืืกืื ืืจืืืช ืืืืื ืืืืืชื
- ื ืกื ืืืคืขืื ืคืื ืงืฆืืืช ืืืจืืืืช ืืืชืจ ืฉื Qemu - ืจืฉืชืืช, ืืขืืจืช VM ืืื'.
- UPD: ืชืฆืืจื ืืืืืฉ ืืช ืืกืคืจ ืืืชืคืชืืืืืช ืืืืืืื ืืืืืื ืฉืื ื-Emscripten ืืืขืื ืืืจื, ืืคื ืฉืขืฉื ืกืืืื ืงืืืืื ืฉื Qemu ืืคืจืืืงืืื ืืืจืื. ืชืืื ืืื ืขื ืืืืืืช ืืืฉืชืืฉ ืืืืคื ืืจืืื ืืชืจืืืชื ื-Emscripten ืืืืง ืืืืฉืืื ืฉืื.
ืืงืืจ: www.habr.com