QEMU.js: сСга сСриозно ΠΈ со WASM

Π•Π΄Π½Π°Ρˆ ΠΎΠ΄Π°ΠΌΠ½Π° Ρ€Π΅ΡˆΠΈΠ² Π·Π° Π·Π°Π±Π°Π²Π° Π΄ΠΎΠΊΠ°ΠΆΠ΅ рСвСрзибилноста Π½Π° процСсот ΠΈ Π½Π°ΡƒΡ‡Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚Π΅ JavaScript (ΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎ, Asm.js) ΠΎΠ΄ ΠΌΠ°ΡˆΠΈΠ½ΡΠΊΠΈΠΎΡ‚ ΠΊΠΎΠ΄. Π—Π° СкспСримСнтот бСшС ΠΈΠ·Π±Ρ€Π°Π½ QEMU, Π° извСсно Π²Ρ€Π΅ΠΌΠ΅ ΠΏΠΎΠ΄ΠΎΡ†Π½Π° бСшС напишана ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Π½Π° Π₯Π°Π±Ρ€. Π’ΠΎ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ ΠΌΠ΅ совСтуваа Π΄Π° Π³ΠΎ ΠΏΡ€Π΅ΠΏΡ€Π°Π²Π°ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Π²ΠΎ WebAssembly, ΠΏΠ° Π΄ΡƒΡ€ΠΈ ΠΈ самиот Π΄Π° сС ΠΎΡ‚ΠΊΠ°ΠΆΠ°ΠΌ рСчиси Π·Π°Π²Ρ€ΡˆΠ΅Π½Π° НСкако Π½Π΅ Π³ΠΎ сакав ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚... Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° сС одвивашС, Π½ΠΎ ΠΌΠ½ΠΎΠ³Ρƒ Π±Π°Π²Π½ΠΎ, Π° сСга, Π½Π΅ΠΎΠ΄Π°ΠΌΠ½Π° Π²ΠΎ Ρ‚Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° сС појави ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ Π½Π° Ρ‚Π΅ΠΌΠ° β€žΠŸΠ°, ΠΊΠ°ΠΊΠΎ Π·Π°Π²Ρ€ΡˆΠΈ сСто Ρ‚ΠΎΠ°? Како ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€ Π½Π° ΠΌΠΎΡ˜ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅Π½ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€, ΡΠ»ΡƒΡˆΠ½Π°Π² β€žΠžΠ²Π° Π·Π²ΡƒΡ‡ΠΈ ΠΊΠ°ΠΊΠΎ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°β€œ. Па, Π°ΠΊΠΎ ΠΌΠΎΠΆΠ΅, ќС ΠΈΠΌΠ° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°. МоТСби Π½Π° нСкој ќС ΠΌΡƒ Π±ΠΈΠ΄Π΅ корисно. Од Π½Π΅Π³ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΎΡ‚ ќС Π½Π°ΡƒΡ‡ΠΈ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Ρ„Π°ΠΊΡ‚ΠΈ Π·Π° Π΄ΠΈΠ·Π°Ρ˜Π½ΠΎΡ‚ Π½Π° ΠΏΠΎΠ·Π°Π΄ΠΈΠ½ΠΈΡ‚Π΅ Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ΄ QEMU, ΠΊΠ°ΠΊΠΎ ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€ Just-in-Time Π·Π° Π²Π΅Π±-Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°.

Π·Π°Π΄Π°Ρ‡ΠΈ

Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ вСќС Π½Π°ΡƒΡ‡ΠΈΠ² ΠΊΠ°ΠΊΠΎ β€žΠ½Π΅ΠΊΠ°ΠΊΠΎβ€œ Π΄Π° Π³ΠΎ ΠΏΡ€Π΅Ρ„Ρ€Π»Π°ΠΌ QEMU Π½Π° JavaScript, овој ΠΏΠ°Ρ‚ бСшС ΠΎΠ΄Π»ΡƒΡ‡Π΅Π½ΠΎ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²Π°ΠΌ Ρ‚ΠΎΠ° ΠΌΡƒΠ΄Ρ€ΠΎ ΠΈ Π΄Π° Π½Π΅ Π³ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡƒΠ²Π°ΠΌ старитС Π³Ρ€Π΅ΡˆΠΊΠΈ.

Π“Ρ€Π΅ΡˆΠΊΠ° Π±Ρ€ΠΎΡ˜ Π΅Π΄Π΅Π½: Ρ€Π°Π·Π³Ρ€Π°Π½Π΅Ρ‚Π΅ сС ΠΎΠ΄ ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π°

ΠœΠΎΡ˜Π°Ρ‚Π° ΠΏΡ€Π²Π° Π³Ρ€Π΅ΡˆΠΊΠ° бСшС ΡˆΡ‚ΠΎ ја ΠΎΡ‚ΠΊΠΈΠ½Π°Π² ΠΌΠΎΡ˜Π°Ρ‚Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° ΠΎΠ΄ upstream Π²Π΅Ρ€Π·ΠΈΡ˜Π°Ρ‚Π° 2.4.1. Вогаш ΠΌΠΈ сС Ρ‡ΠΈΠ½Π΅ΡˆΠ΅ Π΄ΠΎΠ±Ρ€Π° идСја: Π°ΠΊΠΎ постои ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°, Ρ‚ΠΎΠ³Π°Ρˆ Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ Π΅ постабилно ΠΎΠ΄ Сдноставниот 2.4, Π° ΡƒΡˆΡ‚Π΅ повСќС Π³Ρ€Π°Π½ΠΊΠ°Ρ‚Π° master. И бидСјќи ΠΏΠ»Π°Π½ΠΈΡ€Π°Π² Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π°ΠΌ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Π³ΠΎΠ»Π΅ΠΌΠ° ΠΊΠΎΠ»ΠΈΡ‡ΠΈΠ½Π° Π½Π° ΠΌΠΎΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ, Π²ΠΎΠΎΠΏΡˆΡ‚ΠΎ Π½Π΅ ΠΌΠΈ Ρ‚Ρ€Π΅Π±Π°Π° Π½ΠΈΡ‡ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΈ. Π’Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ Ρ‚Π°ΠΊΠ° испадна. Но, Ρ‚ΡƒΠΊΠ° Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π°: QEMU Π½Π΅ стои, Π° Π²ΠΎ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄ΡƒΡ€ΠΈ најавија ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π½Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π·Π° 10 ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΈ. β€žΠ”Π°, сСга ќС Π·Π°ΠΌΡ€Π·Π½Π°ΠΌβ€œ, си помислив ΠΈ сС расипав. ОвдС Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ Π΄ΠΈΠ³Ρ€Π΅ΡΠΈΡ˜Π°: ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π°Ρ‚Π° Π½Π° QEMU.js со Π΅Π΄Π½Π° нишка ΠΈ Ρ„Π°ΠΊΡ‚ΠΎΡ‚ Π΄Π΅ΠΊΠ° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΠΎΡ‚ QEMU Π½Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π° отсуство Π½Π° повСќСнишки (односно, способност Π·Π° истоврСмСно ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ со Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π½Π΅ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ ΠΏΠ°Ρ‚Π΅ΠΊΠΈ Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚, ΠΈ Π½Π΅ само β€žΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ‚Π΅ Π³ΠΈ ситС ΠΊΠ΅Ρ€Π½Π΅Π»ΠΈβ€œ) Π΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ Π·Π° Ρ‚ΠΎΠ°, Π³Π»Π°Π²Π½ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Π½ΠΈΡˆΠΊΠΈΡ‚Π΅ ΠΌΠΎΡ€Π°Π² Π΄Π° Π³ΠΈ β€žΠΈΡΠΊΠ»ΡƒΡ‡Π°ΠΌβ€œ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ°ΠΌ Π΄Π° ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°ΠΌ ΠΎΠ΄Π½Π°Π΄Π²ΠΎΡ€. Ова создадС Π½Π΅ΠΊΠΎΠΈ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΡΠΏΠΎΡ˜ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ. Π‘Π΅ΠΏΠ°ΠΊ, Ρ„Π°ΠΊΡ‚ΠΎΡ‚ Π΄Π΅ΠΊΠ° Π½Π΅ΠΊΠΎΠΈ ΠΎΠ΄ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΎΠ΄ Π³Ρ€Π°Π½ΠΊΠ° master, со кој сС ΠΎΠ±ΠΈΠ΄ΠΎΠ² Π΄Π° Π³ΠΎ спојам ΠΌΠΎΡ˜ΠΎΡ‚ ΠΊΠΎΠ΄, исто Ρ‚Π°ΠΊΠ° Π±Π΅Π° ΠΈΠ·Π±Ρ€Π°Π½ΠΈ Ρ†Ρ€Π΅ΡˆΠΈ Π²ΠΎ ΠΏΠΎΡ€Π°ΠΊΠ°Ρ‚Π° Π·Π° Ρ‚ΠΎΡ‡ΠΊΠΈ (Π° со Ρ‚ΠΎΠ° ΠΈ Π²ΠΎ ΠΌΠΎΡ˜Π°Ρ‚Π° Π³Ρ€Π°Π½ΠΊΠ°), исто Ρ‚Π°ΠΊΠ°, Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ нСмашС Π΄Π° ΠΈΠΌΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° погодност.

