ΠΠ΄Π½Π°Ρ ΠΎΠ΄Π°ΠΌΠ½Π° ΡΠ΅ΡΠΈΠ² Π·Π° Π·Π°Π±Π°Π²Π° Π΄ΠΎΠΊΠ°ΠΆΠ΅ ΡΠ΅Π²Π΅ΡΠ·ΠΈΠ±ΠΈΠ»Π½ΠΎΡΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΠΈ Π½Π°ΡΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ JavaScript (ΠΏΠΎΡΠΎΡΠ½ΠΎ, Asm.js) ΠΎΠ΄ ΠΌΠ°ΡΠΈΠ½ΡΠΊΠΈΠΎΡ ΠΊΠΎΠ΄. ΠΠ° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΡ Π±Π΅ΡΠ΅ ΠΈΠ·Π±ΡΠ°Π½ QEMU, Π° ΠΈΠ·Π²Π΅ΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΏΠΎΠ΄ΠΎΡΠ½Π° Π±Π΅ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° ΡΡΠ°ΡΠΈΡΠ° Π½Π° Π₯Π°Π±Ρ. ΠΠΎ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ ΠΌΠ΅ ΡΠΎΠ²Π΅ΡΡΠ²Π°Π° Π΄Π° Π³ΠΎ ΠΏΡΠ΅ΠΏΡΠ°Π²Π°ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ Π²ΠΎ WebAssembly, ΠΏΠ° Π΄ΡΡΠΈ ΠΈ ΡΠ°ΠΌΠΈΠΎΡ Π΄Π° ΡΠ΅ ΠΎΡΠΊΠ°ΠΆΠ°ΠΌ ΡΠ΅ΡΠΈΡΠΈ Π·Π°Π²ΡΡΠ΅Π½Π° ΠΠ΅ΠΊΠ°ΠΊΠΎ Π½Π΅ Π³ΠΎ ΡΠ°ΠΊΠ°Π² ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ... Π Π°Π±ΠΎΡΠ°ΡΠ° ΡΠ΅ ΠΎΠ΄Π²ΠΈΠ²Π°ΡΠ΅, Π½ΠΎ ΠΌΠ½ΠΎΠ³Ρ Π±Π°Π²Π½ΠΎ, Π° ΡΠ΅Π³Π°, Π½Π΅ΠΎΠ΄Π°ΠΌΠ½Π° Π²ΠΎ ΡΠ°Π° ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈ
Π·Π°Π΄Π°ΡΠΈ
ΠΠΈΠ΄Π΅ΡΡΠΈ Π²Π΅ΡΠ΅ Π½Π°ΡΡΠΈΠ² ΠΊΠ°ΠΊΠΎ βΠ½Π΅ΠΊΠ°ΠΊΠΎβ Π΄Π° Π³ΠΎ ΠΏΡΠ΅ΡΡΠ»Π°ΠΌ QEMU Π½Π° JavaScript, ΠΎΠ²ΠΎΡ ΠΏΠ°Ρ Π±Π΅ΡΠ΅ ΠΎΠ΄Π»ΡΡΠ΅Π½ΠΎ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Π°ΠΌ ΡΠΎΠ° ΠΌΡΠ΄ΡΠΎ ΠΈ Π΄Π° Π½Π΅ Π³ΠΈ ΠΏΠΎΠ²ΡΠΎΡΡΠ²Π°ΠΌ ΡΡΠ°ΡΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ.
ΠΡΠ΅ΡΠΊΠ° Π±ΡΠΎΡ Π΅Π΄Π΅Π½: ΡΠ°Π·Π³ΡΠ°Π½Π΅ΡΠ΅ ΡΠ΅ ΠΎΠ΄ ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΎΡΠΊΠ°ΡΠ°
ΠΠΎΡΠ°ΡΠ° ΠΏΡΠ²Π° Π³ΡΠ΅ΡΠΊΠ° Π±Π΅ΡΠ΅ ΡΡΠΎ ΡΠ° ΠΎΡΠΊΠΈΠ½Π°Π² ΠΌΠΎΡΠ°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° ΠΎΠ΄ upstream Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° 2.4.1. Π’ΠΎΠ³Π°Ρ ΠΌΠΈ ΡΠ΅ ΡΠΈΠ½Π΅ΡΠ΅ Π΄ΠΎΠ±ΡΠ° ΠΈΠ΄Π΅ΡΠ°: Π°ΠΊΠΎ ΠΏΠΎΡΡΠΎΠΈ ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΎΡΠΊΠ°, ΡΠΎΠ³Π°Ρ Π²Π΅ΡΠΎΡΠ°ΡΠ½ΠΎ Π΅ ΠΏΠΎΡΡΠ°Π±ΠΈΠ»Π½ΠΎ ΠΎΠ΄ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈΠΎΡ 2.4, Π° ΡΡΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π³ΡΠ°Π½ΠΊΠ°ΡΠ° master
. Π Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΏΠ»Π°Π½ΠΈΡΠ°Π² Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π°ΠΌ ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ Π³ΠΎΠ»Π΅ΠΌΠ° ΠΊΠΎΠ»ΠΈΡΠΈΠ½Π° Π½Π° ΠΌΠΎΠΈ Π³ΡΠ΅ΡΠΊΠΈ, Π²ΠΎΠΎΠΏΡΡΠΎ Π½Π΅ ΠΌΠΈ ΡΡΠ΅Π±Π°Π° Π½ΠΈΡΠΈΠΈ Π΄ΡΡΠ³ΠΈ. ΠΠ΅ΡΠΎΡΠ°ΡΠ½ΠΎ ΡΠ°ΠΊΠ° ΠΈΡΠΏΠ°Π΄Π½Π°. ΠΠΎ, ΡΡΠΊΠ° Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΠ°: QEMU Π½Π΅ ΡΡΠΎΠΈ, Π° Π²ΠΎ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ Π΄ΡΡΠΈ Π½Π°ΡΠ°Π²ΠΈΡΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π·Π° 10 ΠΏΡΠΎΡΠ΅Π½ΡΠΈ. βΠΠ°, ΡΠ΅Π³Π° ΡΠ΅ Π·Π°ΠΌΡΠ·Π½Π°ΠΌβ, ΡΠΈ ΠΏΠΎΠΌΠΈΡΠ»ΠΈΠ² ΠΈ ΡΠ΅ ΡΠ°ΡΠΈΠΏΠ°Π². ΠΠ²Π΄Π΅ ΡΡΠ΅Π±Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ Π΄ΠΈΠ³ΡΠ΅ΡΠΈΡΠ°: ΠΏΠΎΡΠ°Π΄ΠΈ ΠΏΡΠΈΡΠΎΠ΄Π°ΡΠ° Π½Π° QEMU.js ΡΠΎ Π΅Π΄Π½Π° Π½ΠΈΡΠΊΠ° ΠΈ ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΠΎΡ QEMU Π½Π΅ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ° ΠΎΡΡΡΡΡΠ²ΠΎ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅Π½ΠΈΡΠΊΠΈ (ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ, ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π·Π° ΠΈΡΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½ΠΎ ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π½Π΅ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΠΏΠ°ΡΠ΅ΠΊΠΈ Π½Π° ΠΊΠΎΠ΄ΠΎΡ, ΠΈ Π½Π΅ ΡΠ°ΠΌΠΎ βΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π³ΠΈ ΡΠΈΡΠ΅ ΠΊΠ΅ΡΠ½Π΅Π»ΠΈβ) Π΅ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ Π·Π° ΡΠΎΠ°, Π³Π»Π°Π²Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Π½ΠΈΡΠΊΠΈΡΠ΅ ΠΌΠΎΡΠ°Π² Π΄Π° Π³ΠΈ βΠΈΡΠΊΠ»ΡΡΠ°ΠΌβ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ°ΠΌ Π΄Π° ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°ΠΌ ΠΎΠ΄Π½Π°Π΄Π²ΠΎΡ. ΠΠ²Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ Π½Π΅ΠΊΠΎΠΈ ΠΏΡΠΈΡΠΎΠ΄Π½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠΏΠΎΡΡΠ²Π°ΡΠ΅ΡΠΎ. Π‘Π΅ΠΏΠ°ΠΊ, ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° Π½Π΅ΠΊΠΎΠΈ ΠΎΠ΄ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΎΠ΄ Π³ΡΠ°Π½ΠΊΠ° master
, ΡΠΎ ΠΊΠΎΡ ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΠΎΠ² Π΄Π° Π³ΠΎ ΡΠΏΠΎΡΠ°ΠΌ ΠΌΠΎΡΠΎΡ ΠΊΠΎΠ΄, ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π±Π΅Π° ΠΈΠ·Π±ΡΠ°Π½ΠΈ ΡΡΠ΅ΡΠΈ Π²ΠΎ ΠΏΠΎΡΠ°ΠΊΠ°ΡΠ° Π·Π° ΡΠΎΡΠΊΠΈ (Π° ΡΠΎ ΡΠΎΠ° ΠΈ Π²ΠΎ ΠΌΠΎΡΠ°ΡΠ° Π³ΡΠ°Π½ΠΊΠ°), ΠΈΡΡΠΎ ΡΠ°ΠΊΠ°, Π²Π΅ΡΠΎΡΠ°ΡΠ½ΠΎ Π½Π΅ΠΌΠ°ΡΠ΅ Π΄Π° ΠΈΠΌΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎΡΡ.
ΠΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ, ΡΠ΅ΡΠΈΠ² Π΄Π΅ΠΊΠ° ΡΓ¨ ΡΡΡΠ΅ ΠΈΠΌΠ° ΡΠΌΠΈΡΠ»Π° Π΄Π° Π³ΠΎ ΠΈΡΡΡΠ»Π°ΠΌ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠΎΡ, Π΄Π° Π³ΠΎ ΡΠ°ΡΠΊΠ»ΠΎΠΏΠ°ΠΌ Π·Π° Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΈ Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄Π°ΠΌ Π½ΠΎΠ²Π° Π²Π΅ΡΠ·ΠΈΡΠ° ΠΎΠ΄ Π½ΡΠ»Π° Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° Π½Π΅ΡΡΠΎ ΠΏΠΎΡΠ²Π΅ΠΆΠΎ ΠΈ ΡΠ΅Π³Π° ΠΎΠ΄ master
.
ΠΡΠ΅ΡΠΊΠ° Π±ΡΠΎΡ Π΄Π²Π°: ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡΠ° Π½Π° TLP
ΠΠΎ ΡΡΡΡΠΈΠ½Π°, ΠΎΠ²Π° Π½Π΅ Π΅ Π³ΡΠ΅ΡΠΊΠ°, Π²ΠΎΠΎΠΏΡΡΠΎ, ΡΠΎΠ° Π΅ ΡΠ°ΠΌΠΎ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ Π²ΠΎ ΡΡΠ»ΠΎΠ²ΠΈ Π½Π° ΡΠ΅Π»ΠΎΡΠ½ΠΎ Π½Π΅Π΄ΠΎΡΠ°Π·Π±ΠΈΡΠ°ΡΠ΅ ΠΈ Π·Π° βΠΊΠ°Π΄Π΅ ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ Π΄Π²ΠΈΠΆΠΈΠΌΠ΅?β ΠΈ Π²ΠΎΠΎΠΏΡΡΠΎ βΠ΄Π°Π»ΠΈ ΡΠ΅ ΡΡΠΈΠ³Π½Π΅ΠΌΠ΅ ΡΠ°ΠΌΡ? ΠΠΎ ΠΎΠ²ΠΈΠ΅ ΡΡΠ»ΠΎΠ²ΠΈ Π½Π΅ΡΠΌΠ°ΡΠ½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°ΡΠ΅ Π±Π΅ΡΠ΅ ΠΎΠΏΡΠ°Π²Π΄Π°Π½Π° ΠΎΠΏΡΠΈΡΠ°, Π½ΠΎ, Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ, Π½Π΅ ΡΠ°ΠΊΠ°Π² Π΄Π° ΡΠ° ΠΏΠΎΠ²ΡΠΎΡΡΠ²Π°ΠΌ Π½Π΅ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ. ΠΠ²ΠΎΡ ΠΏΠ°Ρ ΡΠ°ΠΊΠ°Π² Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Π°ΠΌ ΡΠΎΠ° ΠΌΡΠ΄ΡΠΎ: Π°ΡΠΎΠΌΡΠΊΠΈ ΠΎΠ±Π²ΡΠ·ΡΠ²Π°ΡΠ°, ΡΠ²Π΅ΡΠ½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π½Π° ΠΊΠΎΠ΄ΠΎΡ (ΠΈ Π½Π΅ βΡΠΏΠΎΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ»ΡΡΠ°ΡΠ½ΠΈ Π·Π½Π°ΡΠΈ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ ΡΠ΅ ΡΠΎΡΡΠ°Π²ΠΈ (ΡΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅Π΄ΡΠ²Π°ΡΠ°)β, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅Π΄Π½Π°Ρ ΡΠ΅ΠΊΠΎΠ» ΠΠΈΠ½ΡΡ Π’ΠΎΡΠ²Π°Π»Π΄Ρ Π·Π° Π½Π΅ΠΊΠΎΠ³ΠΎ, ΡΠΏΠΎΡΠ΅Π΄ ΠΠΈΠΊΠΈΡΠΈΡΠ°ΡΠΎΡ) ΠΈΡΠ½.
ΠΡΠ΅ΡΠΊΠ° Π±ΡΠΎΡ ΡΡΠΈ: Π²Π»Π΅Π³ΡΠ²Π°ΡΠ΅ Π²ΠΎ Π²ΠΎΠ΄Π° Π±Π΅Π· Π΄Π° ΡΠ΅ Π·Π½Π°Π΅ ΡΠΎΡΠ΄ΠΎΡ
Π‘Γ¨ ΡΡΡΠ΅ Π½Π΅ ΡΠ΅ ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΠΈΠ² ΡΠ΅Π»ΠΎΡΠ½ΠΎ ΠΎΠ΄ ΠΎΠ²Π°, Π½ΠΎ ΡΠ΅Π³Π° ΡΠ΅ΡΠΈΠ² Π²ΠΎΠΎΠΏΡΡΠΎ Π΄Π° Π½Π΅ Π³ΠΎ ΡΠ»Π΅Π΄Π°ΠΌ ΠΏΠ°ΡΠΎΡ Π½Π° Π½Π°ΡΠΌΠ°Π» ΠΎΡΠΏΠΎΡ ΠΈ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Π°ΠΌ ΡΠΎΠ° βΠΊΠ°ΠΊΠΎ Π²ΠΎΠ·ΡΠ°ΡΠ΅Π½β, ΠΈΠΌΠ΅Π½ΠΎ, Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π³ΠΎ ΠΌΠΎΡΠΎΡ TCG Π·Π°Π΄Π½ΠΈΠ½Π° ΠΎΠ΄ Π½ΡΠ»Π°, Π·Π° Π΄Π° Π½Π΅ Π΄Π° ΠΌΠΎΡΠ° Π΄Π° ΠΊΠ°ΠΆΠ°ΠΌ ΠΏΠΎΠ΄ΠΎΡΠ½Π°, βΠΠ°, ΠΎΠ²Π° Π΅ ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°, ΠΏΠΎΠ»Π΅ΠΊΠ°, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ°ΠΌ Π΄Π° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°ΠΌ ΡΓ¨ - ΡΠ°ΠΊΠ° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ TCI...β ΠΠΎΠΊΡΠ°Ρ ΡΠΎΠ°, ΠΎΠ²Π° ΠΏΡΠ²ΠΈΡΠ½ΠΎ ΠΈΠ·Π³Π»Π΅Π΄Π°ΡΠ΅ ΠΊΠ°ΠΊΠΎ ΠΎΡΠΈΠ³Π»Π΅Π΄Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΠ°Ρ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌ Π±ΠΈΠ½Π°ΡΠ΅Π½ ΠΊΠΎΠ΄. ΠΠ°ΠΊΠΎ ΡΡΠΎ Π²Π΅Π»Π°Ρ, βΠΠ΅Π½Ρ ΡΠ΅ ΡΠΎΠ±ΡΠ°Ρ, Π½ΠΎ Π½Π΅ ΡΠΎΡβ: ΠΊΠΎΠ΄ΠΎΡ Π΅, ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°, Π±ΠΈΠ½Π°ΡΠ΅Π½, Π½ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Π°ΡΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΠ΅ Π½Π° Π½Π΅Π³ΠΎ - ΠΌΠΎΡΠ° Π΅ΠΊΡΠΏΠ»ΠΈΡΠΈΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΡΡΠΊΠ° Π²ΠΎ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΠ°, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΠΈΡΠ° ΡΠΎ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΠ΄ ΡΠ²Π΅ΡΠΎΡ Π½Π° JS, ΠΊΠΎΡ ΡΓ¨ ΡΡΡΠ΅ ΡΡΠ΅Π±Π° Π΄Π° Π±ΠΈΠ΄ΠΈ ΡΠΏΠ°ΡΠ΅Π½ Π½Π΅ΠΊΠ°Π΄Π΅. Π‘Π΅ΠΏΠ°ΠΊ, ΠΊΠ°Ρ Π½ΠΎΡΠΌΠ°Π»Π½ΠΈΡΠ΅ RISC Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ, ΠΊΠΎΠ»ΠΊΡ ΡΡΠΎ ΡΠ°Π·Π±ΠΈΡΠ°ΠΌ, ΡΠΈΠΏΠΈΡΠ½Π° ΡΠΈΡΡΠ°ΡΠΈΡΠ° Π΅ ΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π΅ΠΊΡΠΏΠ»ΠΈΡΠΈΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠ΅ΡΠ΅ΡΠΈΡΠ° ΠΊΠ΅ΡΠΎΡ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° ΡΠ΅Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΠΊΠΎΠ΄ - Π°ΠΊΠΎ ΡΠΎΠ° Π½Π΅ Π΅ ΠΎΠ½Π° ΡΡΠΎ Π½ΠΈ ΡΡΠ΅Π±Π°, ΡΠΎΠ³Π°Ρ, Π²ΠΎ ΡΠ΅ΠΊΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΡΠΎΠ° Π΅ Π±Π»ΠΈΡΠΊΡ. ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ, ΠΎΠ΄ ΠΌΠΎΡΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄Π΅Π½ ΠΎΠ±ΠΈΠ΄, Π΄ΠΎΠ·Π½Π°Π² Π΄Π΅ΠΊΠ° ΠΊΠΎΠ½ΡΡΠΎΠ»Π°ΡΠ° Π½Π΅ ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π° Π½Π° ΡΡΠ΅Π΄ΠΈΠ½Π°ΡΠ° Π½Π° Π±Π»ΠΎΠΊΠΎΡ Π·Π° ΠΏΡΠ΅Π²ΠΎΠ΄, ΡΠ°ΠΊΠ° ΡΡΠΎ Π½Π°Π²ΠΈΡΡΠΈΠ½Π° Π½Π΅ Π½ΠΈ ΡΡΠ΅Π±Π° Π±Π°ΡΡΠ΅ΠΊΠΎΠ΄ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠ°Π½ ΠΎΠ΄ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΎ ΠΏΠΎΠΌΠ΅ΡΡΡΠ²Π°ΡΠ΅ ΠΈ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ ΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π½Π° TB .
ΠΠΎΡΠ΄ΠΎΠ° ΠΈ ΠΊΠ»ΠΎΡΠ°Π°
ΠΠ°ΠΊΠΎ ΠΏΠΎΡΠ½Π°Π² Π΄Π° Π³ΠΎ ΠΏΡΠ΅ΠΏΠΈΡΡΠ²Π°ΠΌ ΠΊΠΎΠ΄ΠΎΡ ΡΡΡΠ΅ Π²ΠΎ ΡΡΠ»ΠΈ, Π½Π΅Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π½ΠΎ ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈ Π²ΠΎΠ»ΡΠ΅Π±Π΅Π½ ΡΠ΄Π°Ρ: ΠΎΠ±ΠΈΡΠ½ΠΎ ΠΏΠΈΡΠΌΠ°ΡΠ° ΠΎΠ΄ GitHub ΠΏΡΠΈΡΡΠΈΠ³Π½ΡΠ²Π°Π°Ρ ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ° Π·Π° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅ Π½Π° ΠΏΡΠ°ΡΠ°ΡΠ°ΡΠ° ΠΈ Π±Π°ΡΠ°ΡΠ°ΡΠ° Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡΠ²Π°ΡΠ΅, Π½ΠΎ ΠΎΠ²Π΄Π΅, ΠΎΠ΄Π΅Π΄Π½Π°Ρ ΡΠΏΠΎΠΌΠ½ΠΈ Π²ΠΎ ΡΠ΅ΠΌΠ°ΡΠ°
ΠΠΎΡΠΎΠ° ΠΈΠΌΠ°ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅
- Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ Π½Π° Π½Π΅ΡΡΠΎ Π΅Π΄ΡΠΊΠ°ΡΠΈΠ²Π½ΠΎ Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ°
- Π²ΠΈΡΡΡΠ΅Π»ΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° iOS, ΠΊΠ°Π΄Π΅ ΡΡΠΎ, ΡΠΏΠΎΡΠ΅Π΄ Π³Π»Π°ΡΠΈΠ½ΠΈΡΠ΅, Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π°ΡΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΡΡΠΎ ΠΈΠΌΠ° ΠΏΡΠ°Π²ΠΎ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΊΠΎΠ΄ Π²ΠΎ Π»Π΅Ρ Π΅ JS ΠΌΠΎΡΠΎΡ (Π΄Π°Π»ΠΈ Π΅ ΠΎΠ²Π° Π²ΠΈΡΡΠΈΠ½Π°?)
- Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡΠ° Π½Π° ΠΌΠΈΠ½ΠΈ-ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π΅Π½ ΡΠΈΡΡΠ΅ΠΌ - Π΅Π΄ΠΈΠ½Π΅ΡΠ½Π° ΡΠ»ΠΎΠΏΠΈ, Π²Π³ΡΠ°Π΄Π΅Π½Π°, ΡΠ΅ΠΊΠ°ΠΊΠΎΠ² Π²ΠΈΠ΄ ΡΠΈΡΠΌΠ²Π΅Ρ, ΠΈΡΠ½...
ΠΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π½Π° ΡΡΠ°Π΅ΡΠ΅ Π½Π° ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ
ΠΠ°ΠΊΠΎ ΡΡΠΎ Π²Π΅ΡΠ΅ ΡΠ΅ΠΊΠΎΠ², QEMU Π΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ ΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅Π½ΠΈΡΠΊΠΈ, Π½ΠΎ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ Π³ΠΎ Π½Π΅ΠΌΠ°. ΠΠ°, ΡΠΎΠ° Π΅, Π½Π΅... ΠΡΠΏΡΠ²ΠΈΠ½ Π²ΠΎΠΎΠΏΡΡΠΎ Π½Π΅ ΠΏΠΎΡΡΠΎΠ΅ΡΠ΅, Π° ΠΏΠΎΡΠΎΠ° ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈΡΠ° WebWorkers - ΠΊΠΎΠ»ΠΊΡ ΡΡΠΎ ΡΠ°Π·Π±ΡΠ°Π², ΠΎΠ²Π° Π΅ ΠΌΡΠ»ΡΠΈ-Π½ΠΈΡΠΊΠΈ Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°ΡΠ΅ ΠΏΠΎΡΠ°ΠΊΠΈ Π±Π΅Π· ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. Π‘Π΅ΠΊΠ°ΠΊΠΎ, ΠΎΠ²Π° ΡΠΎΠ·Π΄Π°Π²Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΡΠΈ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈΠΎΡ ΠΊΠΎΠ΄ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΎΡ Π·Π° Π·Π°Π΅Π΄Π½ΠΈΡΠΊΠ° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°. ΠΠΎΡΠΎΠ° ΠΏΠΎΠ΄ ΠΏΡΠΈΡΠΈΡΠΎΠΊ Π½Π° ΡΠ°Π²Π½ΠΎΡΡΠ° ΡΠ΅ ΡΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π°ΡΠ΅ ΠΈ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅ΡΠΎ SharedArrayBuffers
. ΠΠΎΡΡΠ΅ΠΏΠ΅Π½ΠΎ ΡΠ΅ Π²ΠΎΠ²Π΅Π΄ΡΠ²Π°ΡΠ΅, Π³ΠΎ ΠΏΡΠΎΡΠ»Π°Π²ΠΈΡΠ° Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ Π²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΈ, ΠΏΠΎΡΠΎΠ° ΡΠ° ΠΏΡΠΎΡΠ»Π°Π²ΠΈΡΠ° ΠΠΎΠ²Π°ΡΠ° Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΏΠ° Meltdown... ΠΠΎ ΡΡΠΎ Π΄ΠΎΡΠ΄ΠΎΠ° Π΄ΠΎ Π·Π°ΠΊΠ»ΡΡΠΎΠΊ Π΄Π΅ΠΊΠ° Π³ΡΡΠ±ΠΎ ΠΈΠ»ΠΈ Π³ΡΡΠ±ΠΎ Π΅ ΠΌΠ΅ΡΠ΅ΡΠ΅ΡΠΎ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, Π½ΠΎ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° Π·Π°Π΅Π΄Π½ΠΈΡΠΊΠ° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ° ΠΈ ΠΊΠΎΠ½Π΅Ρ Π³ΠΎ Π·Π³ΠΎΠ»Π΅ΠΌΡΠ²Π° Π±ΡΠΎΡΠ°ΡΠΎΡ, ΡΠ΅ Π΅ ΠΈΡΡΠΎ
ΠΡΠΎΡΠ°ΡΠ° ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π΅ Π½Π΅ΠΌΠΎΠΆΠ½ΠΎΡΡΠ° Π·Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΈΠΈ Π½Π° Π½ΠΈΡΠΊΠΎ Π½ΠΈΠ²ΠΎ ΡΠΎ ΡΡΠ΅ΠΊΠΎΡ: Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π΄Π° Π³ΠΎ Π·Π΅ΠΌΠ΅ΡΠ΅, Π΄Π° Π³ΠΎ Π·Π°ΡΡΠ²Π°ΡΠ΅ ΡΠ΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΡΠ»ΠΈΡΠ΅ Π½Π° Π½ΠΎΠ² ΡΠΎ Π½ΠΎΠ² ΡΡΠ΅ΠΊ. Π‘ΠΎ ΡΡΠ΅ΠΊΠΎΡ Π½Π° ΠΏΠΎΠ²ΠΈΡΠΈ ΡΠΏΡΠ°Π²ΡΠ²Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° JS. Π‘Π΅ ΡΠΈΠ½ΠΈ, ΡΡΠΎ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΡ, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠ΅ΠΏΠ°ΠΊ ΡΠ΅ΡΠΈΠ²ΠΌΠ΅ Π΄Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΠΌΠ΅ ΡΠΎ ΠΏΡΠ²ΠΈΡΠ΅ ΡΠ΅ΠΊΠΎΠ²ΠΈ ΡΠ΅Π»ΠΎΡΠ½ΠΎ ΡΠ°ΡΠ½ΠΎ? Π€Π°ΠΊΡ Π΅ Π΄Π΅ΠΊΠ° Π±Π»ΠΎΠΊ I/O Π²ΠΎ QEMU ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° ΠΏΡΠ΅ΠΊΡ ΠΊΠΎΡΡΡΠΈΠ½ΠΈ, ΠΈ ΡΡΠΊΠ° Π΄ΠΎΠ±ΡΠΎ Π±ΠΈ Π΄ΠΎΡΠ»Π΅ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΈΠΈΡΠ΅ ΡΠΎ ΡΡΠ΅ΠΊ Π½Π° Π½ΠΈΡΠΊΠΎ Π½ΠΈΠ²ΠΎ. ΠΠ° ΡΡΠ΅ΡΠ°, Emscipten Π²Π΅ΡΠ΅ ΡΠΎΠ΄ΡΠΆΠΈ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π΄ΡΡΠΈ ΠΈ Π΄Π²Π΅:
ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ², ΡΓ¨ ΡΡΡΠ΅ Π½Π΅ ΡΡΠΌ ΡΡΠΏΠ΅Π°Π» Π΄Π° Π³ΠΎ ΠΏΠΎΠ΄Π΅Π»Π°ΠΌ ΠΊΠΎΠ΄ΠΎΡ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½ Π²ΠΎ 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 ΠΊΠΎΠ΄. ΠΠ°ΠΏΡΠΎΡΠΈΠ², ΡΠΎΡ Π΅ ΡΠΈΡΡΠΎ Π±ΠΈΠ½Π°ΡΠ΅Π½ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½, ΠΏΠ° Π΄ΡΡΠΈ ΠΈ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎΡΠΎ ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΡΠ΅Π» Π±ΡΠΎΡ Π²ΠΎ Π½Π΅Π³ΠΎ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³Ρ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ: Π·Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΡΡ, ΡΠΎΡ ΡΠ΅ ΡΡΠ²Π° Π²ΠΎ ΡΠΎΡΠΌΠ°Ρ
ΠΠΎΠΆΠ΅Π±ΠΈ ΡΡΠ΅ ΡΠ»ΡΡΠ½Π°Π»Π΅ Π·Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΡ Π·Π° ΠΏΡΠ΅Π²ΡΡΡΠ²Π°ΡΠ΅ Π·Π° Asm.js - ΠΎΠ²Π° Π΅ Π²ΡΠ°ΡΠ°ΡΠ΅ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π° Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΡ Π½Π° βΠ²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎβ (ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ, Π°ΠΊΠΎ-ΡΠΎΠ³Π°Ρ-ΠΈΠ½Π°ΠΊΡ, ΡΠ°ΠΌΠΊΠΈ, ΠΈΡΠ½.), Π·Π° ΠΊΠΎΠΈ ΡΠ΅ Π΄ΠΈΠ·Π°ΡΠ½ΠΈΡΠ°Π½ΠΈ ΠΌΠΎΡΠΎΡΠΈΡΠ΅ JS, ΠΎΠ΄ LLVM IR Π½Π° Π½ΠΈΡΠΊΠΎ Π½ΠΈΠ²ΠΎ, ΠΏΠΎΠ±Π»ΠΈΡΠΊΡ Π΄ΠΎ ΠΌΠ°ΡΠΈΠ½ΡΠΊΠΈΠΎΡ ΠΊΠΎΠ΄ ΡΡΠΎ Π³ΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΎΡ. ΠΠΎΡΠΌΠ°Π»Π½ΠΎ, ΡΡΠ΅Π΄Π½Π°ΡΠ° Π·Π°ΡΡΠ°ΠΏΠ΅Π½ΠΎΡΡ Π½Π° QEMU Π΅ ΠΏΠΎΠ±Π»ΠΈΡΠΊΡ Π΄ΠΎ Π²ΡΠΎΡΠ°ΡΠ°. Π‘Π΅ ΡΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° ΡΡΠΊΠ° Π΅, Π±Π°ΡΡ-ΠΊΠΎΠ΄, ΠΊΡΠ°ΡΠΎΡ Π½Π° ΠΌΠ°ΠΊΠΈΡΠ΅... Π ΠΏΠΎΡΠΎΠ° ΠΈΠΌΠ° Π±Π»ΠΎΠΊΠΎΠ²ΠΈ, Π°ΠΊΠΎ-ΡΠΎΠ³Π°Ρ-Π΄ΡΡΠ³ΠΎ ΠΈ ΡΠ°ΠΌΠΊΠΈ!..
Π ΠΎΠ²Π° Π΅ ΡΡΡΠ΅ Π΅Π΄Π½Π° ΠΏΡΠΈΡΠΈΠ½Π° Π·ΠΎΡΡΠΎ Binaryen Π΅ ΠΊΠΎΡΠΈΡΠ΅Π½: ΡΠΎΡ ΠΏΡΠΈΡΠΎΠ΄Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΈΡΠ°ΡΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π½Π° Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ Π±Π»ΠΈΡΠΊΡ Π΄ΠΎ ΠΎΠ½Π° ΡΡΠΎ Π±ΠΈ ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π»ΠΎ Π²ΠΎ WASM. ΠΠΎ, ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅ ΠΊΠΎΠ΄ ΠΎΠ΄ Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ ΠΈ ΡΡΠ°Π½Π·ΠΈΡΠΈΠΈ ΠΌΠ΅ΡΡ Π½ΠΈΠ². ΠΠ°, Π²Π΅ΡΠ΅ ΡΠ΅ΠΊΠΎΠ² Π΄Π΅ΠΊΠ° Π³ΠΎ ΠΊΡΠΈΠ΅ ΡΠΎΡΠΌΠ°ΡΠΎΡ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ WebAssembly Π·Π°Π΄ ΠΏΡΠΈΠ³ΠΎΠ΄Π½ΠΈΠΎΡ C/C++ API.
TCG (ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° ΠΌΠ°Π»ΠΈ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ)
ΠΠ’Π¦ 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++ ΠΈ ΠΎΡΡΠ°ΠΌΡ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π΄Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΡΠ΅Π»ΠΈΠΎΡ 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
.
ΠΠ°ΡΠ΅ΠΌ,
Π’ΠΎΠ° Π΅ ΡΠ΅ Π·Π° ΡΠ΅Π³Π°. ΠΠΎΠΆΠ΅Π±ΠΈ ΡΠ΅ ΠΈΠΌΠ° Π΄ΡΡΠ³Π° ΡΡΠ°ΡΠΈΡΠ° Π°ΠΊΠΎ Π½Π΅ΠΊΠΎΡ Π³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΈΡΠ°. ΠΠΌΠ΅Π½ΠΎ, ΠΎΡΡΠ°Π½ΡΠ²Π° Π±Π°ΡΠ΅ΠΌ ΡΠ°ΠΌΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈ Π±Π»ΠΎΠΊ ΡΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ°Π±ΠΎΡΠ°Ρ. ΠΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΡΠΌΠΈΡΠ»Π° Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅ 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