Qemu.js с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ JIT: Ρ„Π°Ρ€Ρˆ всё ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½Π°Π·Π°Π΄

НСсколько Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄ Ѐабрис Π‘Π΅Π»Π»Π°Ρ€ написал jslinux β€” эмулятор ПК, написанный Π½Π° JavaScript. ПослС этого Π±Ρ‹Π» Π΅Ρ‰Ρ‘ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Virtual x86. Но всС ΠΎΠ½ΠΈ, насколько ΠΌΠ½Π΅ извСстно, являлись ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ написанный Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅ Ρ‚Π΅ΠΌ ΠΆΠ΅ Ѐабрисом Π‘Π΅Π»Π»Π°Ρ€ΠΎΠΌ Qemu, Π΄Π° ΠΈ, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, любой ΡƒΠ²Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΉ сСбя соврСмСнный эмулятор, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ JIT-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ гостСвого ΠΊΠΎΠ΄Π° Π² ΠΊΠΎΠ΄ хостовой систСмы. МнС показалось, Ρ‡Ρ‚ΠΎ самоС врСмя Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Ρ‚ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹: JIT-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ машинного ΠΊΠΎΠ΄Π° Π² JavaScript, для Ρ‡Π΅Π³ΠΎ Π»ΠΎΠ³ΠΈΡ‡Π½Π΅Π΅ всСго видСлось ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Qemu. Казалось Π±Ρ‹, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ Qemu, Π΅ΡΡ‚ΡŒ ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ простыС ΠΈ user-friendly эмуляторы β€” Ρ‚ΠΎΡ‚ ΠΆΠ΅ VirtualBox, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” поставил ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Но Ρƒ Qemu Π΅ΡΡ‚ΡŒ нСсколько интСрСсных особСнностСй

  • ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ исходники
  • Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π±Π΅Π· Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° ядра
  • Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°
  • ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° большого количСства ΠΊΠ°ΠΊ хостовых, Ρ‚Π°ΠΊ ΠΈ гостСвых Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€

На счёт Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ-Ρ‚ΠΎ я ΡƒΠΆΠ΅ ΠΌΠΎΠ³Ρƒ ΠΏΠΎΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ TCI ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π΅ сами гостСвыС ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ инструкции, Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, Π½ΠΎ сути это Π½Π΅ мСняСт β€” Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Qemu Π½Π° Π½ΠΎΠ²ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅, Ссли ΠΏΠΎΠ²Π΅Π·Ρ‘Ρ‚, достаточно компилятора C β€” написаниС ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ.

И Π²ΠΎΡ‚, послС Π΄Π²ΡƒΡ… Π»Π΅Ρ‚ нСспСшного ковыряния Π² свободноС врСмя исходников Qemu появился Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Kolibri OS.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Emscripten

Π’ нашС врСмя появилось ΠΌΠ½ΠΎΠ³ΠΎ компиляторов, ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся JavaScript. НСкоторыС, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Type Script, ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊ Π»ΡƒΡ‡ΡˆΠΈΠΉ способ ΠΏΠΈΡΠ°Ρ‚ΡŒ для Π²Π΅Π±Π°. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя, Emscripten β€” это способ Π²Π·ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° C ΠΈΠ»ΠΈ C++, ΠΈ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄, понятный Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρƒ. На этой страницС собрано Π½Π΅ΠΌΠ°Π»ΠΎ ΠΏΠΎΡ€Ρ‚ΠΎΠ² извСстных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ: здСсь, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° PyPy β€” кстати, ΠΊΠ°ΠΊ утвСрТдаСтся, Ρƒ Π½ΠΈΡ… ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ JIT. На самом Π΄Π΅Π»Π΅, Π½Π΅ Π»ΡŽΠ±ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ просто ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ β€” Π΅ΡΡ‚ΡŒ ряд особСнностСй, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ приходится ΠΌΠΈΡ€ΠΈΡ‚ΡŒΡΡ, Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΊΠ°ΠΊ гласит надпись Π½Π° этой ΠΆΠ΅ страницС "Emscripten can be used to compile almost any portable C/C++ code to JavaScript". Π’ΠΎ Π΅ΡΡ‚ΡŒ сущСствуСт ряд ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ стандарту, Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° x86 β€” ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π½Π΅Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½Ρ‹ΠΉ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ… Π²ΠΎΠΎΠ±Ρ‰Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Ρ‘Π½. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Qemu β€” ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° кроссплатформСнная ΠΈ, Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΈ Ρ‚Π°ΠΊ Π½Π΅ содСрТит большого количСства Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ повСдСния β€” Π±Π΅Ρ€ΠΈ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉ, ΠΏΠΎΡ‚ΠΎΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²ΠΎΠ·ΠΈΡ‚ΡŒΡΡ с JIT β€” ΠΈ Π³ΠΎΠ²ΠΎΡ‚ΠΎ! Но Π½Π΅ Ρ‚ΡƒΡ‚-Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ…

ΠŸΠ΅Ρ€Π²Π°Ρ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°

Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, я Π½Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, ΠΊΠΎΠΌΡƒ ΠΏΡ€ΠΈΡˆΠ»Π° Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ идСя ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Qemu Π½Π° JavaScript. На Ρ„ΠΎΡ€ΡƒΠΌΠ΅ ReactOS задавался вопрос, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Emscripten. Π•Ρ‰Ρ‘ Ρ€Π°Π½ΡŒΡˆΠ΅ Ρ…ΠΎΠ΄ΠΈΠ»ΠΈ слухи, Ρ‡Ρ‚ΠΎ это сдСлал Π»ΠΈΡ‡Π½ΠΎ Ѐабрис Π‘Π΅Π»Π»Π°Ρ€, Π½ΠΎ Ρ€Π΅Ρ‡ΡŒ шла ΠΎ jslinux, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, насколько ΠΌΠ½Π΅ извСстно, являСтся ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΎΠΉ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π½Π° JS достаточной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΈ написан с нуля. ПозднСС Π±Ρ‹Π» написан Virtual x86 β€” ΠΊ Π½Π΅ΠΌΡƒ Π±Ρ‹Π»ΠΈ Π²Ρ‹Π»ΠΎΠΆΠ΅Π½Ρ‹ нСобфусцированныС исходники, ΠΈ, ΠΊΠ°ΠΊ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π»Π°ΡΡŒ, большая "Ρ€Π΅Π°Π»ΠΈΡΡ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ" эмуляции ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ SeaBIOS Π² качСствС firmware. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π±Ρ‹Π»Π° ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄Π½Π° ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Qemu с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Emscripten β€” это пытался ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ socketpair, Π½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, насколько я понял, Π±Ρ‹Π»Π° Π·Π°ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½Π°.