Π’ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, Ρ€Π΅ΡˆΠΈΠ² Π΄Π΅ΠΊΠ° сè ΡƒΡˆΡ‚Π΅ ΠΈΠΌΠ° смисла Π΄Π° Π³ΠΎ исфрлам ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΡ‚, Π΄Π° Π³ΠΎ расклопам Π·Π° Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΈ Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄Π°ΠΌ Π½ΠΎΠ²Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° ΠΎΠ΄ Π½ΡƒΠ»Π° Π²Ρ€Π· основа Π½Π° Π½Π΅ΡˆΡ‚ΠΎ посвСТо ΠΈ сСга ΠΎΠ΄ master.

Π“Ρ€Π΅ΡˆΠΊΠ° Π±Ρ€ΠΎΡ˜ Π΄Π²Π°: ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π° Π½Π° TLP

Π’ΠΎ ΡΡƒΡˆΡ‚ΠΈΠ½Π°, ΠΎΠ²Π° Π½Π΅ Π΅ Π³Ρ€Π΅ΡˆΠΊΠ°, Π²ΠΎΠΎΠΏΡˆΡ‚ΠΎ, Ρ‚ΠΎΠ° Π΅ само карактСристика Π½Π° создавањС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π²ΠΎ услови Π½Π° цСлосно Π½Π΅Π΄ΠΎΡ€Π°Π·Π±ΠΈΡ€Π°ΡšΠ΅ ΠΈ Π·Π° β€žΠΊΠ°Π΄Π΅ ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° сС Π΄Π²ΠΈΠΆΠΈΠΌΠ΅?β€œ ΠΈ Π²ΠΎΠΎΠΏΡˆΡ‚ΠΎ β€žΠ΄Π°Π»ΠΈ ќС стигнСмС Ρ‚Π°ΠΌΡƒ? Π’ΠΎ ΠΎΠ²ΠΈΠ΅ услови нСсмасно ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅ бСшС ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π° ΠΎΠΏΡ†ΠΈΡ˜Π°, Π½ΠΎ, Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ, Π½Π΅ сакав Π΄Π° ја ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡƒΠ²Π°ΠΌ Π½Π΅ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ. Овој ΠΏΠ°Ρ‚ сакав Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²Π°ΠΌ Ρ‚ΠΎΠ° ΠΌΡƒΠ΄Ρ€ΠΎ: атомски ΠΎΠ±Π²Ρ€Π·ΡƒΠ²Π°ΡšΠ°, свСсни ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚ (ΠΈ Π½Π΅ β€žΡΠΏΠΎΡ˜ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΡΠ»ΡƒΡ‡Π°Ρ˜Π½ΠΈ Π·Π½Π°Ρ†ΠΈ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ сС состави (со ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ°)β€œ, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Сднаш Ρ€Π΅ΠΊΠΎΠ» Линус Ворвалдс Π·Π° Π½Π΅ΠΊΠΎΠ³ΠΎ, спорСд Π’ΠΈΠΊΠΈΡ†ΠΈΡ‚Π°Ρ‚ΠΎΡ‚) ΠΈΡ‚Π½.

Π“Ρ€Π΅ΡˆΠΊΠ° Π±Ρ€ΠΎΡ˜ Ρ‚Ρ€ΠΈ: Π²Π»Π΅Π³ΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ Π²ΠΎΠ΄Π° Π±Π΅Π· Π΄Π° сС Π·Π½Π°Π΅ Ρ„ΠΎΡ€Π΄ΠΎΡ‚

Π‘Γ¨ ΡƒΡˆΡ‚Π΅ Π½Π΅ сС ослободив цСлосно ΠΎΠ΄ ΠΎΠ²Π°, Π½ΠΎ сСга Ρ€Π΅ΡˆΠΈΠ² Π²ΠΎΠΎΠΏΡˆΡ‚ΠΎ Π΄Π° Π½Π΅ Π³ΠΎ слСдам ΠΏΠ°Ρ‚ΠΎΡ‚ Π½Π° најмал ΠΎΡ‚ΠΏΠΎΡ€ ΠΈ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²Π°ΠΌ Ρ‚ΠΎΠ° β€žΠΊΠ°ΠΊΠΎ Π²ΠΎΠ·Ρ€Π°ΡΠ΅Π½β€œ, ΠΈΠΌΠ΅Π½ΠΎ, Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π³ΠΎ ΠΌΠΎΡ˜ΠΎΡ‚ TCG Π·Π°Π΄Π½ΠΈΠ½Π° ΠΎΠ΄ Π½ΡƒΠ»Π°, Π·Π° Π΄Π° Π½Π΅ Π΄Π° ΠΌΠΎΡ€Π° Π΄Π° ΠΊΠ°ΠΆΠ°ΠΌ ΠΏΠΎΠ΄ΠΎΡ†Π½Π°, β€žΠ”Π°, ΠΎΠ²Π° Π΅ сС Ρ€Π°Π·Π±ΠΈΡ€Π°, ΠΏΠΎΠ»Π΅ΠΊΠ°, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ°ΠΌ Π΄Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π°ΠΌ сè - Ρ‚Π°ΠΊΠ° Π΅ напишано TCI...β€œ ΠŸΠΎΠΊΡ€Π°Ρ˜ Ρ‚ΠΎΠ°, ΠΎΠ²Π° ΠΏΡ€Π²ΠΈΡ‡Π½ΠΎ изглСдашС ΠΊΠ°ΠΊΠΎ ΠΎΡ‡ΠΈΠ³Π»Π΅Π΄Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, бидСјќи Јас Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌ Π±ΠΈΠ½Π°Ρ€Π΅Π½ ΠΊΠΎΠ΄. Како ΡˆΡ‚ΠΎ Π²Π΅Π»Π°Ρ‚, β€žΠ“Π΅Π½Ρ‚ сС собрау, Π½ΠΎ Π½Π΅ Ρ‚ΠΎΡ˜β€œ: ΠΊΠΎΠ΄ΠΎΡ‚ Π΅, сС Ρ€Π°Π·Π±ΠΈΡ€Π°, Π±ΠΈΠ½Π°Ρ€Π΅Π½, Π½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π°Ρ‚Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ Сдноставно Π΄Π° сС прСнСсС Π½Π° Π½Π΅Π³ΠΎ - ΠΌΠΎΡ€Π° Сксплицитно Π΄Π° сС Ρ‚ΡƒΡ€ΠΊΠ° Π²ΠΎ прСлистувачот Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΡ˜Π°, ΡˆΡ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚ΠΈΡ€Π° со ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ ΠΎΠ΄ свСтот Π½Π° JS, кој сè ΡƒΡˆΡ‚Π΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π±ΠΈΠ΄ΠΈ спасСн Π½Π΅ΠΊΠ°Π΄Π΅. Π‘Π΅ΠΏΠ°ΠΊ, кај Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΈΡ‚Π΅ RISC Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ, ΠΊΠΎΠ»ΠΊΡƒ ΡˆΡ‚ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°ΠΌ, Ρ‚ΠΈΠΏΠΈΡ‡Π½Π° ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡ˜Π° Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° Сксплицитно Π΄Π° сС рСсСтира ΠΊΠ΅ΡˆΠΎΡ‚ Π½Π° инструкции Π·Π° Ρ€Π΅Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ ΠΊΠΎΠ΄ - Π°ΠΊΠΎ Ρ‚ΠΎΠ° Π½Π΅ Π΅ ΠΎΠ½Π° ΡˆΡ‚ΠΎ Π½ΠΈ Ρ‚Ρ€Π΅Π±Π°, Ρ‚ΠΎΠ³Π°Ρˆ, Π²ΠΎ сСкој ΡΠ»ΡƒΡ‡Π°Ρ˜, Ρ‚ΠΎΠ° Π΅ блиску. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ, ΠΎΠ΄ ΠΌΠΎΡ˜ΠΎΡ‚ послСдСн ΠΎΠ±ΠΈΠ΄, Π΄ΠΎΠ·Π½Π°Π² Π΄Π΅ΠΊΠ° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π°Ρ‚Π° Π½Π΅ сС прСнСсува Π½Π° срСдината Π½Π° Π±Π»ΠΎΠΊΠΎΡ‚ Π·Π° ΠΏΡ€Π΅Π²ΠΎΠ΄, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ навистина Π½Π΅ Π½ΠΈ Ρ‚Ρ€Π΅Π±Π° Π±Π°Ρ˜Ρ‚Π΅ΠΊΠΎΠ΄ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€Π°Π½ ΠΎΠ΄ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΡƒΠ²Π°ΡšΠ΅ ΠΈ Сдноставно ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° TB .

