ΠΠ΄Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ΅ΡΠΈΡ
Π·Π° Π·Π°Π±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΠ°Π·Π²Π°Ρ ΠΎΠ±ΡΠ°ΡΠΈΠΌΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° ΠΈ Π½Π°ΡΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ JavaScript (ΠΏΠΎ-ΡΠΎΡΠ½ΠΎ Asm.js) ΠΎΡ ΠΌΠ°ΡΠΈΠ½Π΅Π½ ΠΊΠΎΠ΄. ΠΠ° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ° Π±Π΅ΡΠ΅ ΠΈΠ·Π±ΡΠ°Π½ QEMU ΠΈ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ Π±Π΅ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° ΡΡΠ°ΡΠΈΡ Π½Π° Habr. Π ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ ΠΌΠ΅ ΠΏΠΎΡΡΠ²Π΅ΡΠ²Π°Ρ
Π° Π΄Π° ΠΏΡΠ΅ΠΏΡΠ°Π²Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² WebAssembly ΠΈ Π΄ΠΎΡΠΈ Π΄Π° ΡΠ΅ ΠΎΡΠΊΠ°ΠΆΠ° ΠΏΠΎΡΡΠΈ Π·Π°Π²ΡΡΡΠ΅Π½ ΠΡΠΊΠ°ΠΊ ΡΠΈ Π½Π΅ ΠΈΡΠΊΠ°Ρ
ΠΏΡΠΎΠ΅ΠΊΡΠ°... Π Π°Π±ΠΎΡΠ°ΡΠ° Π²ΡΡΠ²Π΅ΡΠ΅, Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π±Π°Π²Π½ΠΎ ΠΈ ΡΠ΅Π³Π°, Π½Π°ΡΠΊΠΎΡΠΎ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ
Π·Π°Π΄Π°ΡΠΈ
Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π²Π΅ΡΠ΅ Π±ΡΡ Π½Π°ΡΡΠΈΠ» ΠΊΠ°ΠΊ Π΄Π° βΠΏΠΎ Π½ΡΠΊΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½β ΠΏΡΠ΅Π½Π°ΡΡΠΌ QEMU ΠΊΡΠΌ JavaScript, ΡΠΎΠ·ΠΈ ΠΏΡΡ Π±Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΎ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Ρ ΡΠ°Π·ΡΠΌΠ½ΠΎ ΠΈ Π΄Π° Π½Π΅ ΠΏΠΎΠ²ΡΠ°ΡΡΠΌ ΡΡΠ°ΡΠΈ Π³ΡΠ΅ΡΠΊΠΈ.
ΠΡΠ΅ΡΠΊΠ° Π½ΠΎΠΌΠ΅Ρ Π΅Π΄Π½ΠΎ: ΡΠ°Π·ΠΊΠ»ΠΎΠ½ΡΠ²Π°Π½Π΅ ΠΎΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠΎΡΠΊΠ°
ΠΡΡΠ²Π°ΡΠ° ΠΌΠΈ Π³ΡΠ΅ΡΠΊΠ° Π±Π΅ΡΠ΅ Π΄Π° ΡΠ°Π·ΠΊΠ»ΠΎΠ½Ρ ΠΌΠΎΡΡΠ° Π²Π΅ΡΡΠΈΡ ΠΎΡ Π³ΠΎΡΠ½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ 2.4.1. Π’ΠΎΠ³Π°Π²Π° ΠΌΠΈ ΡΠ΅ ΡΡΠΎΡΠΈ Π΄ΠΎΠ±ΡΠ° ΠΈΠ΄Π΅Ρ: Π°ΠΊΠΎ ΡΠΎΡΠΊΠΎΠ²ΠΎΡΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°, ΡΠΎ Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π΅ ΠΏΠΎ-ΡΡΠ°Π±ΠΈΠ»Π½ΠΎ ΠΎΡ ΠΏΡΠΎΡΡΠΎΡΠΎ 2.4 ΠΈ ΠΎΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ ΠΊΠ»ΠΎΠ½Π° master
. Π ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΠ»Π°Π½ΠΈΡΠ°Ρ
Π΄Π° Π΄ΠΎΠ±Π°Π²Ρ Π΄ΠΎΡΡΠ° ΠΌΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ, ΠΈΠ·ΠΎΠ±ΡΠΎ Π½ΡΠΌΠ°Ρ
Π½ΡΠΆΠ΄Π° ΠΎΡ ΡΡΠΆΠ΄ΠΈ. Π‘ΠΈΠ³ΡΡΠ½ΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎ. ΠΠΎ Π΅ΡΠΎ Π½Π΅ΡΠΎ: QEMU Π½Π΅ ΡΡΠΎΠΈ Π½Π° Π΅Π΄Π½ΠΎ ΠΌΡΡΡΠΎ ΠΈ Π² Π½ΡΠΊΠ°ΠΊΡΠ² ΠΌΠΎΠΌΠ΅Π½Ρ Π΄ΠΎΡΠΈ ΠΎΠ±ΡΠ²ΠΈΡ
Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠ΄ Ρ 10 ΠΏΡΠΎΡΠ΅Π½ΡΠ°.βΠΠ°, ΡΠ΅Π³Π° ΡΠ΅ Π·Π°ΠΌΡΡΠ·Π½Π°β, ΠΏΠΎΠΌΠΈΡΠ»ΠΈΡ
ΡΠΈ ΠΈ ΡΠ΅ ΡΡΡΠΏΠΈΡ
. Π’ΡΠΊ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Π΅Π΄Π½ΠΎ ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅: ΠΏΠΎΡΠ°Π΄ΠΈ Π΅Π΄Π½ΠΎΠ½ΠΈΡΠΊΠΎΠ²ΠΈΡ Ρ
Π°ΡΠ°ΠΊΡΠ΅Ρ Π½Π° QEMU.js ΠΈ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡΡ QEMU Π½Π΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π° Π»ΠΈΠΏΡΠ°ΡΠ° Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡ (Ρ.Π΅. Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π΅ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ ΠΏΡΡΠ΅ΠΊΠΈ, ΠΈ Π½Π΅ ΡΠ°ΠΌΠΎ βΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ΄ΡΠ°β) Π΅ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ Π·Π° Π½Π΅Π³ΠΎ, ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Π½ΠΈΡΠΊΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° βΠΈΠ·ΠΊΠ»ΡΡΠ°β, Π·Π° Π΄Π° ΠΌΠΎΠ³Π° Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌ ΠΎΡΠ²ΡΠ½. Π’ΠΎΠ²Π° ΡΡΠ·Π΄Π°Π΄Π΅ Π½ΡΠΊΠΎΠΈ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ΡΠΎ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΡΠ°ΠΊΡΡΡ, ΡΠ΅ Π½ΡΠΊΠΎΠΈ ΠΎΡ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΎΡ Π±ΡΠ°Π½ΡΠ° master
, Ρ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΎΠΏΠΈΡΠ°Ρ
Π΄Π° ΠΎΠ±Π΅Π΄ΠΈΠ½Ρ ΠΊΠΎΠ΄Π° ΡΠΈ, ΡΡΡΠΎ Π±ΡΡ
Π° ΠΈΠ·Π±ΡΠ°Π½ΠΈ ΠΊΠ°ΡΠΎ ΡΠ΅ΡΠ΅ΡΠ° Π² ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΡΠΊΠ°ΡΠ° (ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π² ΠΌΠΎΡ ΠΊΠ»ΠΎΠ½) ΡΡΡΠΎ Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π½ΡΠΌΠ°ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΡ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ.
ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ ΡΠ΅ΡΠΈΡ
, ΡΠ΅ Π²ΡΠ΅ ΠΎΡΠ΅ ΠΈΠΌΠ° ΡΠΌΠΈΡΡΠ» Π΄Π° ΠΈΠ·Ρ
Π²ΡΡΠ»Ρ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ°, Π΄Π° Π³ΠΎ ΡΠ°Π·Π³Π»ΠΎΠ±Ρ Π½Π° ΡΠ°ΡΡΠΈ ΠΈ Π΄Π° ΡΡΠ·Π΄Π°ΠΌ Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ ΠΎΡ Π½ΡΠ»Π°ΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° Π½Π΅ΡΠΎ ΠΏΠΎ-ΡΠ²Π΅ΠΆΠΎ ΠΈ ΡΠ΅Π³Π° ΠΎΡ master
.
ΠΡΠ΅ΡΠΊΠ° Π½ΠΎΠΌΠ΅Ρ Π΄Π²Π΅: TLP ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ
ΠΠΎ ΡΡΡΠ΅ΡΡΠ²ΠΎ ΡΠΎΠ²Π° Π½Π΅ Π΅ Π³ΡΠ΅ΡΠΊΠ°, ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠΎ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡ Π² ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ° Π½Π° ΠΏΡΠ»Π½ΠΎ Π½Π΅ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΊΠ°ΠΊΡΠΎ Π½Π° βΠΊΡΠ΄Π΅ ΠΈ ΠΊΠ°ΠΊ Π΄Π° ΡΠ΅ Π΄Π²ΠΈΠΆΠΈΠΌ?β, Π ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ βΡΠ΅ ΡΡΠΈΠ³Π½Π΅ΠΌ Π»ΠΈ ΡΠ°ΠΌ?β Π ΡΠ΅Π·ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ ΡΡΠΎΠΌΠ°Π²ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Π±Π΅ΡΠ΅ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ Π²Π°ΡΠΈΠ°Π½Ρ, Π½ΠΎ, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, Π½Π΅ ΠΈΡΠΊΠ°Ρ Π΄Π° Π³ΠΎ ΠΏΠΎΠ²ΡΠ°ΡΡΠΌ ΠΈΠ·Π»ΠΈΡΠ½ΠΎ. Π’ΠΎΠ·ΠΈ ΠΏΡΡ ΠΈΡΠΊΠ°Ρ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Ρ ΠΌΡΠ΄ΡΠΎ: Π°ΡΠΎΠΌΠ½ΠΈ Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½ΡΠΈ, ΡΡΠ·Π½Π°ΡΠ΅Π»Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π° (Π° Π½Π΅ βΠ½ΠΈΠ·Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ Π·Π°Π΅Π΄Π½ΠΎ, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° (Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ)β, ΠΊΠ°ΠΊΡΠΎ ΠΠΈΠ½ΡΡ Π’ΠΎΡΠ²Π°Π»Π΄Ρ Π²Π΅Π΄Π½ΡΠΆ ΠΊΠ°Π·Π° Π·Π° Π½ΡΠΊΠΎΠ³ΠΎ, ΡΠΏΠΎΡΠ΅Π΄ Wikiquote) ΠΈ Ρ.Π½.
ΠΡΠ΅ΡΠΊΠ° Π½ΠΎΠΌΠ΅Ρ ΡΡΠΈ: Π΄Π° Π²Π»Π΅Π·Π΅Ρ Π²ΡΠ² Π²ΠΎΠ΄Π°ΡΠ°, Π±Π΅Π· Π΄Π° Π·Π½Π°Π΅Ρ Π±ΡΠΎΠ΄Π°
ΠΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΡΠΌ ΡΠ΅ ΠΎΡΡΡΠ²Π°Π» Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΎΡ ΡΠΎΠ²Π°, Π½ΠΎ ΡΠ΅Π³Π° ΡΠ΅ΡΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠΎ Π΄Π° Π½Π΅ ΡΠ»Π΅Π΄Π²Π°ΠΌ ΠΏΡΡΡ Π½Π° Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΎΡΠΎ ΡΡΠΏΡΠΎΡΠΈΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Ρ βΠΊΠ°ΡΠΎ Π²ΡΠ·ΡΠ°ΡΡΠ΅Π½β, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π° Π½Π°ΠΏΠΈΡΠ° ΡΠ²ΠΎΡ TCG Π±Π΅ΠΊΠ΅Π½Π΄ ΠΎΡ Π½ΡΠ»Π°ΡΠ°, Π·Π° Π΄Π° Π½Π΅ Π·Π° Π΄Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠ°ΠΆΠ° ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ: βΠΠ°, ΡΠΎΠ²Π° Π΅, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, Π±Π°Π²Π½ΠΎ, Π½ΠΎ Π½Π΅ ΠΌΠΎΠ³Π° Π΄Π° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°ΠΌ Π²ΡΠΈΡΠΊΠΎ - ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΠΈΡΠ΅ TCI...β ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°ΡΠ΅ ΠΊΠ°ΡΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΠ΅Π½Π΅ΡΠΈΡΠ°ΠΌ Π΄Π²ΠΎΠΈΡΠ΅Π½ ΠΊΠΎΠ΄. ΠΠ°ΠΊΡΠΎ ΡΠ΅ ΠΊΠ°Π·Π²Π°, βΠΠ΅Π½Ρ ΡΠ΅ ΡΡΠ±ΡΠ°Ρ, Π½ΠΎ Π½Π΅ ΠΈ ΡΠΎΠ·ΠΈβ: ΠΊΠΎΠ΄ΡΡ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, Π΅ Π΄Π²ΠΎΠΈΡΠ΅Π½, Π½ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»Π΅Π½ ΠΊΡΠΌ Π½Π΅Π³ΠΎ - ΡΠΎΠΉ ΡΡΡΠ±Π²Π° ΠΈΠ·ΡΠΈΡΠ½ΠΎ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½ Π² Π±ΡΠ°ΡΠ·ΡΡΠ° Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΎΠ±Π΅ΠΊΡ ΠΎΡ ΡΠ²Π΅ΡΠ° Π½Π° JS, ΠΊΠΎΠΉΡΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π΄Π° Π±ΡΠ΄Π°Ρ Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈ Π½ΡΠΊΡΠ΄Π΅. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΏΡΠΈ Π½ΠΎΡΠΌΠ°Π»Π½ΠΈ RISC Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ, Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΡΠ°Π·Π±ΠΈΡΠ°ΠΌ, ΡΠΈΠΏΠΈΡΠ½Π° ΡΠΈΡΡΠ°ΡΠΈΡ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ ΠΈΠ·ΡΠΈΡΠ½ΠΎ Π½ΡΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠ΅ΡΠ° Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Π·Π° ΡΠ΅Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΠΊΠΎΠ΄ - Π°ΠΊΠΎ ΡΠΎΠ²Π° Π½Π΅ Π΅ ΡΠΎΠ²Π°, ΠΎΡ ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ, ΡΠΎΠ³Π°Π²Π° Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΡΡΠ°ΠΉ Π΅ Π±Π»ΠΈΠ·ΠΎ. Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΠΌΠΈ ΠΎΠΏΠΈΡ Π½Π°ΡΡΠΈΡ , ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΡ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π½Π΅ ΡΠ΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»Ρ Π² ΡΡΠ΅Π΄Π°ΡΠ° Π½Π° Π±Π»ΠΎΠΊΠ° Π·Π° ΠΏΡΠ΅Π²ΠΎΠ΄, ΡΠ°ΠΊΠ° ΡΠ΅ Π²ΡΡΡΠ½ΠΎΡΡ Π½Π΅ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ Π±Π°ΠΉΡΠΊΠΎΠ΄, ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠ°Π½ ΠΎΡ Π²ΡΡΠΊΠΎ ΠΎΡΠΌΠ΅ΡΡΠ²Π°Π½Π΅, ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ Π΄Π° Π³ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ ΠΎΡ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π½Π° TB .
ΠΠΎΠΉΠ΄ΠΎΡ Π° ΠΈ ΡΠΈΡΠ°Ρ Π°
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π°Ρ
Π΄Π° ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ²Π°ΠΌ ΠΊΠΎΠ΄Π° ΠΎΡΠ΅ ΠΏΡΠ΅Π· ΡΠ»ΠΈ, Π½Π΅Π·Π°Π±Π΅Π»ΡΠ·Π°Π½ΠΎ ΡΠ΅ ΠΏΡΠΎΠΊΡΠ°Π΄Π½Π° ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄Π°Ρ: ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΏΠΈΡΠΌΠ°ΡΠ° ΠΎΡ GitHub ΠΏΡΠΈΡΡΠΈΠ³Π°Ρ ΠΊΠ°ΡΠΎ ΠΈΠ·Π²Π΅ΡΡΠΈΡ Π·Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΈ Π·Π°ΡΠ²ΠΊΠΈ Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅, Π½ΠΎ ΡΡΠΊ, Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΡΠΏΠΎΠΌΠ΅Π½Π°Π²Π°Π½Π΅ Π² ΡΠ΅ΠΌΠ°ΡΠ°
Π’ΠΎΠ³Π°Π²Π° ΠΈΠΌΠ°ΡΠ΅ ΠΎΡΠ΅
- ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π½Π΅ΡΠΎ ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ
- Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° iOS, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠΏΠΎΡΠ΅Π΄ ΡΠ»ΡΡ ΠΎΠ²Π΅ΡΠ΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΠΈΠΌΠ° ΠΏΡΠ°Π²ΠΎ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΊΠΎΠ΄ Π² Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅, Π΅ JS Π΄Π²ΠΈΠ³Π°ΡΠ΅Π» (Π²ΡΡΠ½ΠΎ Π»ΠΈ Π΅?)
- Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Π½Π° ΠΌΠΈΠ½ΠΈ-ΠΠ‘ - Π΅Π΄Π½ΠΎΡΠ»ΠΎΠΏΠΈ, Π²Π³ΡΠ°Π΄Π΅Π½Π°, Π²ΡΡΠΊΠ°ΠΊΡΠ² ΡΡΡΠΌΡΠ΅Ρ ΠΈ Π΄Ρ...
Π€ΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π±ΡΠ°ΡΠ·ΡΡΠ°
ΠΠ°ΠΊΡΠΎ Π²Π΅ΡΠ΅ ΠΊΠ°Π·Π°Ρ
, QEMU Π΅ ΠΎΠ±Π²ΡΡΠ·Π°Π½ Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡ, Π½ΠΎ Π±ΡΠ°ΡΠ·ΡΡΡΡ Π³ΠΎ Π½ΡΠΌΠ°. Π, ΡΠΎΠ²Π° Π΅, Π½Π΅... ΠΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠΎ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠ΅, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡ
Π° WebWorkers - Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΡΠ°Π·Π±ΠΈΡΠ°ΠΌ, ΡΠΎΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡ, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π±Π΅Π· ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. ΠΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, ΡΠΎΠ²Π° ΡΡΠ·Π΄Π°Π²Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΡΠΈ ΠΏΡΠ΅Π½Π°ΡΡΠ½Π΅ Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΠΊΠΎΠ΄, Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° Π½Π° ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΠ΅Ρ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π°, ΠΏΠΎΠ΄ ΠΎΠ±ΡΠ΅ΡΡΠ²Π΅Π½ Π½Π°ΡΠΈΡΠΊ, Π±Π΅ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΠΈ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅ΡΠΎ SharedArrayBuffers
. Π’ΠΎΠΉ Π±Π΅ΡΠ΅ Π²ΡΠ²Π΅Π΄Π΅Π½ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ, ΠΎΡΠΏΡΠ°Π·Π½ΡΠ²Π°Ρ
Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΌΡ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π±ΡΠ°ΡΠ·ΡΡΠΈ, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΡΠ°Π·Π½ΡΠ²Π°Ρ
Π° ΠΠΎΠ²Π° Π³ΠΎΠ΄ΠΈΠ½Π°, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Meltdown... Π‘Π»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΡΡΠΈΠ³Π½Π°Ρ
Π° Π΄ΠΎ ΠΈΠ·Π²ΠΎΠ΄Π°, ΡΠ΅ Π³ΡΡΠ±ΠΎ ΠΈΠ»ΠΈ Π³ΡΡΠ±ΠΎ ΠΈΠ·ΠΌΠ΅ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΠ΅Ρ ΠΈ Π½ΠΈΡΠΊΠ°, ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°ΡΠ° Π±ΡΠΎΡΡΠ°, Π²ΡΠΈΡΠΊΠΎ Π΅ ΡΡΡΠΎΡΠΎ
ΠΡΠΎΡΠ°ΡΠ° Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π΅ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΈΠΈ Π½Π° Π½ΠΈΡΠΊΠΎ Π½ΠΈΠ²ΠΎ ΡΡΡ ΡΡΠ΅ΠΊΠ°: Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΡΠ΅, Π·Π°ΠΏΠ°Π·ΠΈΡΠ΅ ΡΠ΅ΠΊΡΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΈ Π΄Π° ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΊΡΠΌ Π½ΠΎΠ² Ρ Π½ΠΎΠ² ΡΡΠ΅ΠΊ. Π‘ΡΠ΅ΠΊΡΡ Π·Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ ΡΠ΅ ΡΠΏΡΠ°Π²Π»ΡΠ²Π° ΠΎΡ JS Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°. ΠΠ·Π³Π»Π΅ΠΆΠ΄Π°, ΠΊΠ°ΠΊΡΠ² Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡΡ, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠ΅ΡΠΈΡ
ΠΌΠ΅ Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°ΠΌΠ΅ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡΠ΅ ΠΏΠΎΡΠΎΡΠΈ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΡΡΠ½ΠΎ? Π€Π°ΠΊΡ Π΅, ΡΠ΅ Π±Π»ΠΎΠΊ I/O Π² QEMU ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΡΠ΅Π· ΡΡΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΈ ΡΠΎΠ²Π° Π΅ ΠΌΡΡΡΠΎΡΠΎ, ΠΊΡΠ΄Π΅ΡΠΎ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΈΠΈΡΠ΅ Π½Π° ΡΡΠ΅ΠΊΠ° Π½Π° Π½ΠΈΡΠΊΠΎ Π½ΠΈΠ²ΠΎ Π±ΠΈΡ
Π° Π±ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ. ΠΠ° ΡΠ°ΡΡΠΈΠ΅, Emscipten Π²Π΅ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΡΠΌ Π·Π° Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π΄ΠΎΡΠΈ Π΄Π²Π°:
Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΡΠΌ ΡΡΠΏΡΠ» Π΄Π° ΡΠ°Π·Π΄Π΅Π»Ρ ΠΊΠΎΠ΄Π° Π½Π° Π΅Π΄ΠΈΠ½, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ Π² WASM ΠΈ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠ°Π½ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Emterpreter, ΡΠ°ΠΊΠ° ΡΠ΅ Π±Π»ΠΎΠΊΠΎΠ²ΠΈΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΠ°Π±ΠΎΡΡΡ (Π²ΠΈΠΆΡΠ΅ Π² ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΠ΅ΡΠΈΡ, ΠΊΠ°ΠΊΡΠΎ ΡΠ΅ ΠΊΠ°Π·Π²Π°...). Π’ΠΎΠ΅ΡΡ, Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π½Π΅ΡΠΎ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π° ΡΠΌΠ΅ΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠΉΠ½ΠΎ Π½Π΅ΡΠΎ:
- ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠ°Π½ Π±Π»ΠΎΠΊ I/O. Π, Π½Π°ΠΈΡΡΠΈΠ½Π° Π»ΠΈ ΠΎΡΠ°ΠΊΠ²Π°Ρ ΡΠ΅ Π΅ΠΌΡΠ»ΠΈΡΠ°Π½Π° NVMe Ρ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ? π
- ΡΡΠ°ΡΠΈΡΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ ΠΎΡΠ½ΠΎΠ²Π΅Π½ QEMU ΠΊΠΎΠ΄ (ΠΏΡΠ΅Π²ΠΎΠ΄Π°Ρ, Π΄ΡΡΠ³ΠΈ Π΅ΠΌΡΠ»ΠΈΡΠ°Π½ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΈ Ρ.Π½.)
- Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ Π³ΠΎΡΡ ΠΊΠΎΠ΄ Π² WASM
Π₯Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π½Π° ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈΡΠ΅ Π½Π° QEMU
ΠΠ°ΠΊΡΠΎ Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π²Π΅ΡΠ΅ ΡΠ΅ Π΄ΠΎΡΠ΅ΡΠ°ΡΠ΅, ΠΊΠΎΠ΄ΡΡ Π·Π° Π΅ΠΌΡΠ»ΠΈΡΠ°Π½Π΅ Π½Π° Π³ΠΎΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ ΠΈ ΠΊΠΎΠ΄ΡΡ Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° Ρ ΠΎΡΡ ΠΌΠ°ΡΠΈΠ½Π° ΡΠ° ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈ Π² QEMU. ΠΡΡΡΠ½ΠΎΡΡ Π΄ΠΎΡΠΈ Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΎ:
- ΠΈΠΌΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ Π·Π° Π³ΠΎΡΡΠΈ
- ΠΈΠΌΠ° ΡΡΠΊΠΎΡΠΈΡΠ΅Π»ΠΈ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ KVM Π·Π° Ρ
Π°ΡΠ΄ΡΠ΅ΡΠ½Π° Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Linux (Π·Π° Π³ΠΎΡΡ ΠΈ Ρ
ΠΎΡΡ ΡΠΈΡΡΠ΅ΠΌΠΈ, ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ Π΅Π΄Π½Π° Ρ Π΄ΡΡΠ³Π°), TCG Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° JIT ΠΊΠΎΠ΄ Π½Π°Π²ΡΡΠΊΡΠ΄Π΅. ΠΠ°ΠΏΠΎΡΠ²Π°ΠΉΠΊΠΈ Ρ QEMU 2.9, ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ° Π·Π° Ρ
Π°ΡΠ΄ΡΠ΅ΡΠ½Π° Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ HAXM Π² Windows (
Π΄Π΅ΡΠ°ΠΉΠ»ΠΈΡΠ΅ ) - Π°ΠΊΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° TCG, Π° Π½Π΅ Ρ Π°ΡΠ΄ΡΠ΅ΡΠ½Π° Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, ΡΠΎΠ³Π°Π²Π° ΡΠΎΠΉ ΠΈΠΌΠ° ΠΎΡΠ΄Π΅Π»Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ΄ Π·Π° Π²ΡΡΠΊΠ° Ρ ΠΎΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π·Π° ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ
- ... ΠΈ ΠΎΠΊΠΎΠ»ΠΎ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° - Π΅ΠΌΡΠ»ΠΈΡΠ°Π½ΠΈ ΠΏΠ΅ΡΠΈΡΠ΅ΡΠ½ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ, Π·Π°ΠΏΠΈΡ-ΠΏΠΎΠ²ΡΠ°ΡΡΠ½Π΅ ΠΈ Ρ.Π½.
ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, Π·Π½Π°Π΅ΡΠ΅ Π»ΠΈ: QEMU ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ΠΌΡΠ»ΠΈΡΠ° Π½Π΅ ΡΠ°ΠΌΠΎ ΡΠ΅Π»ΠΈΡ ΠΊΠΎΠΌΠΏΡΡΡΡ, Π½ΠΎ ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ° Π·Π° ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΏΡΠΎΡΠ΅Ρ Π² ΡΠ΄ΡΠΎΡΠΎ Π½Π° Ρ ΠΎΡΡΠ°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΡ AFL fuzzer Π·Π° Π΄Π²ΠΎΠΈΡΠ½ΠΎ ΠΎΠ±ΠΎΡΡΠ΄Π²Π°Π½Π΅. ΠΠΎΠΆΠ΅ Π±ΠΈ Π½ΡΠΊΠΎΠΉ Π±ΠΈ ΠΈΡΠΊΠ°Π» Π΄Π° ΠΏΡΠ΅Π½Π΅ΡΠ΅ ΡΠΎΠ·ΠΈ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° QEMU ΠΊΡΠΌ JS? π
ΠΠ°ΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΎΡΠ΄Π°Π²Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ Π±Π΅Π·ΠΏΠ»Π°ΡΠ΅Π½ ΡΠΎΡΡΡΠ΅Ρ, QEMU Π΅ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ ΡΡΠ΅Π· ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ configure
ΠΈ make
. ΠΠ° ΡΠ΅ΡΠ΅ΠΌ, ΡΠ΅ ΡΠ΅ΡΠΈΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π½Π΅ΡΠΎ: TCG Π±Π΅ΠΊΠ΅Π½Π΄, ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° Π½ΠΈΡΠΊΠ°, Π½Π΅ΡΠΎ Π΄ΡΡΠ³ΠΎ. ΠΠ΅ Π±ΡΡΠ·Π°ΠΉΡΠ΅ Π΄Π° Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ°ΡΡΠ»ΠΈΠ²ΠΈ/ΡΠΆΠ°ΡΠ΅Π½ΠΈ (ΠΏΠΎΠ΄ΡΠ΅ΡΡΠ°ΠΉΡΠ΅, Π°ΠΊΠΎ Π΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΎ) ΠΏΡΠΈ ΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Π°ΡΠ° Π·Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ Ρ Autoconf - Π²ΡΡΡΠ½ΠΎΡΡ, configure
QEMU ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ Π΅ ΡΠ°ΠΌΠΎΠ½Π°ΠΏΠΈΡΠ°Π½ ΠΈ Π½Π΅ Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΠΎΡ Π½ΠΈΡΠΎ.
WebAssembly
Π ΡΠ°ΠΊΠ°, ΠΊΠ°ΠΊΠ²ΠΎ Π΅ ΡΠΎΠ²Π° Π½Π΅ΡΠΎ, Π½Π°ΡΠ΅ΡΠ΅Π½ΠΎ WebAssembly (ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΎΡΠ΅ ΠΊΠ°ΡΠΎ WASM)? Π’ΠΎΠ²Π° Π΅ Π·Π°ΠΌΠ΅ΡΡΠΈΡΠ΅Π» Π½Π° Asm.js, ΠΊΠΎΠΉΡΠΎ Π²Π΅ΡΠ΅ Π½Π΅ ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Ρ Π·Π° Π²Π°Π»ΠΈΠ΄Π΅Π½ JavaScript ΠΊΠΎΠ΄. ΠΠ°ΠΏΡΠΎΡΠΈΠ², ΡΠΎΠΉ Π΅ ΡΠΈΡΡΠΎ Π΄Π²ΠΎΠΈΡΠ΅Π½ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½ ΠΈ Π΄ΠΎΡΠΈ ΠΏΡΠΎΡΡΠΎΡΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ»ΠΎ ΡΠΈΡΠ»ΠΎ Π² Π½Π΅Π³ΠΎ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠΎ: Π·Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΡΡ ΡΠΎ ΡΠ΅ ΡΡΡ
ΡΠ°Π½ΡΠ²Π° Π²ΡΠ² ΡΠΎΡΠΌΠ°Ρ
ΠΠΎΠΆΠ΅ Π΄Π° ΡΡΠ΅ ΡΡΠ²Π°Π»ΠΈ Π·Π° Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° Π·Π° ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ ΡΠΈΠΊΡΠ» Π·Π° Asm.js - ΡΠΎΠ²Π° Π΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° ΠΏΠΎΡΠΎΠΊΠ° ΠΎΡ βΠ²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎβ (Ρ.Π΅. if-then-else, ΡΠΈΠΊΠ»ΠΈ ΠΈ Ρ.Π½.), Π·Π° ΠΊΠΎΠΈΡΠΎ ΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Π½ΠΈ JS Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»ΠΈΡΠ΅, ΠΎΡ LLVM IR Π½Π° Π½ΠΈΡΠΊΠΎ Π½ΠΈΠ²ΠΎ, ΠΏΠΎ-Π±Π»ΠΈΠ·ΠΎ Π΄ΠΎ ΠΌΠ°ΡΠΈΠ½Π½ΠΈΡ ΠΊΠΎΠ΄, ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Π½ ΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ°. ΠΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΎΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° QEMU Π΅ ΠΏΠΎ-Π±Π»ΠΈΠ·ΠΎ Π΄ΠΎ Π²ΡΠΎΡΠΎΡΠΎ. ΠΠ·Π³Π»Π΅ΠΆΠ΄Π°, ΡΠ΅ ΡΡΠΊ Π΅ Π±Π°ΠΉΡΠΊΠΎΠ΄ΡΡ, ΠΊΡΠ°ΡΡ Π½Π° ΠΌΡΠΊΠΈΡΠ΅... Π ΡΠΎΠ³Π°Π²Π° ΠΈΠΌΠ° Π±Π»ΠΎΠΊΠΎΠ²Π΅, if-then-else ΠΈ ΡΠΈΠΊΠ»ΠΈ!..
Π ΡΠΎΠ²Π° Π΅ ΠΎΡΠ΅ Π΅Π΄Π½Π° ΠΏΡΠΈΡΠΈΠ½Π°, ΠΏΠΎΡΠ°Π΄ΠΈ ΠΊΠΎΡΡΠΎ Binaryen Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½: ΡΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ Π΄Π° ΠΏΡΠΈΠ΅ΠΌΠ° Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΎΡ Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ, Π±Π»ΠΈΠ·ΠΊΠΈ Π΄ΠΎ ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ Π±ΠΈ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π»ΠΎ Π² WASM. ΠΠΎ ΠΌΠΎΠΆΠ΅ ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π΄Π° ΠΏΡΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π° ΠΊΠΎΠ΄ ΠΎΡ Π³ΡΠ°ΡΠΈΠΊΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΈ ΠΏΡΠ΅Ρ ΠΎΠ΄ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡ . Π, Π²Π΅ΡΠ΅ ΠΊΠ°Π·Π°Ρ , ΡΠ΅ ΡΠΎΠΉ ΡΠΊΡΠΈΠ²Π° ΡΠΎΡΠΌΠ°ΡΠ° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° WebAssembly Π·Π°Π΄ ΡΠ΄ΠΎΠ±Π½ΠΈΡ C/C++ API.
TCG (Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° ΠΌΠ°Π»ΠΊΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅)
TCG tcg_qemu_tb_exec
, Π·Π° ΠΌΠ΅Π½ ΡΠ΅ ΠΎΠΊΠ°Π·Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.
ΠΠ° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π½ΠΎΠ² TCG Π±Π΅ΠΊΠ΅Π½Π΄ ΠΊΡΠΌ QEMU, ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΏΠΎΠ΄Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ tcg/<ΠΈΠΌΡ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ>
(Π² ΡΠ°ΠΊΡΠ² ΡΠ»ΡΡΠ°ΠΉ, tcg/binaryen
) ΠΈ ΡΡΠ΄ΡΡΠΆΠ° Π΄Π²Π° ΡΠ°ΠΉΠ»Π°: tcg-target.h
ΠΈ tcg-target.inc.c
ΠΈ configure
. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π΄ΡΡΠ³ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ°ΠΌ, Π½ΠΎ, ΠΊΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅ ΠΎΡ ΠΈΠΌΠ΅Π½Π°ΡΠ° Π½Π° ΡΠ΅Π·ΠΈ Π΄Π²Π°, ΠΈ Π΄Π²Π°ΠΌΠ°ΡΠ° ΡΠ΅ Π±ΡΠ΄Π°Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π½ΡΠΊΡΠ΄Π΅: Π΅Π΄ΠΈΠ½ΠΈΡΡ ΠΊΠ°ΡΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ Π·Π°Π³Π»Π°Π²Π΅Π½ ΡΠ°ΠΉΠ» (ΡΠΎΠΉ Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½ Π² tcg/tcg.h
, ΠΈ ΡΠΎΠ·ΠΈ Π²Π΅ΡΠ΅ Π΅ Π² Π΄ΡΡΠ³ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈΡΠ΅ tcg
, accel
ΠΈ Π½Π΅ ΡΠ°ΠΌΠΎ), Π΄ΡΡΠ³ΠΈΡΡ - ΡΠ°ΠΌΠΎ ΠΊΠ°ΡΠΎ ΠΊΠΎΠ΄ΠΎΠ² ΡΡΠ°Π³ΠΌΠ΅Π½Ρ Π² tcg/tcg.c
, Π½ΠΎ ΠΈΠΌΠ° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ.
Π Π΅ΡΠ°Π²Π°ΠΉΠΊΠΈ, ΡΠ΅ ΡΠ΅ ΠΎΡΠ΄Π΅Π»Ρ ΡΠ²ΡΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΈ ΠΏΡΠΎΡΡΠ²Π°Π½ΠΈΡ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ, Π°Π· ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΏΠΈΡΠ°Ρ βΡΠΊΠ΅Π»Π΅ΡΠΈΡΠ΅β Π½Π° ΡΠ΅Π·ΠΈ Π΄Π²Π° ΡΠ°ΠΉΠ»Π° ΠΎΡ Π΄ΡΡΠ³Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° Π±Π΅ΠΊΠ΅Π½Π΄Π°, ΡΠ΅ΡΡΠ½ΠΎ ΠΏΠΎΡΠΎΡΠ²Π°ΠΉΠΊΠΈ ΡΠΎΠ²Π° Π² Π·Π°Π³Π»Π°Π²ΠΊΠ°ΡΠ° Π½Π° Π»ΠΈΡΠ΅Π½Π·Π°.
Π΄ΠΎΡΠΈΠ΅ tcg-target.h
ΡΡΠ΄ΡΡΠΆΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π²ΡΠ² ΡΠΎΡΠΌΡΠ»ΡΡΠ° #define
-Ρ:
- ΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈ ΠΈ ΠΊΠ°ΠΊΠ²Π° ΡΠΈΡΠΈΠ½Π° ΠΈΠΌΠ° Π½Π° ΡΠ΅Π»Π΅Π²Π°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° (ΠΈΠΌΠ°ΠΌΠ΅ ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ - Π²ΡΠΏΡΠΎΡΡΡ Π΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΎ Π² ΠΏΠΎ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π΅Π½ ΠΊΠΎΠ΄ ΠΎΡ Π±ΡΠ°ΡΠ·ΡΡΠ° Π½Π° βΠ½Π°ΠΏΡΠ»Π½ΠΎ ΡΠ΅Π»Π΅Π²Π°ΡΠ°β Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ...)
- ΠΏΠΎΠ΄ΡΠ°Π²Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Π½Π° Ρ ΠΎΡΡΠ°: Π½Π° x86 ΠΈ Π΄ΠΎΡΠΈ Π² TCI, ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠΎ Π½Π΅ ΡΠ° ΠΏΠΎΠ΄ΡΠ°Π²Π½Π΅Π½ΠΈ, Π½ΠΎ Π°Π· ΡΠ΅ ΠΏΠΎΡΡΠ°Π²Ρ Π² ΠΊΠΎΠ΄ΠΎΠ²ΠΈΡ Π±ΡΡΠ΅Ρ Π½Π΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΈΠ·ΠΎΠ±ΡΠΎ, Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΊΡΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΈΡΠ΅ ΡΡΡΡΠΊΡΡΡΠΈ Π½Π° Binaryen, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ ΠΊΠ°ΠΆΠ°: 4 Π±Π°ΠΉΡΠΎΠ²Π΅
- ΠΊΠ°ΠΊΠ²ΠΈ Π½Π΅Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° Π±Π΅ΠΊΠ΅Π½Π΄ΡΡ - Π½ΠΈΠ΅ Π²ΠΊΠ»ΡΡΠ²Π°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π½Π°ΠΌΠ΅ΡΠΈΠΌ Π² Binaryen, ΠΎΡΡΠ°Π²ΡΠΌΠ΅ ΡΡΠΊΠΎΡΠΈΡΠ΅Π»Ρ ΡΠ°ΠΌ Π΄Π° ΡΠ°Π·Π΄Π΅Π»ΠΈ ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ Π½Π° ΠΏΠΎ-ΠΏΡΠΎΡΡΠΈ
- ΠΠ°ΠΊΡΠ² Π΅ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»Π½ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° TLB ΠΊΠ΅ΡΠ°, ΠΏΠΎΠΈΡΠΊΠ°Π½ ΠΎΡ Π±Π΅ΠΊΠ΅Π½Π΄Π°. Π€Π°ΠΊΡ Π΅, ΡΠ΅ Π² QEMU Π²ΡΠΈΡΠΊΠΎ Π΅ ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΎ: Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΈΠΌΠ° ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅/ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½Π΅, ΠΊΠ°ΡΠΎ Π²Π·Π΅ΠΌΠ°Ρ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ Π³ΠΎΡΡ MMU (ΠΊΡΠ΄Π΅ ΡΡΡ ΠΌΠ΅ Π΄Π° Π±ΡΠ΄Π΅ΠΌ Π±Π΅Π· Π½Π΅Π³ΠΎ ΡΠ΅Π³Π°?), Π’Π΅ Π·Π°ΠΏΠ°Π·Π²Π°Ρ ΡΠ²ΠΎΡ ΠΊΠ΅Ρ Π·Π° ΠΏΡΠ΅Π²ΠΎΠ΄ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΡΡΡΠΊΡΡΡΠ°, ΡΠΈΡΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΅ ΡΠ΄ΠΎΠ±Π½Π° Π·Π° Π²Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² ΠΈΠ·Π»ΡΡΠ²Π°Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅. ΠΡΠΏΡΠΎΡΡΡ Π΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΡΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π² ΡΠ°Π·ΠΈ ΡΡΡΡΠΊΡΡΡΠ° ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° Π½Π°ΠΉ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΎΡ ΠΌΠ°Π»ΠΊΠ° ΠΈ Π±ΡΡΠ·Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ?
- ΡΡΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠ΅Π»ΡΠ° Π½Π° Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ Π΄Π²Π° Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈ ΡΠ΅Π³ΠΈΡΡΡΡΠ°, Π΄Π° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° TB ΡΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡ ΠΈ ΠΏΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π΄Π° ΠΎΠΏΠΈΡΠ΅ΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ°Π»ΠΊΠΈ
inline
-ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ°ΡΠΎflush_icache_range
(Π½ΠΎ ΡΠΎΠ²Π° Π½Π΅ Π΅ Π½Π°ΡΠΈΡΡ ΡΠ»ΡΡΠ°ΠΉ)
Π΄ΠΎΡΠΈΠ΅ tcg-target.inc.c
, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌ ΠΏΠΎ ΡΠ°Π·ΠΌΠ΅Ρ ΠΈ ΡΡΠ΄ΡΡΠΆΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ:
- ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π·Π° ΡΠΎΠ²Π° ΠΊΠΎΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ°Π±ΠΎΡΡΡ Ρ ΠΊΠΎΠΈ ΠΎΠΏΠ΅ΡΠ°Π½Π΄ΠΈ. ΠΡΡΠ±ΠΎ ΠΊΠΎΠΏΠΈΡΠ°Π½ΠΎ ΠΎΡ ΠΌΠ΅Π½ ΠΎΡ Π΄ΡΡΠ³ Π±Π΅ΠΊΠ΅Π½Π΄
- ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΏΡΠΈΠ΅ΠΌΠ° Π΅Π΄Π½Π° Π²ΡΡΡΠ΅ΡΠ½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Π·Π° Π±Π°ΠΉΡ ΠΊΠΎΠ΄
- ΠΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠΊ ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡ
tcg/tcg.c
ΠΠ° ΡΠ΅Π±Π΅ ΡΠΈ ΠΈΠ·Π±ΡΠ°Ρ
ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ: Π² ΠΏΡΡΠ²ΠΈΡΠ΅ Π΄ΡΠΌΠΈ Π½Π° ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ Π±Π»ΠΎΠΊ Π·Π° ΠΏΡΠ΅Π²ΠΎΠ΄ Π·Π°ΠΏΠΈΡΠ°Ρ
ΡΠ΅ΡΠΈΡΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ: Π½Π°ΡΠ°Π»Π΅Π½ Π·Π½Π°ΠΊ (ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ Π² Π±Π»ΠΈΠ·ΠΎΡΡ 0xFFFFFFFF
, ΠΊΠΎΠ΅ΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΡΠ΅ΠΊΡΡΠΎΡΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° TB), ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΠΌΠΎΠ΄ΡΠ» ΠΈ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΎ ΡΠΈΡΠ»ΠΎ Π·Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ. ΠΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΠΌΠ°ΡΠΊΠ°ΡΠ° Π±Π΅ΡΠ΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½Π° Π² 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