Π˜Ρ‚Π°ΠΊ, казалось Π±Ρ‹, Π²ΠΎΡ‚ исходники, Π²ΠΎΡ‚ Emscripten β€” Π±Π΅Ρ€ΠΈ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉ. Но Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Qemu зависит, ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… зависят Ρ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Ρ‚.Π΄., ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ… β€” libffi, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ зависит glib. Π’ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ слухи, Ρ‡Ρ‚ΠΎ Π² большой ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΏΠΎΠ΄ Emscripten Π΅ΡΡ‚ΡŒ ΠΈ ΠΎΠ½Π°, Π½ΠΎ Π²Π΅Ρ€ΠΈΠ»ΠΎΡΡŒ ΠΊΠ°ΠΊ-Ρ‚ΠΎ с Ρ‚Ρ€ΡƒΠ΄ΠΎΠΌ: Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π½ΠΎΠ²Ρ‹ΠΌ компилятором ΠΎΠ½Π° Π½Π΅ ΡΠΎΠ±ΠΈΡ€Π°Π»Π°ΡΡŒ, Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, это слишком низкоуровнСвая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ просто Ρ‚Π°ΠΊ Π²Π·ΡΡ‚ΡŒ, ΠΈ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² JS. И Π΄Π΅Π»ΠΎ Π΄Π°ΠΆΠ΅ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ассСмблСрных вставках β€” Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, Ссли ΠΈΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ, Ρ‚ΠΎ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… calling conventions ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π±Π΅Π· Π½ΠΈΡ… ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π° стСкС ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π’ΠΎΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Emscripten β€” ΡˆΡ‚ΡƒΠΊΠΎΠ²ΠΈΠ½Π° хитрая: для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сгСнСрированный ΠΊΠΎΠ΄ выглядСл ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π° JS-Π΄Π²ΠΈΠΆΠΊΠ° Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€ΡŽΠΊΠΈ. Π’ частности, Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ relooping β€” ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΌΡƒ LLVM IR с Π½Π΅ΠΊΠΈΠΌΠΈ абстрактными инструкциями ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² пытаСтся Π²ΠΎΡΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ if-Ρ‹, Ρ†ΠΈΠΊΠ»Ρ‹ ΠΈ Ρ‚.Π΄. Ну Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ? ЕстСствСнно, ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ JS-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎ возмоТности Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· стСк.

Π’ Π½Π°Ρ‡Π°Π»Π΅ Π±Ρ‹Π»Π° ΠΌΡ‹ΡΠ»ΡŒ просто Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Ρƒ libffi Π½Π° JS ΠΈ ΠΏΡ€ΠΎΠ³Π½Π°Ρ‚ΡŒ ΡˆΡ‚Π°Ρ‚Π½Ρ‹Π΅ тСсты, Π½ΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ² я запутался Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ свои Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ β€” Ρ‡Ρ‚ΠΎ ΡƒΠΆ ΠΏΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ говорится, "Π’ΠΎ Π»ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ слоТныС, Ρ‚ΠΎ Π»ΠΈ ΠΌΡ‹ Ρ‚Π°ΠΊΠΈΠ΅ Ρ‚ΡƒΠΏΡ‹Π΅". ΠŸΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ libffi Π½Π° Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Ρƒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ, Ссли ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒΡΡ β€” ΠΊ ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π² Emscripten Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊ макросы для inline assembly (Π½Π° дТаваскриптС, Π°Π³Π° β€” Π½Ρƒ, какая Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, Ρ‚Π°ΠΊΠΎΠΉ ΠΈ ассСмблСр), Ρ‚Π°ΠΊ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сгСнСрированный Π½Π° Ρ…ΠΎΠ΄Ρƒ ΠΊΠΎΠ΄. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, повозившись Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя с ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎ-зависимыми Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ libffi, я ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π½Π΅ΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉΡΡ ΠΊΠΎΠ΄, ΠΈ ΠΏΡ€ΠΎΠ³Π½Π°Π» Π΅Π³ΠΎ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ попавшСмся тСстС. К ΠΌΠΎΠ΅ΠΌΡƒ ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΡŽ, тСст ΠΏΡ€ΠΎΡˆΡ‘Π» ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ. ΠžΡ„ΠΈΠ³Π΅Π² ΠΎΡ‚ своСй Π³Π΅Π½ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ β€” ΡˆΡƒΡ‚ΠΊΠ° Π»ΠΈ, Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ запуска β€” я, всё Π΅Ρ‰Ρ‘ Π½Π΅ вСря своим Π³Π»Π°Π·Π°ΠΌ, ΠΏΠΎΠ»Π΅Π· Π΅Ρ‰Ρ‘ Ρ€Π°Π· ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ ΠΊΠΎΠ΄, ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ, ΠΊΡƒΠ΄Π° ΠΊΠΎΠΏΠ°Ρ‚ΡŒ дальшС. Π’ΡƒΡ‚ я ΠΎΡ„ΠΈΠ³Π΅Π» Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎ β€” СдинствСнноС, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π»Π° моя функция ffi_call β€” это Ρ€Π°ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π°Π»Π° ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅. Π‘Π°ΠΌΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Π½Π΅ Π±Ρ‹Π»ΠΎ. Π’Π°ΠΊ я ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» свой ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ pull request, ΠΈΡΠΏΡ€Π°Π²Π»ΡΠ²ΡˆΠΈΠΉ ΠΏΠΎΠ½ΡΡ‚Π½ΡƒΡŽ Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΎΠ»ΠΈΠΌΠΏΠΈΠ°Π΄Π½ΠΈΠΊΡƒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² тСстС β€” вСщСствСнныС числа Π½Π΅ слСдуСт ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ a == b ΠΈ Π΄Π°ΠΆΠ΅ ΠΊΠ°ΠΊ a - b < EPS β€” Π½Π°Π΄ΠΎ Π΅Ρ‰Ρ‘ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ, Π° Ρ‚ΠΎ 0 окаТСтся ΠΎΡ‡Π΅Π½ΡŒ Π΄Π°ΠΆΠ΅ Ρ€Π°Π²Π΅Π½ 1/3… Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Ρƒ мСня получился Π½Π΅ΠΊΠΈΠΉ ΠΏΠΎΡ€Ρ‚ libffi, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ самыС простыС тСсты, ΠΈ с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ компилируСтся glib β€” Ρ€Π΅ΡˆΠΈΠ», Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌ Π΄ΠΎΠΏΠΈΡˆΡƒ. ЗабСгая Π²ΠΏΠ΅Ρ€Ρ‘Π΄ скаТу, Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ оказалось, Π² Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ libffi компилятор Π΄Π°ΠΆΠ΅ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ».