Π”ΠΎΡ˜Π΄ΠΎΠ° ΠΈ ΠΊΠ»ΠΎΡ†Π°Π°

Иако ΠΏΠΎΡ‡Π½Π°Π² Π΄Π° Π³ΠΎ ΠΏΡ€Π΅ΠΏΠΈΡˆΡƒΠ²Π°ΠΌ ΠΊΠΎΠ΄ΠΎΡ‚ ΡƒΡˆΡ‚Π΅ Π²ΠΎ Ρ˜ΡƒΠ»ΠΈ, Π½Π΅Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π½ΠΎ сС појави волшСбСн ΡƒΠ΄Π°Ρ€: ΠΎΠ±ΠΈΡ‡Π½ΠΎ писмата ΠΎΠ΄ GitHub пристигнуваат ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π²Π΅ΡΡ‚ΡƒΠ²Π°ΡšΠ° Π·Π° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€Π°ΡˆΠ°ΡšΠ°Ρ‚Π° ΠΈ Π±Π°Ρ€Π°ΡšΠ°Ρ‚Π° Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅, Π½ΠΎ ΠΎΠ²Π΄Π΅, одСднаш спомни Π²ΠΎ Ρ‚Π΅ΠΌΠ°Ρ‚Π° Binaryen ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎΠΌΡƒ Π·Π°Π΄Π½ΠΈΠ½Π° Π²ΠΎ контСкст, β€žΠ’ΠΎΡ˜ Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½Π΅ΡˆΡ‚ΠΎ Ρ‚Π°ΠΊΠ²ΠΎ, ΠΌΠΎΠΆΠ΅Π±ΠΈ ќС ΠΊΠ°ΠΆΠ΅ Π½Π΅ΡˆΡ‚ΠΎβ€œ. Π—Π±ΠΎΡ€ΡƒΠ²Π°Π²ΠΌΠ΅ Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΏΠΎΠ²Ρ€Π·Π°Π½Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π° ЕмскриптСн Π‘ΠΈΠ½Π°Ρ€ΠΈΠ΅Π½ Π΄Π° сС создадС WASM JIT. Па, Ρ€Π΅ΠΊΠΎΠ² Π΄Π΅ΠΊΠ° имаш Π»ΠΈΡ†Π΅Π½Ρ†Π° Apache 2.0 Ρ‚Π°ΠΌΡƒ, Π° QEMU ΠΊΠ°ΠΊΠΎ Ρ†Π΅Π»ΠΈΠ½Π° Π΅ дистрибуиран ΠΏΠΎΠ΄ GPLv2, ΠΈ Π½Π΅ сС ΠΌΠ½ΠΎΠ³Ρƒ ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½ΠΈ. ОдСднаш сС ΠΏΠΎΠΊΠ°ΠΆΠ° Π΄Π΅ΠΊΠ° Π»ΠΈΡ†Π΅Π½Ρ†Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΏΠΎΠΏΡ€Π°Π²Π΅Ρ‚Π΅ Π³ΠΎ Π½Π΅ΠΊΠ°ΠΊΠΎ (НС Π·Π½Π°ΠΌ: ΠΌΠΎΠΆΠ΅Π±ΠΈ смСни, ΠΌΠΎΠΆΠ΅Π±ΠΈ двојна Π»ΠΈΡ†Π΅Π½Ρ†Π°, ΠΌΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ΡˆΡ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ...). Ова, сС Ρ€Π°Π·Π±ΠΈΡ€Π°, ΠΌΠ΅ ΠΈΠ·Ρ€Π°Π΄ΡƒΠ²Π°, бидСјќи Π΄ΠΎΡ‚ΠΎΠ³Π°Ρˆ вСќС Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½ΠΎ Π³ΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Π² Π±ΠΈΠ½Π°Ρ€Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ WebAssembly, Π° јас Π±Π΅Π² Π½Π΅ΠΊΠ°ΠΊΠΎ Ρ‚Π°ΠΆΠ΅Π½ ΠΈ Π½Π΅Ρ€Π°Π·Π±ΠΈΡ€Π»ΠΈΠ². ИмашС ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° која ќС Π³ΠΈ ΠΏΡ€ΠΎΠ³ΠΎΠ»Ρ‚Π° основнитС Π±Π»ΠΎΠΊΠΎΠ²ΠΈ со Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΡ‚ Π½Π° Ρ‚Ρ€Π°Π½Π·ΠΈΡ†ΠΈΡ˜Π°, ќС Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅ Π±Π°Ρ˜Ρ‚Π΅ΠΊΠΎΠ΄ΠΎΡ‚, ΠΏΠ° Π΄ΡƒΡ€ΠΈ ΠΈ ќС Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΠΈ Π²ΠΎ самиот Ρ‚ΠΎΠ»ΠΊΡƒΠ²Π°Ρ‡, Π΄ΠΎΠΊΠΎΠ»ΠΊΡƒ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ.

ΠŸΠΎΡ‚ΠΎΠ° имашС повСќС писмото Π½Π° мСјлинг листата Π½Π° QEMU, Π½ΠΎ ΠΎΠ²Π° Π΅ повСќС Π·Π° ΠΏΡ€Π°ΡˆΠ°ΡšΠ΅Ρ‚ΠΎ: β€žΠšΠΎΠΌΡƒ ΠΌΡƒ Ρ‚Ρ€Π΅Π±Π° Π²ΠΎ сСкој ΡΠ»ΡƒΡ‡Π°Ρ˜?β€œ И Ρ‚ΠΎΠ° Π΅ одСднаш, сС ΠΏΠΎΠΊΠ°ΠΆΠ° Π΄Π΅ΠΊΠ° Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ. Π’ΠΎ најмала Ρ€Π°ΠΊΠ°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΈ ΠΈΠ·Π³Ρ€Π΅Π±Π΅Ρ‚Π΅ слСднитС моТности Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°, Π°ΠΊΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ повСќС ΠΈΠ»ΠΈ ΠΏΠΎΠΌΠ°Π»ΠΊΡƒ Π±Ρ€Π·ΠΎ:

  • Π»Π°Π½ΡΠΈΡ€Π°ΡšΠ΅ Π½Π° Π½Π΅ΡˆΡ‚ΠΎ Π΅Π΄ΡƒΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎ Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²Π° ΠΈΠ½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜Π°
  • Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π½Π° iOS, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ, спорСд гласинитС, СдинствСната Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΡˆΡ‚ΠΎ ΠΈΠΌΠ° ΠΏΡ€Π°Π²ΠΎ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΊΠΎΠ΄ Π²ΠΎ Π»Π΅Ρ‚ Π΅ JS ΠΌΠΎΡ‚ΠΎΡ€ (Π΄Π°Π»ΠΈ Π΅ ΠΎΠ²Π° вистина?)
  • Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΌΠΈΠ½ΠΈ-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π΅Π½ систСм - Π΅Π΄ΠΈΠ½Π΅Ρ‡Π½Π° Ρ„Π»ΠΎΠΏΠΈ, Π²Π³Ρ€Π°Π΄Π΅Π½Π°, сСкаков Π²ΠΈΠ΄ Ρ„ΠΈΡ€ΠΌΠ²Π΅Ρ€, ΠΈΡ‚Π½...

ΠšΠ°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΡΡ‚ΠΈΠΊΠΈ Π½Π° Ρ‚Ρ€Π°Π΅ΡšΠ΅ Π½Π° прСлистувачот