Но, ΠΊΠ°ΠΊ я ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ограничСния, ΠΈ срСди вольного использования Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ повСдСния Π·Π°Ρ‚Π΅ΡΠ°Π»Π°ΡΡŒ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ понСприятнСС β€” JavaScript by design Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ с ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, это ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ Π½Π°Π·Π²Π°Ρ‚ΡŒ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΈΠ΄Π΅Π΅ΠΉ, Π½ΠΎ Π½Π΅ для портирования ΠΊΠΎΠ΄Π°, Ρ‡ΡŒΡ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° завязана Π½Π° ΡΠΈΡˆΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, Π² Firefox ΠΈΠ΄ΡƒΡ‚ экспСримСнты ΠΏΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ shared workers, ΠΈ рСализация pthread для Π½ΠΈΡ… Π² Emscripten присутствуСт, Π½ΠΎ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ этого Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ. ΠŸΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΎΡ‚ΠΈΡ…ΠΎΠ½ΡŒΠΊΡƒ Π²Ρ‹ΠΊΠΎΡ€Ρ‡Ρ‘Π²Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈΠ· ΠΊΠΎΠ΄Π° Qemu β€” Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Ρ‹ΠΈΡΠΊΠΈΠ²Π°Ρ‚ΡŒ, Π³Π΄Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π²Ρ‹Π½ΠΎΡΠΈΡ‚ΡŒ Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π³ΠΎΡΡ Π² этом ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΈ ΠΏΠΎΠΎΡ‡Π΅Ρ€Ρ‘Π΄Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· основного Ρ†ΠΈΠΊΠ»Π°.

Вторая ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°

Π’ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ стало понятно, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ· ΠΈ Π½Ρ‹Π½Π΅ Ρ‚Π°ΠΌ, ΠΈ Ρ‡Ρ‚ΠΎ бСссистСмноС распихиваниС костылСй ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ Π΄ΠΎ Π΄ΠΎΠ±Ρ€Π° Π½Π΅ Π΄ΠΎΠ²Π΅Π΄Ρ‘Ρ‚. Π’Ρ‹Π²ΠΎΠ΄: Π½Π°Π΄ΠΎ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΡΠΈΡΡ‚Π΅ΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСсс добавлСния костылСй. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π±Ρ‹Π»Π° взята свСТая Π½Π° Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ вСрсия 2.4.1 (Π½Π΅ 2.5.0, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, ΠΌΠ°Π»ΠΎ Π»ΠΈ, Ρ‚Π°ΠΌ окаТутся Π΅Ρ‰Ρ‘ Π½Π΅ ΠΎΡ‚Π»ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π±Π°Π³ΠΈ Π½ΠΎΠ²ΠΎΠΉ вСрсии, Π° ΠΌΠ½Π΅ ΠΈ своих Π±Π°Π³ΠΎΠ² Ρ…Π²Π°Ρ‚ΠΈΡ‚), ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ Π±Ρ‹Π» бСзопасным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ пСрСписан thread-posix.c. Ну Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ бСзопасным: Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ пытался Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΡΡ‰ΡƒΡŽ ΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅, Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ функция abort() β€” ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, это Π½Π΅ Ρ€Π΅ΡˆΠ°Π»ΠΎ сразу всСх ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π½ΠΎ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, это ΠΊΠ°ΠΊ-Ρ‚ΠΎ приятнСС, Ρ‡Π΅ΠΌ Ρ‚ΠΈΡ…ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΠ½ΡΠΈΡΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ….

Π’ΠΎΠΎΠ±Ρ‰Π΅, Π² ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° Π½Π° JS ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΎΠΏΡ†ΠΈΠΈ Emscripten -s ASSERTIONS=1 -s SAFE_HEAP=1 β€” ΠΎΠ½ΠΈ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ undefined behavior Π²Ρ€ΠΎΠ΄Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΏΠΎ Π½Π΅ Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½ΠΎΠΌΡƒ адрСсу (Ρ‡Ρ‚ΠΎ совсСм Π½Π΅ согласуСтся с ΠΊΠΎΠ΄ΠΎΠΌ для typed arrays Π²Ρ€ΠΎΠ΄Π΅ HEAP32[addr >> 2] = 1) ΠΈΠ»ΠΈ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ количСством Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

ΠšΡΡ‚Π°Ρ‚ΠΈ, ошибки выравнивания β€” ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ Ρ‚Π΅ΠΌΠ°. Как я ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», Π² Qemu Π΅ΡΡ‚ΡŒ "Π²Ρ‹Ρ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ" ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ бэкСнд ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ TCI (tiny code interpreter), ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Qemu Π½Π° Π½ΠΎΠ²ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅, Ссли ΠΏΠΎΠ²Π΅Π·Ρ‘Ρ‚, достаточно компилятора C. ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова "Ссли ΠΏΠΎΠ²Π΅Π·Ρ‘Ρ‚". МнС Π²ΠΎΡ‚ Π½Π΅ ΠΏΠΎΠ²Π΅Π·Π»ΠΎ, ΠΈ оказалось, Ρ‡Ρ‚ΠΎ TCI ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ своСго Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π½Π΅ Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½Ρ‹ΠΉ доступ. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π½Π° всяких Ρ‚Π°ΠΌ ARM ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ… с ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½Ρ‹ΠΌ доступом Qemu компилируСтся ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ для Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ TCG-бэкСнд, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, Π° Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈ Π½Π° Π½ΠΈΡ… TCI β€” это Π΅Ρ‰Ρ‘ вопрос. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΊΠ°ΠΊ оказалось, Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° TCI Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΎΡΡŒ. Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π² ΠΊΠΎΠ΄ Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Π½Π΅ Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½ΠΎΠ³ΠΎ чтСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈΡΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ части Qemu.

Π Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΊΡƒΡ‡ΠΈ

Π’ ΠΈΡ‚ΠΎΠ³Π΅, Π½Π΅ Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½Ρ‹ΠΉ доступ Π² TCI Π±Ρ‹Π» исправлСн, сдСлан Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ», ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π²ΡˆΠΈΠΉ процСссор, RCU ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎ ΠΌΠ΅Π»ΠΎΡ‡ΠΈ. И Π²ΠΎΡ‚ я Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽ Qemu с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -d exec,in_asm,out_asm, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅ΠΉ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ трансляции ΠΏΠΈΡΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ гостСвой ΠΊΠΎΠ΄ Π±Ρ‹Π», ΠΊΠ°ΠΊΠΎΠΉ хостовый ΠΊΠΎΠ΄ стал (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄). Оно запускаСтся, выполняСт нСсколько Π±Π»ΠΎΠΊΠΎΠ² трансляции, ΠΏΠΈΡˆΠ΅Ρ‚ оставлСнноС ΠΌΠ½ΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠ΅ сообщСниС, Ρ‡Ρ‚ΠΎ сСйчас запустится RCU и… ΠΏΠ°Π΄Π°Π΅Ρ‚ ΠΏΠΎ abort() Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ free(). ΠŸΡƒΡ‚Ρ‘ΠΌ ковыряния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ free() ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π±Π»ΠΎΠΊΠ° ΠΊΡƒΡ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»Π΅ΠΆΠΈΡ‚ Π² восьми Π±Π°ΠΉΡ‚Π°Ρ…, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти, вмСсто Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±Π»ΠΎΠΊΠ° ΠΈΠ»ΠΈ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ оказался мусор.

Π Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΊΡƒΡ‡ΠΈ β€” ΠΊΠ°ΠΊ мило… Π’ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΌ случаС Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ срСдство β€” ΠΈΠ· (ΠΏΠΎ возмоТности) Ρ‚Π΅Ρ… ΠΆΠ΅ исходников ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ ΠΈ ΠΏΡ€ΠΎΠ³Π½Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ Valgrind. Π§Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ Π±Ρ‹Π» Π³ΠΎΡ‚ΠΎΠ². Π—Π°ΠΏΡƒΡΠΊΠ°ΡŽ с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ опциями β€” ΠΏΠ°Π΄Π°Π΅Ρ‚ Π΅Ρ‰Ρ‘ Π½Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½Π΅ дойдя Π΄ΠΎ, собствСнно, выполнСния. НСприятно, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ β€” Π²ΠΈΠ΄Π°Ρ‚ΡŒ, исходники Π±Ρ‹Π»ΠΈ Π½Π΅ совсСм Ρ‚Π΅ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, вСдь configure Ρ€Π°Π·Π²Π΅Π΄Π°Π» нСсколько Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ, Π½ΠΎ Ρƒ мСня ΠΆΠ΅ Π΅ΡΡ‚ΡŒ Valgrind β€” сначала эту Π±Π°Π³Ρƒ ΠΏΠΎΡ‡ΠΈΠ½ΡŽ, Π° ΠΏΠΎΡ‚ΠΎΠΌ, Ссли ΠΏΠΎΠ²Π΅Π·Ρ‘Ρ‚, ΠΈ исходная проявится. Π—Π°ΠΏΡƒΡΠΊΠ°ΡŽ всё Ρ‚ΠΎ ΠΆΠ΅ самоС ΠΏΠΎΠ΄ Valgrind… Π«-Ρ‹-Ρ‹, Ρƒ-Ρƒ-Ρƒ, э-э-э, ΠΎΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ»ΠΎΡΡŒ, Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ пошло дальшС ΠΌΠΈΠΌΠΎ исходного Π±Π°Π³Π° Π±Π΅Π· Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ прСдупрСТдСния ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ доступС ΠΊ памяти, Π½Π΅ говоря ΡƒΠΆ ΠΎ падСниях. К Ρ‚Π°ΠΊΠΎΠΌΡƒ Тизнь мСня, ΠΊΠ°ΠΊ говорится, Π½Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»Π° β€” ΠΏΠ°Π΄Π°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° пСрСстаёт ΠΏΠ°Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ запускС ΠΏΠΎΠ΄ Π²Π°Π»Π³Ρ€ΠΈΠ½Π΄ΠΎΠΌ. Π§Ρ‚ΠΎ это Π±Ρ‹Π»ΠΎ β€” Π·Π°Π³Π°Π΄ΠΊΠ°. Моя Π³ΠΈΠΏΠΎΡ‚Π΅Π·Π°, Ρ‡Ρ‚ΠΎ Ρ€Π°Π· Π² окрСстностях Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ инструкции послС падСния ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ gdb ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π» Ρ€Π°Π±ΠΎΡ‚Ρƒ memset-Π° с Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ с использованиСм Ρ‚ΠΎ Π»ΠΈ mmx, Ρ‚ΠΎ Π»ΠΈ xmm рСгистров, Ρ‚ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, это Π±Ρ‹Π»Π° какая-Ρ‚ΠΎ ошибка выравнивания, хотя всё Ρ€Π°Π²Π½ΠΎ вСрится слабо.

О-ΠΊΠ΅ΠΉ, Valgrind здСсь, ΠΏΠΎΡ…ΠΎΠΆΠ΅, Π½Π΅ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ. И Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚ Π½Π°Ρ‡Π°Π»ΠΎΡΡŒ самоС ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠ΅ β€” всё, Π²Ρ€ΠΎΠ΄Π΅, Π΄Π°ΠΆΠ΅ запускаСтся, Π½ΠΎ ΠΏΠ°Π΄Π°Π΅Ρ‚ ΠΏΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅Π²Π΅Π΄ΠΎΠΌΡ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ ΠΈΠ·-Π·Π° события, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠ³Π»ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹ инструкций Π½Π°Π·Π°Π΄. Π”ΠΎΠ»Π³ΠΎΠ΅ врСмя Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ΄ΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒΡΡ Π±Ρ‹Π»ΠΎ нСпонятно ΠΊΠ°ΠΊ. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ² ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ всё-Ρ‚Π°ΠΊΠΈ ΡΠ΅ΡΡ‚ΡŒ ΠΈ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ. ΠŸΠ΅Ρ‡Π°Ρ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Π΅ΠΌ Π±Ρ‹Π» пСрСписан Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, ΠΏΠΎΠΊΠ°Π·Π°Π»Π°, Ρ‡Ρ‚ΠΎ это ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π΅ Π½Π° число, Π°, скорСС, Π½Π° ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. И, ΠΎ Ρ‡ΡƒΠ΄ΠΎ, эта бинарная строка нашлась Π² Ρ„Π°ΠΉΠ»Π΅ с биосом β€” Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ с достаточной ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€Π°, ΠΈ Π΄Π°ΠΆΠ΅ понятно, Ρ‡Ρ‚ΠΎ Π² этот Π±ΡƒΡ„Π΅Ρ€ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Π»ΠΎΡΡŒ. Ну Π° дальшС ΠΊΠ°ΠΊ-Ρ‚ΠΎ Ρ‚Π°ΠΊ β€” Π² Emscripten, ΠΊ ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Ρ€Π°Π½Π΄ΠΎΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ адрСсного пространства Π½Π΅Ρ‚, Π΄Ρ‹Ρ€ Π² Π½Ρ‘ΠΌ Ρ‚ΠΎΠΆΠ΅ Π½Π΅Ρ‚, поэтому ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π³Π΄Π΅ Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² сСрСдинС ΠΊΠΎΠ΄Π° Π²Ρ‹Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ с ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ запуска, ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΈ, Ссли Ρ‚ΠΎΡ‚ Π½Π΅ измСнился, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΊ Ρ€Π°Π·ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΡŽ. ΠŸΡ€Π°Π²Π΄Π°, Π½Π° Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΡƒ послС любого измСнСния тратится ΠΏΠ°Ρ€Π° ΠΌΠΈΠ½ΡƒΡ‚, Π½ΠΎ Ρ‡Ρ‚ΠΎ подСлаСшь. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±Ρ‹Π»Π° Π½Π°ΠΉΠ΄Π΅Π½Π° конкрСтная строка, ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‰Π°Ρ BIOS ΠΈΠ· Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° Π² Π³ΠΎΡΡ‚Π΅Π²ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ β€” ΠΈ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π² Π±ΡƒΡ„Π΅Ρ€Π΅ Π½Π΅ оказалось достаточного мСста. Поиск источника Ρ‚ΠΎΠ³ΠΎ странного адрСса Π±ΡƒΡ„Π΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π» Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ qemu_anon_ram_alloc Π² Ρ„Π°ΠΉΠ»Π΅ oslib-posix.c β€” Π»ΠΎΠ³ΠΈΠΊΠ° Ρ‚Π°ΠΌ Π±Ρ‹Π»Π° такая: ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π²Ρ‹Ρ€ΠΎΠ²Π½ΡΡ‚ΡŒ адрСс ΠΏΠΎ huge page Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 2 Мб, для этого попросим Ρƒ mmap сначала Ρ‡ΡƒΡ‚ΡŒ большС, Π° ΠΏΠΎΡ‚ΠΎΠΌ лишнСС Π²Π΅Ρ€Π½Ρ‘ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ munmap. А Ссли Ρ‚Π°ΠΊΠΎΠ΅ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ Π½Π΅ трСбуСтся, Ρ‚ΠΎ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ вмСсто 2 Мб Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ getpagesize() β€” mmap ΠΆΠ΅ всё Ρ€Π°Π²Π½ΠΎ выдаст Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½Ρ‹ΠΉ адрСс… Π’Π°ΠΊ Π²ΠΎΡ‚ Π² Emscripten mmap просто Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ malloc, Π° Ρ‚ΠΎΡ‚, СстСствСнно, ΠΏΠΎ страницС Π½Π΅ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅Ρ‚. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Π±Π°Π³Π°, Ρ€Π°ΡΡΡ‚Ρ€Π°ΠΈΠ²Π°Π²ΡˆΠ°Ρ мСня ΠΏΠ°Ρ€Ρƒ мСсяцСв, ΠΈΡΠΏΡ€Π°Π²ΠΈΠ»Π°ΡΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π² Π΄Π²ΡƒΡ… строчках.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