Како ΡˆΡ‚ΠΎ вСќС Ρ€Π΅ΠΊΠΎΠ², QEMU Π΅ ΠΏΠΎΠ²Ρ€Π·Π°Π½ со повСќСнишки, Π½ΠΎ прСлистувачот Π³ΠΎ Π½Π΅ΠΌΠ°. Па, Ρ‚ΠΎΠ° Π΅, Π½Π΅... ΠžΡ‚ΠΏΡ€Π²ΠΈΠ½ Π²ΠΎΠΎΠΏΡˆΡ‚ΠΎ Π½Π΅ ΠΏΠΎΡΡ‚ΠΎΠ΅ΡˆΠ΅, Π° ΠΏΠΎΡ‚ΠΎΠ° сС појавија WebWorkers - ΠΊΠΎΠ»ΠΊΡƒ ΡˆΡ‚ΠΎ Ρ€Π°Π·Π±Ρ€Π°Π², ΠΎΠ²Π° Π΅ ΠΌΡƒΠ»Ρ‚ΠΈ-нишки Π±Π°Π·ΠΈΡ€Π°Π½ΠΎ Π½Π° ΠΏΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ ΠΏΠΎΡ€Π°ΠΊΠΈ Π±Π΅Π· сподСлСни ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. Π‘Π΅ΠΊΠ°ΠΊΠΎ, ΠΎΠ²Π° создава Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π½Π° постоСчкиот ΠΊΠΎΠ΄ Π²Ρ€Π· основа Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΎΡ‚ Π·Π° Π·Π°Π΅Π΄Π½ΠΈΡ‡ΠΊΠ° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°. ΠŸΠΎΡ‚ΠΎΠ° ΠΏΠΎΠ΄ притисок Π½Π° Ρ˜Π°Π²Π½ΠΎΡΡ‚Π° сС ΡΠΏΡ€ΠΎΠ²Π΅Π΄ΡƒΠ²Π°ΡˆΠ΅ ΠΈ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Ρ‚ΠΎ SharedArrayBuffers. ΠŸΠΎΡΡ‚Π΅ΠΏΠ΅Π½ΠΎ сС Π²ΠΎΠ²Π΅Π΄ΡƒΠ²Π°ΡˆΠ΅, Π³ΠΎ ΠΏΡ€ΠΎΡΠ»Π°Π²ΠΈΡ˜Π° Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ Π»Π°Π½ΡΠΈΡ€Π°ΡšΠ΅ Π²ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ прСлистувачи, ΠΏΠΎΡ‚ΠΎΠ° ја ΠΏΡ€ΠΎΡΠ»Π°Π²ΠΈΡ˜Π° Новата Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΏΠ° Meltdown... По ΡˆΡ‚ΠΎ дојдоа Π΄ΠΎ Π·Π°ΠΊΠ»ΡƒΡ‡ΠΎΠΊ Π΄Π΅ΠΊΠ° Π³Ρ€ΡƒΠ±ΠΎ ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠ±ΠΎ Π΅ ΠΌΠ΅Ρ€Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ, Π½ΠΎ со помош Π½Π° Π·Π°Π΅Π΄Π½ΠΈΡ‡ΠΊΠ° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° ΠΈ ΠΊΠΎΠ½Π΅Ρ† Π³ΠΎ Π·Π³ΠΎΠ»Π΅ΠΌΡƒΠ²Π° Π±Ρ€ΠΎΡ˜Π°Ρ‡ΠΎΡ‚, сС Π΅ исто ќС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π° ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ ΠΏΡ€Π΅Ρ†ΠΈΠ·Π½ΠΎ. Π’Π°ΠΊΠ°, Π³ΠΎ ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠΈΠ²ΠΌΠ΅ ΠΌΡƒΠ»Ρ‚ΠΈΠ½ΠΈΠ·ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ со Π·Π°Π΅Π΄Π½ΠΈΡ‡ΠΊΠ° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°. Π‘Π΅ Ρ‡ΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° ΠΏΠΎΠ΄ΠΎΡ†Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π³ΠΎ Π²ΠΊΠ»ΡƒΡ‡ΠΈΡ˜Π°, Π½ΠΎ, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ стана јасно ΠΎΠ΄ ΠΏΡ€Π²ΠΈΠΎΡ‚ СкспСримСнт, постои ΠΆΠΈΠ²ΠΎΡ‚ Π±Π΅Π· Π½Π΅Π³ΠΎ, ΠΈ Π°ΠΊΠΎ Π΅ Ρ‚Π°ΠΊΠ°, ќС сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ Ρ‚ΠΎΠ° Π±Π΅Π· Π΄Π° сС ΠΏΠΎΡ‚ΠΏΠΈΡ€Π°ΠΌΠ΅ Π½Π° повСќСнишки.

Π’Ρ‚ΠΎΡ€Π°Ρ‚Π° карактСристика Π΅ нСмоТноста Π·Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ†ΠΈΠΈ Π½Π° ниско Π½ΠΈΠ²ΠΎ со стСкот: Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Сдноставно Π΄Π° Π³ΠΎ Π·Π΅ΠΌΠ΅Ρ‚Π΅, Π΄Π° Π³ΠΎ Π·Π°Ρ‡ΡƒΠ²Π°Ρ‚Π΅ Ρ‚Π΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ‚ контСкст ΠΈ Π΄Π° сС ΠΏΡ€Π΅Ρ„Ρ€Π»ΠΈΡ‚Π΅ Π½Π° Π½ΠΎΠ² со Π½ΠΎΠ² стСк. Π‘ΠΎ стСкот Π½Π° ΠΏΠΎΠ²ΠΈΡ†ΠΈ ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π° Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π°Ρ‚Π° машина JS. Π‘Π΅ Ρ‡ΠΈΠ½ΠΈ, ΡˆΡ‚ΠΎ Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚, бидСјќи сСпак Ρ€Π΅ΡˆΠΈΠ²ΠΌΠ΅ Π΄Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΠΌΠ΅ со ΠΏΡ€Π²ΠΈΡ‚Π΅ Ρ‚Π΅ΠΊΠΎΠ²ΠΈ цСлосно Ρ€Π°Ρ‡Π½ΠΎ? Π€Π°ΠΊΡ‚ Π΅ Π΄Π΅ΠΊΠ° Π±Π»ΠΎΠΊ I/O Π²ΠΎ QEMU сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° ΠΏΡ€Π΅ΠΊΡƒ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΈ, ΠΈ Ρ‚ΡƒΠΊΠ° Π΄ΠΎΠ±Ρ€ΠΎ Π±ΠΈ дошлС ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ†ΠΈΠΈΡ‚Π΅ со стСк Π½Π° ниско Π½ΠΈΠ²ΠΎ. Π—Π° ΡΡ€Π΅ΡœΠ°, Emscipten вСќС содрТи ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° асинхрони ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π΄ΡƒΡ€ΠΈ ΠΈ Π΄Π²Π΅: ΠΡΠΈΠ½Ρ„ΠΈΡ†ΠΈΡ€Π°Ρ˜Ρ‚Π΅ ΠΈ ΠŸΡ€Π΅Π²Π΅Π΄ΡƒΠ²Π°Ρ‡. ΠŸΡ€Π²ΠΈΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€Π΅ΠΊΡƒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½Π° надуСност Π²ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈΠΎΡ‚ JavaScript ΠΊΠΎΠ΄ ΠΈ повСќС Π½Π΅ Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½. Π’Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ Π΅ Ρ‚Π΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ‚ β€žΡ‚ΠΎΡ‡Π΅Π½ Π½Π°Ρ‡ΠΈΠ½β€œ ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€Π΅ΠΊΡƒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ Π±Π°Ρ˜Ρ‚Π΅ΠΊΠΎΠ΄ Π·Π° ΠΌΠ°Ρ˜Ρ‡ΠΈΠ½ ΠΏΡ€Π΅Π²Π΅Π΄ΡƒΠ²Π°Ρ‡. Π Π°Π±ΠΎΡ‚ΠΈ, сС Ρ€Π°Π·Π±ΠΈΡ€Π°, Π±Π°Π²Π½ΠΎ, Π½ΠΎ Π½Π΅ Π³ΠΎ Π½Π°Π΄ΡƒΠ²ΡƒΠ²Π° ΠΊΠΎΠ΄ΠΎΡ‚. Навистина, ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ°Ρ‚Π° Π·Π° ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΈΡ‚Π΅ Π·Π° овој ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Ρ‚Ρ€Π΅Π±Π°ΡˆΠ΅ Π΄Π° сС придонСсС нСзависно (вСќС имашС напишани ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΈ Π·Π° Asyncify ΠΈ имашС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ½ΠΎ ист API Π·Π° Emterpreter, само Ρ‚Ρ€Π΅Π±Π°ΡˆΠ΅ Π΄Π° Π³ΠΈ ΠΏΠΎΠ²Ρ€Π·Π΅Ρ‚Π΅).

Π’ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², сè ΡƒΡˆΡ‚Π΅ Π½Π΅ сум успСал Π΄Π° Π³ΠΎ ΠΏΠΎΠ΄Π΅Π»Π°ΠΌ ΠΊΠΎΠ΄ΠΎΡ‚ Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½ Π²ΠΎ WASM ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€Π°Π½ со помош Π½Π° Emterpreter, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ Π±Π»ΠΎΠΊ ΡƒΡ€Π΅Π΄ΠΈΡ‚Π΅ сè ΡƒΡˆΡ‚Π΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ (Π²ΠΈΠ΄Π΅Ρ‚Π΅ Π²ΠΎ слСдната ΡΠ΅Ρ€ΠΈΡ˜Π°, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π²Π΅Π»Π°Ρ‚ ...). Односно, Π½Π° ΠΊΡ€Π°Ρ˜ΠΎΡ‚ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅Ρ‚Π΅ Π½Π΅ΡˆΡ‚ΠΎ ΠΊΠ°ΠΊΠΎ ΠΎΠ²Π°Π° смСшна повСќСслојна Ρ€Π°Π±ΠΎΡ‚Π°:

  • ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€Π°Π½ΠΈΠΎΡ‚ Π±Π»ΠΎΠΊ Π’/И. Па, Π΄Π°Π»ΠΈ навистина ΠΎΡ‡Π΅ΠΊΡƒΠ²Π°Π²Ρ‚Π΅ Π΅ΠΌΡƒΠ»ΠΈΡ€Π°Π½ NVMe со ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π½Π° ΠΈΠ·Π²Π΅Π΄Π±Π°? πŸ™‚
  • статички ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½ Π³Π»Π°Π²Π΅Π½ QEMU ΠΊΠΎΠ΄ (ΠΏΡ€Π΅Π²Π΅Π΄ΡƒΠ²Π°Ρ‡, Π΄Ρ€ΡƒΠ³ΠΈ Π΅ΠΌΡƒΠ»ΠΈΡ€Π°Π½ΠΈ ΡƒΡ€Π΅Π΄ΠΈ ΠΈΡ‚Π½.)
  • Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡ΠΊΠΈ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½ гостин ΠΊΠΎΠ΄ Π²ΠΎ WASM

ΠšΠ°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΡΡ‚ΠΈΠΊΠΈ Π½Π° ΠΈΠ·Π²ΠΎΡ€ΠΈΡ‚Π΅ Π½Π° QEMU

Како ΡˆΡ‚ΠΎ Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ вСќС ΠΏΠΎΠ³ΠΎΠ΄ΠΈΠ²Ρ‚Π΅, ΠΊΠΎΠ΄ΠΎΡ‚ Π·Π° Π΅ΠΌΡƒΠ»Π°Ρ†ΠΈΡ˜Π° Π½Π° гостински Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ ΠΈ ΠΊΠΎΠ΄ΠΎΡ‚ Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° инструкции Π½Π° ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π° домаќин сС ΠΎΠ΄Π΄Π΅Π»Π΅Π½ΠΈ Π²ΠΎ QEMU. Π’ΡΡƒΡˆΠ½ΠΎΡΡ‚, Ρ‚ΠΎΠ° Π΅ ΡƒΡˆΡ‚Π΅ ΠΌΠ°Π»ΠΊΡƒ ΠΏΠΎΠΊΠΎΠΌΠΏΠ»ΠΈΡ†ΠΈΡ€Π°Π½ΠΎ:

  • ΠΈΠΌΠ° гостински Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ
  • постои Π°ΠΊΡ†Π΅Π»Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ, ΠΈΠΌΠ΅Π½ΠΎ, KVM Π·Π° Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π½Π° Ρ…Π°Ρ€Π΄Π²Π΅Ρ€ Π½Π° Linux (Π·Π° гостински ΠΈ домаќински систСми ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½ΠΈ Π΅Π΄Π½ΠΈ со Π΄Ρ€ΡƒΠ³ΠΈ), TCG Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ JIT ΠΊΠΎΠ΄ насСкадС. ΠŸΠΎΡ‡Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ со QEMU 2.9, сС појави ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ° Π·Π° стандардот Π·Π° Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π½Π° Ρ…Π°Ρ€Π΄Π²Π΅Ρ€ΠΎΡ‚ HAXM Π½Π° Windows (Π΄Π΅Ρ‚Π°Π»ΠΈΡ‚Π΅)
  • Π°ΠΊΠΎ сС користи TCG, Π° Π½Π΅ хардвСрска Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°, Ρ‚ΠΎΠ³Π°Ρˆ ΠΈΠΌΠ° посСбна ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ° Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ ΠΊΠΎΠ΄ Π·Π° сСкоја Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π½Π° Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΎΡ‚, ΠΊΠ°ΠΊΠΎ ΠΈ Π·Π° ΡƒΠ½ΠΈΠ²Π΅Ρ€Π·Π°Π»Π½ΠΈΠΎΡ‚ ΠΏΡ€Π΅Π²Π΅Π΄ΡƒΠ²Π°Ρ‡
  • ... ΠΈ ΠΎΠΊΠΎΠ»Ρƒ сСто ΠΎΠ²Π° - Π΅ΠΌΡƒΠ»ΠΈΡ€Π°Π½ΠΈ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€Π½ΠΈ ΡƒΡ€Π΅Π΄ΠΈ, кориснички ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜Ρ, ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Π°, Ρ€Π΅ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΡ˜Π° Π½Π° записи ΠΈΡ‚Π½.

ΠŸΠ°Ρ‚Π΅ΠΌ, Π΄Π°Π»ΠΈ Π·Π½Π°Π΅Π²Ρ‚Π΅: QEMU ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ ΠΈΠΌΠΈΡ‚ΠΈΡ€Π° Π½Π΅ само Ρ†Π΅Π»ΠΈΠΎΡ‚ ΠΊΠΎΠΌΠΏΡ˜ΡƒΡ‚Π΅Ρ€, Ρ‚ΡƒΠΊΡƒ ΠΈ процСсорот Π·Π° посСбСн кориснички процСс Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π½Π° Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΎΡ‚, кој сС користи, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ΄ AFL fuzzer Π·Π° Π±ΠΈΠ½Π°Ρ€Π½Π° ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°. МоТСби нСкој Π±ΠΈ сакал Π΄Π° Π³ΠΎ прСнСсС овој Π½Π°Ρ‡ΠΈΠ½ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° QEMU Π½Π° JS? πŸ˜‰

Како ΠΈ ΠΏΠΎΠ²Π΅ΡœΠ΅Ρ‚ΠΎ долгогодишни бСсплатни софтвСри, QEMU Π΅ ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ ΠΏΡ€Π΅ΠΊΡƒ ΠΏΠΎΠ²ΠΈΠΊΠΎΡ‚ configure ΠΈ make. Π”Π° Ρ€Π΅Ρ‡Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΎΠ΄Π»ΡƒΡ‡ΠΈΠ²Ρ‚Π΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ Π½Π΅ΡˆΡ‚ΠΎ: TCG backend, ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° нишки, Π½Π΅ΡˆΡ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ. НС Π±Ρ€Π·Π°Ρ˜Ρ‚Π΅ Π΄Π° Π±ΠΈΠ΄Π΅Ρ‚Π΅ ΡΡ€Π΅ΡœΠ½ΠΈ/уТасни (ΠΏΠΎΠ΄Π²Π»Π΅Ρ‡Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π΅ соодвСтно) ΠΏΡ€ΠΈ моТноста Π΄Π° ΠΊΠΎΠΌΡƒΠ½ΠΈΡ†ΠΈΡ€Π°Ρ‚Π΅ со Autoconf - Π²ΡΡƒΡˆΠ½ΠΎΡΡ‚, configure QEMU's ΠΎΡ‡ΠΈΠ³Π»Π΅Π΄Π½ΠΎ Π΅ самонапишан ΠΈ Π½Π΅ Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ ΠΎΠ΄ Π½ΠΈΡˆΡ‚ΠΎ.

Π’Π΅Π±-собраниС

Π—Π½Π°Ρ‡ΠΈ, ΡˆΡ‚ΠΎ Π΅ ΠΎΠ²Π° Π½Π΅ΡˆΡ‚ΠΎ ΡˆΡ‚ΠΎ сС Π½Π°Ρ€Π΅ΠΊΡƒΠ²Π° WebAssembly (ΠΏΠΎΠ·Π½Π°Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎ WASM)? Ова Π΅ Π·Π°ΠΌΠ΅Π½Π° Π·Π° Asm.js, ΡˆΡ‚ΠΎ повСќС Π½Π΅ сС ΠΏΡ€Π΅ΠΏΡ€Π°Π²Π° Π΄Π΅ΠΊΠ° Π΅ Π²Π°Π»ΠΈΠ΄Π΅Π½ JavaScript ΠΊΠΎΠ΄. Напротив, Ρ‚ΠΎΡ˜ Π΅ чисто Π±ΠΈΠ½Π°Ρ€Π΅Π½ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½, ΠΏΠ° Π΄ΡƒΡ€ΠΈ ΠΈ Сдноставното ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Ρ†Π΅Π» Π±Ρ€ΠΎΡ˜ Π²ΠΎ Π½Π΅Π³ΠΎ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³Ρƒ Сдноставно: Π·Π° компактност, Ρ‚ΠΎΡ˜ сС Ρ‡ΡƒΠ²Π° Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π›Π•Π‘128.