И Π²ΠΎΡ‚ ΡƒΠΆΠ΅ процСссор Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ считаСт, Qemu Π½Π΅ ΠΏΠ°Π΄Π°Π΅Ρ‚, Π½ΠΎ экран Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ, ΠΈ процСссор быстро зацикливаСтся, судя ΠΏΠΎ Π²Ρ‹Π²ΠΎΠ΄Ρƒ -d exec,in_asm,out_asm. Появилась Π³ΠΈΠΏΠΎΡ‚Π΅Π·Π°: Π½Π΅ приходят прСрывания Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° (Π½Ρƒ ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ всС прСрывания). И Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли ΠΎΡ‚ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ сборки, которая ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π»Π°, ΠΎΡ‚ΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ прСрывания, получаСтся похоТая ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π°. Но Ρ€Π°Π·Π³Π°Π΄ΠΊΠ° оказалась совсСм Π½Π΅ Π² этом: сравнСниС трассировок, Π²Ρ‹Π΄Π°Π½Π½Ρ‹Ρ… с ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ, ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ выполнСния расходятся ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π°Π½ΠΎ. Π’ΡƒΡ‚ Π½Π°Π΄ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ сравнСниС записанного с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ запускатора emrun ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ сборки β€” Π½Π΅ совсСм мСханичСский процСсс. НС знаю Ρ‚ΠΎΡ‡Π½ΠΎ, ΠΊΠ°ΠΊ запущСнная Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° соСдиняСтся с emrun, Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ строчки Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ пСрСставлСнныС мСстами, поэтому Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π² Π΄ΠΈΡ„Ρ„Π΅ β€” это Π΅Ρ‰Ρ‘ Π½Π΅ ΠΏΠΎΠ²ΠΎΠ΄ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Ρ€Π°Π·ΠΎΡˆΠ»ΠΈΡΡŒ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, стало понятно, Ρ‡Ρ‚ΠΎ ΠΏΠΎ инструкции ljmpl происходит ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ адрСсам, Π΄Π° ΠΈ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ гСнСрируСтся ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΉ: Π² ΠΎΠ΄Π½ΠΎΠΌ Π΅ΡΡ‚ΡŒ инструкция Π²Ρ‹Π·ΠΎΠ²Π° сишной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ…Π΅Π»ΠΏΠ΅Ρ€Π°, Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ β€” Π½Π΅Ρ‚. ПослС гуглСния инструкции ΠΈ изучСния ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ эти инструкции транслируСт, стало понятно, Ρ‡Ρ‚ΠΎ, Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, нСпосрСдствСнно Π΄ΠΎ Π½Π΅Ρ‘ Π² рСгистр 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> Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Π½Π°ΠΊΠΎΠ½Π΅Ρ† подвСрнулся ΠΏΠΎΠ²ΠΎΠ΄ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ pyparsing, ΠΈ Π±Ρ‹Π» написан скрипт Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ Ρ€ΠΎΠ²Π½ΠΎ Ρ‚Π΅ ΠΈ Ρ€ΠΎΠ²Π½ΠΎ для Ρ‚Π΅Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ.

И Π²ΠΎΡ‚, послС этого процСссор Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π». Π’Ρ€ΠΎΠ΄Π΅ Π±Ρ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ экран Ρ‚Π°ΠΊ ΠΈ Π½Π΅ инициализировался, хотя Π² Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ сборкС ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ memtest86+. Π’ΡƒΡ‚ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π±Π»ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Qemu написан Π½Π° ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°Ρ…. Π’ Emscripten Π΅ΡΡ‚ΡŒ своя вСсьма заковыристая рСализация, Π½ΠΎ Π΅Ρ‘ Π΅Ρ‰Ρ‘ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅ Qemu, Π° ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ процСссор ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΆΠ΅ сСйчас: Qemu ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΏΡ†ΠΈΠΈ -kernel, -initrd, -append, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Linux ΠΈΠ»ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, memtest86+, Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π±Π»ΠΎΡ‡Π½Ρ‹Π΅ устройства. Но Π²ΠΎΡ‚ Π½Π΅Π·Π°Π΄Π°Ρ‡Π°: Π² Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ сборкС ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ Linux kernel Π½Π° консоль с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -nographic, Π° ΠΈΠ· Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», ΠΎΡ‚ΠΊΡƒΠ΄Π° Π±Ρ‹Π» Π·Π°ΠΏΡƒΡ‰Π΅Π½ emrun, Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎ. Π’ΠΎ Π΅ΡΡ‚ΡŒ нСпонятно: процСссор Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ»ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ. А ΠΏΠΎΡ‚ΠΎΠΌ ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ. Оказалось, Ρ‡Ρ‚ΠΎ "процСссор Π½Π΅ спит, Π° просто ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΌΠΎΡ€Π³Π°Π΅Ρ‚", ΠΈ ΠΌΠΈΠ½ΡƒΡ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΏΡΡ‚ΡŒ ядро Π²Ρ‹ΠΊΠΈΠ½ΡƒΠ»ΠΎ Π½Π° консоль ΠΏΠ°Ρ‡ΠΊΡƒ сообщСний ΠΈ пошло Π²ΠΈΡΠ½ΡƒΡ‚ΡŒ дальшС. Π‘Ρ‚Π°Π»ΠΎ понятно, Ρ‡Ρ‚ΠΎ процСссор, Π² Ρ†Π΅Π»ΠΎΠΌ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΈ ΠΊΠΎΠΏΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π² ΠΊΠΎΠ΄Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с SDL2. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ я, ΠΊ соТалСнию, Π½Π΅ ΡƒΠΌΠ΅ΡŽ, поэтому мСстами ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΡƒΠ³Π°Π΄. Π’ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π° экранС ΠΏΡ€ΠΎΠΌΠ΅Π»ΡŒΠΊΠ½ΡƒΠ»Π° строчка parallel0 Π½Π° синСм Ρ„ΠΎΠ½Π΅, Ρ‡Ρ‚ΠΎ Π½Π°Π²ΠΎΠ΄ΠΈΠ»ΠΎ Π½Π° Π½Π΅ΠΊΠΈΠ΅ мысли. Π’ ΠΈΡ‚ΠΎΠ³Π΅ оказалось, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»ΠΎ Π±Ρ‹Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Qemu ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ нСсколько Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΠΎΠ½ Π² ΠΎΠ΄Π½ΠΎΠΌ физичСском ΠΎΠΊΠ½Π΅, ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΏΠΎ Ctrl-Alt-n: Π² Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ сборкС ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π² Emscripten β€” Π½Π΅Ρ‚. ПослС избавлСния ΠΎΡ‚ Π»ΠΈΡˆΠ½ΠΈΡ… ΠΎΠΊΠΎΠ½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΉ -monitor none -parallel none -serial none ΠΈ указания ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ вСсь экран Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠ°Π΄Ρ€Π΅ всё Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ.

ΠšΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹

Π˜Ρ‚Π°ΠΊ, эмуляция Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ интСрСсного однодискСтного Π² Π½Π΅ΠΉ Π½Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ Π±Π»ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° β€” Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½. Π’ Qemu ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ нСсколько coroutine backend-ΠΎΠ², Π½ΠΎ Π² силу особСнностСй JavaScript ΠΈ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Emscripten нСльзя просто Π²Π·ΡΡ‚ΡŒ ΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΆΠΎΠ½Π³Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ стСками. Казалось Π±Ρ‹, "усё ΠΏΡ€ΠΎΠΏΠ°Π»ΠΎ, гипс ΡΠ½ΠΈΠΌΠ°ΡŽΡ‚", Π½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Emscripten ΡƒΠΆΠ΅ ΠΎΠ±ΠΎ всём ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΠ»ΠΈΡΡŒ. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ это довольно Π·Π°Π±Π°Π²Π½ΠΎ: Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Π·ΠΎΠ²Ρ‘ΠΌ ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ€ΠΎΠ΄Π΅ emscripten_sleep ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Asyncify, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ ΠΈ Π²Ρ‹Π·ΠΎΠ²Ρ‹ любой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π³Π΄Π΅ Π½ΠΈΠΆΠ΅ ΠΏΠΎ стСку ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π΄Π²ΡƒΡ… случаСв. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Π²Ρ‹Π΄Π΅Π»ΠΈΠΌ async context, Π° сразу послС Π²Ρ‹Π·ΠΎΠ²Π° β€” ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΡ‘Π» Π»ΠΈ асинхронный Π²Ρ‹Π·ΠΎΠ², ΠΈ Ссли ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΡ‘Π», Ρ‚ΠΎ сохраним всС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² этот async context, ΡƒΠΊΠ°ΠΆΠ΅ΠΌ, Π½Π° ΠΊΠ°ΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΈ Π²Ρ‹ΠΉΠ΄Π΅ΠΌ ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ΠΎΡ‚ ΡƒΠΆ Π³Π΄Π΅ простор для изучСния эффСкта растаращивания β€” для Π½ΡƒΠΆΠ΄ продолТСния выполнСния ΠΊΠΎΠ΄Π° послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· асинхронного Π²Ρ‹Π·ΠΎΠ²Π° компилятор Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ "ΠΎΠ±Ρ€ΡƒΠ±ΠΊΠΈ" Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ послС ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° β€” Π²ΠΎΡ‚ Ρ‚Π°ΠΊ: Ссли Π΅ΡΡ‚ΡŒ n ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Ρ‚ΠΎ функция Π±ΡƒΠ΄Π΅Ρ‚ растаращСна Π³Π΄Π΅-Ρ‚ΠΎ Π² n/2 Ρ€Π°Π· β€” это Π΅Ρ‰Ρ‘, Ссли Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½ΡƒΠΆΠ½ΠΎ послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ асинхронного Π²Ρ‹Π·ΠΎΠ²Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ сохранСниС части Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ВпослСдствии Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΉ скрипт Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ мноТСству особо растаращСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, "Π½Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ сквозь сСбя" (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² Π½ΠΈΡ… Π½Π΅ срабатываСт раскрутка стСка ΠΈ всё Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ описал), ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π² ΠΊΠ°ΠΊΠΈΡ… функциях Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ компилятору, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊ асинхронныС. А Ρ‚ΠΎ JS-Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎΠ΄ 60 Мб β€” это ΡƒΠΆΠ΅ явно ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ β€” ΠΏΡƒΡΡ‚ΡŒ ΡƒΠΆ хотя Π±Ρ‹ 30. Π₯отя, ΠΊΠ°ΠΊ-Ρ‚ΠΎ Ρ€Π°Π· я настраивал сборочный скрипт, ΠΈ случайно Π²Ρ‹ΠΊΠΈΠ½ΡƒΠ» ΠΎΠΏΡ†ΠΈΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ°, срСди ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Ρ‹Π»Π° ΠΈ -O3. Π—Π°ΠΏΡƒΡΠΊΠ°ΡŽ сгСнСрированный ΠΊΠΎΠ΄, ΠΈ Chromium Π²Ρ‹ΠΆΠΈΡ€Π°Π΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΠΏΠ°Π΄Π°Π΅Ρ‚. Π― ΠΏΠΎΡ‚ΠΎΠΌ случайно посмотрСл Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ пытался Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒβ€¦ Ну, Ρ‡Ρ‚ΠΎ я ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, я Π±Ρ‹ Ρ‚ΠΎΠΆΠ΅ завис, Ссли Π±Ρ‹ мСня попросили Π²Π΄ΡƒΠΌΡ‡ΠΈΠ²ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ дТаваскрипт Π½Π° 500+ Мб.