МоТСби стС ΡΠ»ΡƒΡˆΠ½Π°Π»Π΅ Π·Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΡ‚ Π·Π° ΠΏΡ€Π΅Π²Ρ€Ρ‚ΡƒΠ²Π°ΡšΠ΅ Π·Π° Asm.js - ΠΎΠ²Π° Π΅ Π²Ρ€Π°ΡœΠ°ΡšΠ΅ Π½Π° инструкциитС Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΡ‚ Π½Π° β€žΠ²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎβ€œ (односно, Π°ΠΊΠΎ-Ρ‚ΠΎΠ³Π°Ρˆ-ΠΈΠ½Π°ΠΊΡƒ, јамки, ΠΈΡ‚Π½.), Π·Π° ΠΊΠΎΠΈ сС Π΄ΠΈΠ·Π°Ρ˜Π½ΠΈΡ€Π°Π½ΠΈ ΠΌΠΎΡ‚ΠΎΡ€ΠΈΡ‚Π΅ JS, ΠΎΠ΄ LLVM IR Π½Π° ниско Π½ΠΈΠ²ΠΎ, поблиску Π΄ΠΎ ΠΌΠ°ΡˆΠΈΠ½ΡΠΊΠΈΠΎΡ‚ ΠΊΠΎΠ΄ ΡˆΡ‚ΠΎ Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° процСсорот. Нормално, срСдната застапСност Π½Π° QEMU Π΅ поблиску Π΄ΠΎ Π²Ρ‚ΠΎΡ€Π°Ρ‚Π°. Π‘Π΅ Ρ‡ΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° Ρ‚ΡƒΠΊΠ° Π΅, Π±Π°Ρ˜Ρ‚-ΠΊΠΎΠ΄, ΠΊΡ€Π°Ρ˜ΠΎΡ‚ Π½Π° ΠΌΠ°ΠΊΠΈΡ‚Π΅... А ΠΏΠΎΡ‚ΠΎΠ° ΠΈΠΌΠ° Π±Π»ΠΎΠΊΠΎΠ²ΠΈ, Π°ΠΊΠΎ-Ρ‚ΠΎΠ³Π°Ρˆ-Π΄Ρ€ΡƒΠ³ΠΎ ΠΈ јамки!..

И ΠΎΠ²Π° Π΅ ΡƒΡˆΡ‚Π΅ Π΅Π΄Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π·ΠΎΡˆΡ‚ΠΎ Binaryen Π΅ корисСн: Ρ‚ΠΎΡ˜ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΈΡ„Π°Ρ‚ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π½Π° високо Π½ΠΈΠ²ΠΎ блиску Π΄ΠΎ ΠΎΠ½Π° ΡˆΡ‚ΠΎ Π±ΠΈ сС складирало Π²ΠΎ WASM. Но, исто Ρ‚Π°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅ ΠΊΠΎΠ΄ ΠΎΠ΄ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ Π½Π° основни Π±Π»ΠΎΠΊΠΎΠ²ΠΈ ΠΈ Ρ‚Ρ€Π°Π½Π·ΠΈΡ†ΠΈΠΈ ΠΌΠ΅Ρ“Ρƒ Π½ΠΈΠ². Па, вСќС Ρ€Π΅ΠΊΠΎΠ² Π΄Π΅ΠΊΠ° Π³ΠΎ ΠΊΡ€ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΡ‚ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅ WebAssembly Π·Π°Π΄ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΈΠΎΡ‚ C/C++ API.

TCG (Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° ΠΌΠ°Π»ΠΈ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ)

Π“Π’Π¦ бСшС ΠΏΡ€Π²ΠΈΡ‡Π½ΠΎ backend Π·Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€ΠΎΡ‚ C. ΠŸΠΎΡ‚ΠΎΠ°, ΠΎΡ‡ΠΈΠ³Π»Π΅Π΄Π½ΠΎ, Π½Π΅ моТСшС Π΄Π° ја ΠΈΠ·Π΄Ρ€ΠΆΠΈ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΡ˜Π°Ρ‚Π° со GCC, Π½ΠΎ Π½Π° ΠΊΡ€Π°Ρ˜ΠΎΡ‚ Π³ΠΎ најдС своСто мСсто Π²ΠΎ QEMU ΠΊΠ°ΠΊΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ ΠΊΠΎΠ΄ Π·Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° домаќин. Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ° постои ΠΈ TCG backend кој Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° нСкој апстрактСн Π±Π°Ρ˜Ρ‚Π΅ΠΊΠΎΠ΄, кој вСднаш сС ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° ΠΎΠ΄ страна Π½Π° Ρ‚ΠΎΠ»ΠΊΡƒΠ²Π°Ρ‡ΠΎΡ‚, Π½ΠΎ Ρ€Π΅ΡˆΠΈΠ² Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π°ΠΌ Π΄Π° Π³ΠΎ користам овој ΠΏΠ°Ρ‚. Π‘Π΅ΠΏΠ°ΠΊ, Ρ„Π°ΠΊΡ‚ΠΎΡ‚ ΡˆΡ‚ΠΎ Π²ΠΎ 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 (ΠΊΠ°Π΄Π΅ Π±ΠΈ Π±ΠΈΠ»Π΅ Π±Π΅Π· Π½Π΅Π³ΠΎ сСга?), Ρ‚ΠΈΠ΅ ја Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π°Π°Ρ‚ ΡΠ²ΠΎΡ˜Π°Ρ‚Π° кСш Π·Π° ΠΏΡ€Π΅Π²ΠΎΠ΄ Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ° Π½Π° структура, Ρ‡ΠΈΡ˜Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΅ ΠΏΠΎΠ³ΠΎΠ΄Π½Π° Π·Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π²ΠΌΠ΅Ρ‚Π½ΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π·Π° Π΅ΠΌΠΈΡ‚ΡƒΠ²Π°ΡšΠ΅. ΠŸΡ€Π°ΡˆΠ°ΡšΠ΅Ρ‚ΠΎ Π΅ ΡˆΡ‚ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ ΠΎΠ²Π°Π° структура Π½Π°Ρ˜Π΅Ρ„ΠΈΠΊΠ°ΡΠ½ΠΎ сС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π° со ΠΌΠ°Π»Π° ΠΈ Π±Ρ€Π·Π° Π½ΠΈΠ·Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ?
  • ΠΎΠ²Π΄Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ја ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ†Π΅Π»Ρ‚Π° Π½Π° Π΅Π΄Π΅Π½ ΠΈΠ»ΠΈ Π΄Π²Π° Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€Π°Π½ΠΈ рСгистри, Π΄Π° ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈΡ‚Π΅ ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°ΡšΠ΅ Π’Π‘ ΠΏΡ€Π΅ΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° ΠΈ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΎ Π΄Π° ΠΎΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΌΠ°Π»ΠΈ 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, ΠΊΠΎΠ³Π° Π½Π°ΠΈΠ΄ΠΎΠ² Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π³ΠΎ ΠΏΡ€Π΅Ρ„Ρ€Π»ΠΈΠ² Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π°Π·Π°Π΄ Π²ΠΎ ΠΌΠ°Ρ‚ΠΈΡ‡Π½Π°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°, поставив Mozilla Record-Replay Π½Π° Π½Π΅Π°... Π’ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, Π½Π° ΠΊΡ€Π°Ρ˜ΠΎΡ‚ сфатив Π΅Π΄Π½Π° Сдноставна Ρ€Π°Π±ΠΎΡ‚Π°: Π·Π° сСкој Π±Π»ΠΎΠΊ, Π° struct TranslationBlock со Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ‚ опис. ΠŸΠΎΠ³ΠΎΠ΄Π΅Ρ‚Π΅ ΠΊΠ°Π΄Π΅... Π’Π°ΠΊΠ° Π΅, нСпосрСдно ΠΏΡ€Π΅Π΄ Π±Π»ΠΎΠΊΠΎΡ‚ ΠΏΡ€Π°Π²ΠΎ Π²ΠΎ Π±Π°Ρ„Π΅Ρ€ΠΎΡ‚. Π‘Ρ„Π°ΡœΠ°Ρ˜ΡœΠΈ Π³ΠΎ ΠΎΠ²Π°, Ρ€Π΅ΡˆΠΈΠ² Π΄Π° прСстанам Π΄Π° користам ΠΏΠ°Ρ‚Π΅Ρ€ΠΈΡ†ΠΈ (Π±Π°Ρ€Π΅ΠΌ Π½Π΅ΠΊΠΎΠΈ), ΠΈ Сдноставно Π³ΠΎ исфрлив ΠΌΠ°Π³ΠΈΡ‡Π½ΠΈΠΎΡ‚ Π±Ρ€ΠΎΡ˜ ΠΈ Π³ΠΈ ΠΏΡ€Π΅Ρ„Ρ€Π»ΠΈΠ² прСостанатитС Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ Π½Π° struct TranslationBlock, создавајќи Π΅Π΄ΠΈΠ½Π΅Ρ‡Π½ΠΎ ΠΏΠΎΠ²Ρ€Π·Π°Π½ список ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π±Ρ€Π·ΠΎ Π΄Π° сС ΠΏΠΎΠΌΠΈΠ½Π΅ ΠΊΠΎΠ³Π° ΠΊΠ΅ΡˆΠΎΡ‚ Π·Π° ΠΏΡ€Π΅Π²ΠΎΠ΄ сС рСсСтира ΠΈ Π΄Π° сС ослободи ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π°.