К соТалСнию, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π² ΠΊΠΎΠ΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Asyncify Π½Π΅ совсСм Π΄Ρ€ΡƒΠΆΠΈΠ»ΠΈ с longjmp-Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ΄Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора, Π½ΠΎ послС нСбольшого ΠΏΠ°Ρ‚Ρ‡Π°, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ эти ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ контСксты Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ всё Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΊΠΎΠ΄ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π». И Ρ‚ΡƒΡ‚ Π½Π°Ρ‡Π°Π»ΠΎΡΡŒ странноС: ΠΈΠ½ΠΎΠ³Π΄Π° срабатывали ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π² ΠΊΠΎΠ΄Π΅ синхронизации β€” Ρ‚Π΅ самыС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ ΠΊΠΎΠ΄, Ссли ΠΏΠΎ Π»ΠΎΠ³ΠΈΠΊΠ΅ выполнСния ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ β€” ΠΊΡ‚ΠΎ-Ρ‚ΠΎ пытался Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, это оказалась Π½Π΅ логичСская ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² сСриализованном ΠΊΠΎΠ΄Π΅ β€” просто я использовал ΡˆΡ‚Π°Ρ‚Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ main loop, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅ΠΌΡƒΡŽ Emscripten, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° асинхронный Π²Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π» стСк, Π° Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ срабатывал setTimeout ΠΎΡ‚ main loop β€” Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ΄ Π·Π°Ρ…ΠΎΠ΄ΠΈΠ» Π² ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°, Π½Π΅ выйдя ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Π» Π½Π° бСсконСчном Ρ†ΠΈΠΊΠ»Π΅ ΠΈ emscripten_sleep, ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°ΠΌΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ»ΠΈΡΡŒ. Код Π΄Π°ΠΆΠ΅ Π»ΠΎΠ³ΠΈΡ‡Π½Π΅Π΅ стал β€” вСдь, ΠΏΠΎ сути, Ρƒ мСня Π½Π΅Ρ‚ Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ ΠΊΠ°Π΄Ρ€ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ β€” просто процСссор Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ считаСт ΠΈ экран пСриодичСски обновляСтся. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π° этом Π½Π΅ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ»ΠΈΡΡŒ: ΠΈΠ½ΠΎΠ³Π΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Qemu просто Ρ‚ΠΈΡ…ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π»ΠΎΡΡŒ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ… Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ ошибок. Π’ Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ я Π½Π° это Π·Π°Π±ΠΈΠ», Π½ΠΎ, забСгая Π²ΠΏΠ΅Ρ€Ρ‘Π΄ скаТу, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° Π²ΠΎΡ‚ Π² Ρ‡Ρ‘ΠΌ: ΠΊΠΎΠ΄ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½, Π½Π° самом Π΄Π΅Π»Π΅, Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ setTimeout (Π½Ρƒ ΠΈΠ»ΠΈ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π½Π΅ Ρ‚Π°ΠΊ часто, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ): функция emscripten_yield просто выставляСт Ρ„Π»Π°ΠΆΠΎΠΊ асинхронного Π²Ρ‹Π·ΠΎΠ²Π°. Вся соль Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ emscripten_coroutine_next Π½Π΅ являСтся асинхронной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ: Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя ΠΎΠ½Π° провСряСт Ρ„Π»Π°ΠΆΠΎΠΊ, сбрасываСт Π΅Π³ΠΎ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΡƒΠ΄Π° Π½Π°Π΄ΠΎ. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π½Π° Π½Π΅ΠΉ раскрутка стСка заканчиваСтся. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠ·-Π·Π° use-after-free, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ проявлялся ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½ΠΎΠΌ ΠΏΡƒΠ»Π΅ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ я Π½Π΅ Π΄ΠΎΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π» Π²Π°ΠΆΠ½ΡƒΡŽ строчку ΠΊΠΎΠ΄Π° ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ coroutine backend, функция qemu_in_coroutine Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° true, ΠΊΠΎΠ³Π΄Π° Π½Π° самом Π΄Π΅Π»Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Π»Π° Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ false. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ emscripten_yield, Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎ стСку Π½Π΅ Π±Ρ‹Π»ΠΎ emscripten_coroutine_next, стСк разворачивался Π΄ΠΎ самого Π²Π΅Ρ€Ρ…Π°, Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… setTimeout, ΠΊΠ°ΠΊ я ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», Π½Π΅ Π²Ρ‹ΡΡ‚Π°Π²Π»ΡΠ»ΠΎΡΡŒ.

ΠšΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡ JavaScript

А Π²ΠΎΡ‚, собствСнно, ΠΈ ΠΎΠ±Π΅Ρ‰Π°Π½Π½ΠΎΠ΅ "ΠΏΡ€ΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ„Π°Ρ€ΡˆΠ° Π½Π°Π·Π°Π΄". На самом Π΄Π΅Π»Π΅ Π½Π΅Ρ‚. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ссли Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ Qemu, Π° Π² Π½Ρ‘ΠΌ β€” Node.js, Ρ‚ΠΎ, СстСствСнно, послС ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π² Qemu ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ Ρ‚ΠΎΡ‚ JavaScript. Но всё-Ρ‚Π°ΠΊΠΈ, ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠΊΠ°ΠΊΠΎΠ΅, Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅.

Для Π½Π°Ρ‡Π°Π»Π° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Qemu. Π‘Ρ€Π°Π·Ρƒ ΠΏΡ€ΠΎΡˆΡƒ мСня ΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ: я Π½Π΅ являюсь ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ Qemu ΠΈ ΠΌΠΎΠΈ Π²Ρ‹Π²ΠΎΠ΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ мСстами ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹. Как говорится, "ΠΌΠ½Π΅Π½ΠΈΠ΅ студСнта Π½Π΅ обязано ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с ΠΌΠ½Π΅Π½ΠΈΠ΅ΠΌ прСподаватСля, аксиоматикой ПСано ΠΈ Π·Π΄Ρ€Π°Π²Ρ‹ΠΌ смыслом". Π£ Qemu Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΠ΅ количСство ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… гостСвых Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΅ΡΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π²Ρ€ΠΎΠ΄Π΅ target-i386. ΠŸΡ€ΠΈ сборкС ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… гостСвых Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€, Π½ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получится просто нСсколько Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠΎΠ². Код для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ гостСвой Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Qemu, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ TCG (Tiny Code Generator) ΡƒΠΆΠ΅ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ хостовой Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹. Как утвСрТдаСтся Π² readme-Ρ„Π°ΠΉΠ»Π΅, Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΌ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ tcg, ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ это Π±Ρ‹Π»Π° Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ компилятора C, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΡ‚ΠΎΠΌ приспособили ΠΏΠΎΠ΄ JIT. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, target architecture Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… этого Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° β€” это ΡƒΠΆΠ΅ Π½Π΅ гостСвая, Π° хостовая Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°. Π’ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ появился Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ β€” Tiny Code Interpreter (TCI), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄ (практичСски Ρ‚Π΅ ΠΆΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ) Π² отсутствии ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ…ΠΎΡΡ‚ΠΎΠ²ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ. На самом Π΄Π΅Π»Π΅, ΠΊΠ°ΠΊ говорится Π² Π΅Π³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, этот ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ всСгда Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΊΠ°ΠΊ JIT-ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ количСствСнно Π² ΠΏΠ»Π°Π½Π΅ скорости, Π½ΠΎ ΠΈ качСствСнно. Π₯отя Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ описаниС ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ.

ΠŸΠΎΠ½Π°Ρ‡Π°Π»Ρƒ я пытался ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ TCG backend, Π½ΠΎ быстро запутался Π² исходниках ΠΈ Π½Π΅ Π²ΠΏΠΎΠ»Π½Π΅ понятном описании инструкций Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°, поэтому Ρ€Π΅ΡˆΠΈΠ» ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ TCI. Π­Ρ‚ΠΎ Π΄Π°Π»ΠΎ сразу нСсколько прСимущСств:

  • ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π΅ Π² описаниС инструкций, Π° Π² ΠΊΠΎΠ΄ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°
  • ΠΌΠΎΠΆΠ½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ встрСчСнного Π±Π»ΠΎΠΊΠ° трансляции, Π° Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС сотого исполнСния
  • Π² случаС измСнСния сгСнСрированного ΠΊΠΎΠ΄Π° (Π° Ρ‚Π°ΠΊΠΎΠ΅, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, судя ΠΏΠΎ функциям с названиями, содСрТащими слово patch) ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сгСнСрированный JS-ΠΊΠΎΠ΄, Π½ΠΎ Ρƒ мСня хотя Π±Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚, ΠΈΠ· Ρ‡Π΅Π³ΠΎ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

На счёт Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π° Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ‚Ρ‡ΠΈΠ½Π³ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· исполнСн, Π½ΠΎ ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π΄Π²ΡƒΡ… ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² достаточно.

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ΄ гСнСрировался Π² Π²ΠΈΠ΄Π΅ большого switch ΠΏΠΎ адрСсу исходной инструкции Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°, Π½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌ, вспомнив ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΏΡ€ΠΎ Emscripten, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ JS ΠΈ relooping, Ρ€Π΅ΡˆΠΈΠ» Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ чСловСчСский ΠΊΠΎΠ΄, Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Ρ‡Ρ‚ΠΎ эмпиричСски ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ СдинствСнная Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² Π±Π»ΠΎΠΊ трансляции β€” это Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»ΠΎ. Π‘ΠΊΠ°Π·Π°Π½ΠΎ β€” сдСлано, Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя получился ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ с if-Π°ΠΌΠΈ (хотя ΠΈ Π±Π΅Π· Ρ†ΠΈΠΊΠ»ΠΎΠ²). Но Π²ΠΎΡ‚ Π½Π΅Π·Π°Π΄Π°Ρ‡Π°, ΠΎΠ½ ΠΏΠ°Π΄Π°Π», выдавая сообщСниС ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ инструкция оказалась ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. ΠŸΡ€ΠΈ этом послСдняя инструкция Π½Π° этом ΡƒΡ€ΠΎΠ²Π½Π΅ рСкурсии Π±Ρ‹Π»Π° brcond. Π₯ΠΎΡ€ΠΎΡˆΠΎ, добавлю ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π² Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ этой инстукции Π΄ΠΎ рСкурсивного Π²Ρ‹Π·ΠΎΠ²Π° ΠΈ послС и… Π½Π΅ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ… Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡŒ, Π½ΠΎ послС свича ΠΏΠΎ assert-Ρƒ всё ΠΆΠ΅ ΡƒΠΏΠ°Π»ΠΈ. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², ΠΈΠ·ΡƒΡ‡ΠΈΠ² сгСнСрированный ΠΊΠΎΠ΄, я понял, Ρ‡Ρ‚ΠΎ послС switch-Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ пСрСзагруТаСтся со стСка ΠΈ, вСроятно, пСрСтираСтся Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ JavaScript-ΠΊΠΎΠ΄ΠΎΠΌ. Π’Π°ΠΊ ΠΎΠ½ΠΎ ΠΈ оказалось. Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€Π° с ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Π° Π΄ΠΎ дСсяти Π½ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ, ΠΈ стало понятно, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π±Π΅Π³Π°Π΅Ρ‚ ΠΏΠΎ ΠΊΡ€ΡƒΠ³Ρƒ. ΠŸΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Π²Ρ‹ΡˆΠ»ΠΈ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ TB, ΠΈ Ссли Π²Ρ‹ΡˆΠ»ΠΈ, Ρ‚ΠΎ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ адрСс ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ TB со Π·Π½Π°ΠΊΠΎΠΌ минус, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ это Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ "ΠΊΠ°ΠΊΠΈΠ΅ сгСнСрированныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ½Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ссли помСнялся Π²ΠΎΡ‚ этот кусочСк Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°?" β€” ΠΈΠ½Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая соотвСтствуСт этому Π±Π»ΠΎΠΊΡƒ трансляции. ΠšΡΡ‚Π°Ρ‚ΠΈ, хотя ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Π» я всё Π² Chromium (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡΡŒ Firefox ΠΈ ΠΌΠ½Π΅ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ для экспСримСнтов), Π½ΠΎ Firefox ΠΌΠ½Π΅ ΠΏΠΎΠΌΠΎΠ³ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ нСсовмСстимости со стандартом 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-Π±ΠΈΡ‚Π½Ρ‹Ρ… гостСвых Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€: Π²Ρ‹ прямо сСйчас ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡŽΠ±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° виснущий Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ Π½Π° этапС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Линукс для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ MIPS

Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΅Ρ‰Ρ‘ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ

  • Π£ΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ΡΠΌΡƒΠ»ΡΡ†ΠΈΡŽ. Π”Π°ΠΆΠ΅ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ JIT ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΡ…ΠΎΠΆΠ΅, ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ Virtual x86 (Π·Π°Ρ‚ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π΅ΡΡ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΉ Qemu с большим количСством эмулируСмого ΠΆΠ΅Π»Π΅Π·Π° ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€)
  • Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс β€” Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΠ· мСня, прямо скаТСм, Ρ‚Π°ΠΊ сСбС, поэтому ΠΏΠΎΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Π» ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ Emscripten, ΠΊΠ°ΠΊ сумСл
  • ΠŸΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Qemu β€” ΡΠ΅Ρ‚ΡŒ, ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ VM ΠΈ Ρ‚.Π΄.
  • UPD: Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π΄Π°Ρ‚ΡŒ Π² апстрим Emscripten свои нСмногочислСнныС Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Π±Π°Π³-Ρ€Π΅ΠΏΠΎΡ€Ρ‚Ρ‹, ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°Π»ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ Qemu ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Бпасибо ΠΈΠΌ Π·Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ нСявно ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΡ… Π²ΠΊΠ»Π°Π΄ΠΎΠΌ Π² Emscripten Π² Ρ€Π°ΠΌΠΊΠ°Ρ… своСй Π·Π°Π΄Π°Ρ‡ΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com