ΠžΡΡ‚Π°Π½ΡƒΠ²Π°Π°Ρ‚ Π½Π΅ΠΊΠΎΠΈ ΠΏΠ°Ρ‚Π΅Ρ€ΠΈΡ†ΠΈ: Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈ ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π°Ρ‡ΠΈ Π²ΠΎ Π±Π°Ρ„Π΅Ρ€ΠΎΡ‚ Π·Π° ΠΊΠΎΠ΄ΠΎΠ²ΠΈ - Π½Π΅ΠΊΠΎΠΈ ΠΎΠ΄ Π½ΠΈΠ² сС Сдноставно BinaryenExpressionRef, односно Π³ΠΈ Π³Π»Π΅Π΄Π°Π°Ρ‚ ΠΈΠ·Ρ€Π°Π·ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ Ρ‚Ρ€Π΅Π±Π° Π»ΠΈΠ½Π΅Π°Ρ€Π½ΠΎ Π΄Π° сС стават Π²ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈΠΎΡ‚ основСн Π±Π»ΠΎΠΊ, Π΄Π΅Π» Π΅ условот Π·Π° ΠΏΡ€Π΅ΠΌΠΈΠ½ ΠΏΠΎΠΌΠ΅Ρ“Ρƒ BB, Π΄Π΅Π» Π΅ ΠΊΠ°Π΄Π΅ Π΄Π° сС ΠΎΠ΄ΠΈ. Па, вСќС ΠΈΠΌΠ° ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π·Π° Relooper ΠΊΠΎΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС ΠΏΠΎΠ²Ρ€Π·Π°Ρ‚ спорСд условитС. Π—Π° Π΄Π° Π³ΠΈ Ρ€Π°Π·Π»ΠΈΠΊΡƒΠ²Π°Ρ‚Π΅, сС користи прСтпоставката Π΄Π΅ΠΊΠ° ситС Ρ‚ΠΈΠ΅ сС ΠΏΠΎΡ€Π°ΠΌΠ½Π΅Ρ‚ΠΈ Π·Π° Π½Π°Ρ˜ΠΌΠ°Π»ΠΊΡƒ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ Π±Π°Ρ˜Ρ‚ΠΈ, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎ Π΄Π° Π³ΠΈ користитС Π½Π°Ρ˜ΠΌΠ°Π»ΠΊΡƒ Π·Π½Π°Ρ‡Π°Ρ˜Π½ΠΈΡ‚Π΅ Π΄Π²Π° Π±ΠΈΡ‚Π° Π·Π° Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚Π°Ρ‚Π°, само Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ Π΄Π° ја отстранитС Π΄ΠΎΠΊΠΎΠ»ΠΊΡƒ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ. ΠŸΠ°Ρ‚Π΅ΠΌ, Ρ‚Π°ΠΊΠ²ΠΈΡ‚Π΅ ΠΎΠ·Π½Π°ΠΊΠΈ вСќС сС користат Π²ΠΎ QEMU Π·Π° Π΄Π° сС Π½Π°Π²Π΅Π΄Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ‚Π° Π·Π° ΠΈΠ·Π»Π΅Π³ΡƒΠ²Π°ΡšΠ΅ ΠΎΠ΄ Ρ˜Π°ΠΌΠΊΠ°Ρ‚Π° TCG.

ΠšΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° Binaryen

ΠœΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ Π²ΠΎ WebAssembly содрТат Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ΄ ΠΊΠΎΠΈ сСкоја содрТи Ρ‚Π΅Π»ΠΎ, ΡˆΡ‚ΠΎ Π΅ ΠΈΠ·Ρ€Π°Π·. Π˜Π·Ρ€Π°Π·ΠΈΡ‚Π΅ сС ΡƒΠ½Π°Ρ€Π½ΠΈ ΠΈ Π±ΠΈΠ½Π°Ρ€Π½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π±Π»ΠΎΠΊΠΎΠ²ΠΈ ΠΊΠΎΠΈ сС ΡΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ ΠΎΠ΄ списоци Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ ΠΈΠ·Ρ€Π°Π·ΠΈ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Π½ Ρ‚Π΅ΠΊ ΠΈΡ‚Π½. Како ΡˆΡ‚ΠΎ вСќС Ρ€Π΅ΠΊΠΎΠ², ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈΠΎΡ‚ Ρ‚Π΅ΠΊ ΠΎΠ²Π΄Π΅ Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Π½ Ρ‚ΠΎΠΊΠΌΡƒ ΠΊΠ°ΠΊΠΎ Π³Ρ€Π°Π½ΠΊΠΈ Π½Π° високо Π½ΠΈΠ²ΠΎ, циклуси, ΠΏΠΎΠ²ΠΈΡ†ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡ‚Π½. АргумСнтитС Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π½Π΅ сС прСнСсуваат Π½Π° стСкот, Ρ‚ΡƒΠΊΡƒ Сксплицитно, исто ΠΊΠ°ΠΊΠΎ Π²ΠΎ JS. Има ΠΈ Π³Π»ΠΎΠ±Π°Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Π½ΠΎ Π½Π΅ сум Π³ΠΈ користСл, ΠΏΠ° Π½Π΅ΠΌΠ° Π΄Π° Π²ΠΈ ΠΊΠ°ΠΆΠ°ΠΌ Π·Π° Π½ΠΈΠ².

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ ΠΈΠΌΠ°Π°Ρ‚ ΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Π½ΡƒΠΌΠ΅Ρ€ΠΈΡ€Π°Π½ΠΈ ΠΎΠ΄ Π½ΡƒΠ»Π°, ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚: int32 / int64 / float / double. Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, ΠΏΡ€Π²ΠΈΡ‚Π΅ n Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ сС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π°. Π˜ΠΌΠ°Ρ˜Ρ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Π΄Π΅ΠΊΠ° ΠΈΠ°ΠΊΠΎ сè ΠΎΠ²Π΄Π΅ Π½Π΅ Π΅ цСлосно Π½Π° ниско Π½ΠΈΠ²ΠΎ Π²ΠΎ однос Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈΠΎΡ‚ Ρ‚Π΅ΠΊ, Ρ†Π΅Π»ΠΈ Π±Ρ€ΠΎΠ΅Π²ΠΈ сè ΡƒΡˆΡ‚Π΅ Π½Π΅ Π³ΠΎ носат Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΡ‚ β€žΠΏΠΎΡ‚ΠΏΠΈΡˆΠ°Π½/Π½Π΅ΠΎΠ·Π½Π°Ρ‡Π΅Π½β€œ: ΠΊΠ°ΠΊΠΎ сС однСсува Π±Ρ€ΠΎΡ˜ΠΎΡ‚ зависи ΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄.

ΠžΠΏΡˆΡ‚ΠΎ Π·Π΅ΠΌΠ΅Π½ΠΎ, Binaryen ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° СдноставСн C-API: ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ», Π²ΠΎ Π½Π΅Π³ΠΎ ΠΊΡ€Π΅ΠΈΡ€Π°Ρ˜Ρ‚Π΅ ΠΈΠ·Ρ€Π°Π·ΠΈ - ΡƒΠ½Π°Ρ€Π½ΠΈ, Π±ΠΈΠ½Π°Ρ€Π½ΠΈ, Π±Π»ΠΎΠΊΠΎΠ²ΠΈ ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈ ΠΈΠ·Ρ€Π°Π·ΠΈ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Π½ Ρ‚Π΅ΠΊ ΠΈΡ‚Π½. ΠŸΠΎΡ‚ΠΎΠ° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° со ΠΈΠ·Ρ€Π°Π· ΠΊΠ°ΠΊΠΎ нСјзино Ρ‚Π΅Π»ΠΎ. Ако Π²ΠΈΠ΅, ΠΊΠ°ΠΊΠΎ ΠΌΠ΅Π½Π΅, ΠΈΠΌΠ°Ρ‚Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ Π·Π° Ρ‚Ρ€Π°Π½Π·ΠΈΡ†ΠΈΡ˜Π° Π½Π° ниско Π½ΠΈΠ²ΠΎ, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ‚Π° relooper ќС Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅. ΠšΠΎΠ»ΠΊΡƒ ΡˆΡ‚ΠΎ Ρ€Π°Π·Π±Ρ€Π°Π², ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° сС користи ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° Π½Π° високо Π½ΠΈΠ²ΠΎ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΡ‚ Π½Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ Π±Π»ΠΎΠΊ, сè Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ ΠΎΠ΄ΠΈ ΠΏΠΎΠ΄Π°Π»Π΅ΠΊΡƒ ΠΎΠ΄ Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Π±Π»ΠΎΠΊΠΎΡ‚ - односно, ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ Π²Π½Π°Ρ‚Ρ€Π΅ΡˆΠ½Π° Π±Ρ€Π·Π° ΠΏΠ°Ρ‚Π΅ΠΊΠ° / Π±Π°Π²Π½Π° Ρ€Π°Π·Π³Ρ€Π°Π½ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΠ°Ρ‚Π΅ΠΊΠ°Ρ‚Π° Π²ΠΎ Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΊΠ΅ΡˆΠΎΡ‚ TLB, Π½ΠΎ Π΄Π° Π½Π΅ сС мСша со β€žΠ½Π°Π΄Π²ΠΎΡ€Π΅ΡˆΠ½ΠΈΠΎΡ‚β€œ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Π½ Ρ‚Π΅ΠΊ . Кога ослободуватС relooper, Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ сС ослободуваат; ΠΊΠΎΠ³Π° ослободуватС ΠΌΠΎΠ΄ΡƒΠ», ΠΈΠ·Ρ€Π°Π·ΠΈΡ‚Π΅, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ ΠΈΡ‚Π½. Π΄ΠΎΠ΄Π΅Π»Π΅Π½ΠΈ Π½Π° Π½Π΅Π³ΠΎ исчСзнуваат Π°Ρ€Π΅Π½Π°.

ΠœΠ΅Ρ“ΡƒΡ‚ΠΎΠ°, Π°ΠΊΠΎ сакатС Π΄Π° Π³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€Π°Ρ‚Π΅ ΠΊΠΎΠ΄ΠΎΡ‚ Π²ΠΎ Π»Π΅Ρ‚ Π±Π΅Π· Π½Π΅ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ ΠΈ Π±Ρ€ΠΈΡˆΠ΅ΡšΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ‚ΠΎΠ»ΠΊΡƒΠ²Π°Ρ‡, ΠΌΠΎΠΆΠ΅Π±ΠΈ ќС ΠΈΠΌΠ° смисла Π΄Π° ја ставитС ΠΎΠ²Π°Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° 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 ΠΈ Π²ΠΎ исто Π²Ρ€Π΅ΠΌΠ΅ Π±Ρ€Π·ΠΎ Π΄Π° сС пристапи Π΄ΠΎ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, создадСна Π΅ Π½ΠΈΠ·Π° (Ρ‚Π°Π±Π΅Π»Π° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° ΡƒΠ²ΠΎΠ· Π²ΠΎ Ρ„Ρ€Π»Π°Ρ‡ΠΎΡ‚), Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π° поставСни Ρ‚Π°ΠΌΡƒ. Π—Π° Π±Ρ€Π·ΠΎ ΠΏΡ€Π΅ΡΠΌΠ΅Ρ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° индСксот, ΠΏΡ€Π²ΠΈΡ‡Π½ΠΎ сС ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡˆΠ΅ индСксот Π½Π° Π±Π»ΠΎΠΊΠΎΡ‚ Π·Π° ΠΏΡ€Π΅Π²ΠΎΠ΄ Π½Π° Π½ΡƒΠ»Π° Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ, Π½ΠΎ ΠΏΠΎΡ‚ΠΎΠ° индСксот прСсмСтан со ΠΎΠ²Π°Π° Ρ„ΠΎΡ€ΠΌΡƒΠ»Π° ΠΏΠΎΡ‡Π½Π° Сдноставно Π΄Π° сС Π²ΠΊΠ»ΠΎΠΏΡƒΠ²Π° Π²ΠΎ ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π²ΠΎ struct TranslationBlock.

ΠŸΠ°Ρ‚Π΅ΠΌ, Π΄Π΅ΠΌΠΎ (ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»Π½ΠΎ со ΠΌΠ°Ρ‚Π½Π° Π»ΠΈΡ†Π΅Π½Ρ†Π°) Ρ€Π°Π±ΠΎΡ‚ΠΈ Π΄ΠΎΠ±Ρ€ΠΎ само Π²ΠΎ Firefox. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Chrome Π±Π΅Π° Π½Π΅ΠΊΠ°ΠΊΠΎ Π½Π΅ Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ Π΄ΠΎ Ρ„Π°ΠΊΡ‚ΠΎΡ‚ Π΄Π΅ΠΊΠ° нСкој Π±ΠΈ сакал Π΄Π° создадС повСќС ΠΎΠ΄ илјада ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π½Π° WebAssembly ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΏΠ° Сдноставно Π΄ΠΎΠ΄Π΅Π»ΠΈΠ»Π΅ ΠΏΠΎ Π΅Π΄Π΅Π½ Π³ΠΈΠ³Π°Π±Π°Ρ˜Ρ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π΅Π½ адрСсСн простор Π·Π° сСкој ...

Π’ΠΎΠ° Π΅ сС Π·Π° сСга. МоТСби ќС ΠΈΠΌΠ° Π΄Ρ€ΡƒΠ³Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Π°ΠΊΠΎ нСкој Π³ΠΎ интСрСсира. ИмСно, останува Π±Π°Ρ€Π΅ΠΌ само Π½Π°ΠΏΡ€Π°Π²ΠΈ Π±Π»ΠΎΠΊ ΡƒΡ€Π΅Π΄ΠΈ Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚. Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° смисла Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ WebAssembly асинхрони, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π΅ Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½ΠΎ Π²ΠΎ свСтот Π½Π° JS, бидСјќи сè ΡƒΡˆΡ‚Π΅ постои ΠΏΡ€Π΅Π²Π΅Π΄ΡƒΠ²Π°Ρ‡ ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈ сСто ΠΎΠ²Π° Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ сС ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈ ΠΌΠ°Ρ˜Ρ‡ΠΈΠ½ΠΈΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ».

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ Π·Π°Π³Π°Ρ‚ΠΊΠ°: стС составилС Π±ΠΈΠ½Π°Ρ€Π΅Π½ Π½Π° 32-Π±ΠΈΡ‚Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, Π½ΠΎ ΠΊΠΎΠ΄ΠΎΡ‚, ΠΏΡ€Π΅ΠΊΡƒ мСморискитС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, сС искачува ΠΎΠ΄ Binaryen, Π½Π΅ΠΊΠ°Π΄Π΅ Π½Π° стСкот ΠΈΠ»ΠΈ Π½Π΅ΠΊΠ°Π΄Π΅ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎ мСсто Π²ΠΎ Π³ΠΎΡ€Π½ΠΈΡ‚Π΅ 2 GB ΠΎΠ΄ 32-Π±ΠΈΡ‚Π½ΠΈΠΎΡ‚ адрСсСн простор. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ Π΅ ΡˆΡ‚ΠΎ ΠΎΠ΄ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° Binaryen ΠΎΠ²Π° Π΅ пристап Π΄ΠΎ ΠΏΡ€Π΅ΠΌΠ½ΠΎΠ³Ρƒ Π³ΠΎΠ»Π΅ΠΌΠ° рСзултатска адрСса. Како Π΄Π° сС Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΠΈ ΠΎΠ²Π°?

На административСн Π½Π°Ρ‡ΠΈΠ½

НС Π³ΠΎ тСстирав ΠΎΠ²Π°, Π½ΠΎ ΠΌΠΎΡ˜Π°Ρ‚Π° ΠΏΡ€Π²Π° мисла бСшС β€žΠ¨Ρ‚ΠΎ Π°ΠΊΠΎ инсталирам 32-Π±ΠΈΡ‚Π΅Π½ Linux? Вогаш Π³ΠΎΡ€Π½ΠΈΠΎΡ‚ Π΄Π΅Π» ΠΎΠ΄ адрСсниот простор ќС Π±ΠΈΠ΄Π΅ ΠΎΠΊΡƒΠΏΠΈΡ€Π°Π½ ΠΎΠ΄ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚. ΠŸΡ€Π°ΡˆΠ°ΡšΠ΅Ρ‚ΠΎ Π΅ само ΠΊΠΎΠ»ΠΊΡƒ ќС Π±ΠΈΠ΄Π΅ Π·Π°Ρ„Π°Ρ‚Π΅Π½ΠΎ: 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));
}

... Ρ‚ΠΎΡ‡Π½ΠΎ Π΅ Π΄Π΅ΠΊΠ° Π½Π΅ Π΅ ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π΅Π½ со Valgrind, Π½ΠΎ, Π·Π° ΡΡ€Π΅ΡœΠ°, самиот Valgrind ΠΌΠ½ΠΎΠ³Ρƒ Сфикасно Π³ΠΈ Ρ‚ΡƒΡ€ΠΊΠ° ситС ΠΎΠ΄ Ρ‚Π°ΠΌΡƒ :)

МоТСби нСкој ќС Π΄Π°Π΄Π΅ ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ ΠΎΠ±Ρ˜Π°ΡΠ½ΡƒΠ²Π°ΡšΠ΅ Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π° овој мој ΠΊΠΎΠ΄...

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€