QEMU.js: Π²Π΅Ρ‡Π΅ сСриозно ΠΈ с WASM

Π•Π΄Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Ρ€Π΅ΡˆΠΈΡ… Π·Π° Π·Π°Π±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΠ°Π·Π²Π°Ρ‚ обратимостта Π½Π° процСса ΠΈ Π½Π°ΡƒΡ‡Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚Π΅ JavaScript (ΠΏΠΎ-Ρ‚ΠΎΡ‡Π½ΠΎ Asm.js) ΠΎΡ‚ машинСн ΠΊΠΎΠ΄. Π—Π° СкспСримСнта бСшС ΠΈΠ·Π±Ρ€Π°Π½ QEMU ΠΈ извСстно Π²Ρ€Π΅ΠΌΠ΅ ΠΏΠΎ-късно бСшС написана статия Π½Π° Habr. Π’ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ ΠΌΠ΅ ΠΏΠΎΡΡŠΠ²Π΅Ρ‚Π²Π°Ρ…Π° Π΄Π° прСправя ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² WebAssembly ΠΈ Π΄ΠΎΡ€ΠΈ Π΄Π° сС ΠΎΡ‚ΠΊΠ°ΠΆΠ° ΠΏΠΎΡ‡Ρ‚ΠΈ Π·Π°Π²ΡŠΡ€ΡˆΠ΅Π½ Някак си Π½Π΅ исках ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°... Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π²ΡŠΡ€Π²Π΅ΡˆΠ΅, Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π±Π°Π²Π½ΠΎ ΠΈ сСга, наскоро Π² Ρ‚Π°Π·ΠΈ статия сС появи ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ ΠΏΠΎ Ρ‚Π΅ΠΌΠ°Ρ‚Π° β€žΠ˜ ΠΊΠ°ΠΊ ΡΠ²ΡŠΡ€ΡˆΠΈ всичко?β€œ Π’ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ Π½Π° моя ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π΅Π½ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ Ρ‡ΡƒΡ… β€žΠ’ΠΎΠ²Π° Π·Π²ΡƒΡ‡ΠΈ ΠΊΠ°Ρ‚ΠΎ ΡΡ‚Π°Ρ‚ΠΈΡβ€œ. Π•, Π°ΠΊΠΎ ΠΌΠΎΠΆΠ΅, Ρ‰Π΅ ΠΈΠΌΠ° статия. МоТС Π±ΠΈ някой Ρ‰Π΅ Π³ΠΎ Π½Π°ΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎ. ΠžΡ‚ Π½Π΅Π³ΠΎ читатСлят Ρ‰Π΅ Π½Π°ΡƒΡ‡ΠΈ някои Ρ„Π°ΠΊΡ‚ΠΈ Π·Π° Π΄ΠΈΠ·Π°ΠΉΠ½Π° Π½Π° Π±Π΅ΠΊΠ΅Π½Π΄Π° Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄ QEMU, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΊΠ°ΠΊ Π΄Π° напишС ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ Just-in-Time Π·Π° ΡƒΠ΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

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

Въй ΠΊΠ°Ρ‚ΠΎ Π²Π΅Ρ‡Π΅ бях Π½Π°ΡƒΡ‡ΠΈΠ» ΠΊΠ°ΠΊ Π΄Π° β€žΠΏΠΎ някакъв Π½Π°Ρ‡ΠΈΠ½β€œ прСнасям QEMU към JavaScript, Ρ‚ΠΎΠ·ΠΈ ΠΏΡŠΡ‚ бСшС Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π΄Π° Π³ΠΎ направя Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ ΠΈ Π΄Π° Π½Π΅ повтарям стари Π³Ρ€Π΅ΡˆΠΊΠΈ.

Π“Ρ€Π΅ΡˆΠΊΠ° Π½ΠΎΠΌΠ΅Ρ€ Π΅Π΄Π½ΠΎ: разклоняванС ΠΎΡ‚ освобоТдаванС Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°

ΠŸΡŠΡ€Π²Π°Ρ‚Π° ΠΌΠΈ Π³Ρ€Π΅ΡˆΠΊΠ° бСшС Π΄Π° разклоня моята вСрсия ΠΎΡ‚ Π³ΠΎΡ€Π½Π°Ρ‚Π° вСрсия 2.4.1. Π’ΠΎΠ³Π°Π²Π° ΠΌΠΈ сС стори Π΄ΠΎΠ±Ρ€Π° идСя: Π°ΠΊΠΎ Ρ‚ΠΎΡ‡ΠΊΠΎΠ²ΠΎΡ‚ΠΎ освобоТдаванС ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°, Ρ‚ΠΎ вСроятно Π΅ ΠΏΠΎ-стабилно ΠΎΡ‚ простото 2.4 ΠΈ ΠΎΡ‰Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ ΠΊΠ»ΠΎΠ½Π° master. И Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€Π°Ρ… Π΄Π° добавя доста ΠΌΠΎΠΈ собствСни Π³Ρ€Π΅ΡˆΠΊΠΈ, ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ нямах Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ Ρ‡ΡƒΠΆΠ΄ΠΈ. Π‘ΠΈΠ³ΡƒΡ€Π½ΠΎ Ρ‚Π°ΠΊΠ° сС Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎ. Но Π΅Ρ‚ΠΎ Π½Π΅Ρ‰ΠΎ: QEMU Π½Π΅ стои Π½Π° Π΅Π΄Π½ΠΎ място ΠΈ Π² някакъв ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄ΠΎΡ€ΠΈ обявиха оптимизация Π½Π° гСнСрирания ΠΊΠΎΠ΄ с 10 ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°.β€žΠ”Π°, сСга Ρ‰Π΅ Π·Π°ΠΌΡ€ΡŠΠ·Π½Π°β€œ, помислих си ΠΈ сС счупих. Π’ΡƒΠΊ трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π΅Π΄Π½ΠΎ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅: ΠΏΠΎΡ€Π°Π΄ΠΈ Сднонишковия Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ Π½Π° QEMU.js ΠΈ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ оригиналният QEMU Π½Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π° липсата Π½Π° многопоточност (Ρ‚.Π΅. Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° няколко Π½Π΅ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ ΠΏΡŠΡ‚Π΅ΠΊΠΈ, ΠΈ Π½Π΅ само β€žΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° всички ΡΠ΄Ρ€Π°β€œ) Π΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ Π·Π° Π½Π΅Π³ΠΎ, основнитС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Π½ΠΈΡˆΠΊΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° β€žΠΈΠ·ΠΊΠ»ΡŽΡ‡Π°β€œ, Π·Π° Π΄Π° ΠΌΠΎΠ³Π° Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌ ΠΎΡ‚Π²ΡŠΠ½. Π’ΠΎΠ²Π° създадС някои СстСствСни ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° сливанСто. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Ρ„Π°ΠΊΡ‚ΡŠΡ‚, Ρ‡Π΅ някои ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΎΡ‚ Π±Ρ€Π°Π½ΡˆΠ° master, с ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΎΠΏΠΈΡ‚Π°Ρ… Π΄Π° обСдиня ΠΊΠΎΠ΄Π° си, ΡΡŠΡ‰ΠΎ бяха ΠΈΠ·Π±Ρ€Π°Π½ΠΈ ΠΊΠ°Ρ‚ΠΎ Ρ‡Π΅Ρ€Π΅ΡˆΠ° Π² освобоТдаванСто Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° (ΠΈ слСдоватСлно Π² моя ΠΊΠ»ΠΎΠ½) ΡΡŠΡ‰ΠΎ вСроятно нямашС Π΄Π° добавят удобство.

ΠšΠ°Ρ‚ΠΎ цяло Ρ€Π΅ΡˆΠΈΡ…, Ρ‡Π΅ всС ΠΎΡ‰Π΅ ΠΈΠΌΠ° смисъл Π΄Π° ΠΈΠ·Ρ…Π²ΡŠΡ€Π»Ρ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°, Π΄Π° Π³ΠΎ разглобя Π½Π° части ΠΈ Π΄Π° създам Π½ΠΎΠ²Π° вСрсия ΠΎΡ‚ Π½ΡƒΠ»Π°Ρ‚Π° Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° Π½Π΅Ρ‰ΠΎ ΠΏΠΎ-свСТо ΠΈ сСга ΠΎΡ‚ master.

Π“Ρ€Π΅ΡˆΠΊΠ° Π½ΠΎΠΌΠ΅Ρ€ Π΄Π²Π΅: TLP мСтодология

По ΡΡŠΡ‰Π΅ΡΡ‚Π²ΠΎ Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ Π³Ρ€Π΅ΡˆΠΊΠ°, ΠΊΠ°Ρ‚ΠΎ цяло Ρ‚ΠΎΠ²Π° Π΅ просто характСристика Π½Π° създаванС Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² условията Π½Π° пълно Π½Π΅Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ ΠΊΠ°ΠΊΡ‚ΠΎ Π½Π° β€žΠΊΡŠΠ΄Π΅ ΠΈ ΠΊΠ°ΠΊ Π΄Π° сС Π΄Π²ΠΈΠΆΠΈΠΌ?β€œ, И ΠΊΠ°Ρ‚ΠΎ цяло β€žΡ‰Π΅ стигнСм Π»ΠΈ Ρ‚Π°ΠΌ?β€œ Π’ Ρ‚Π΅Π·ΠΈ условия Ρ‚Ρ€ΠΎΠΌΠ°Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ бСшС ΠΎΠΏΡ€Π°Π²Π΄Π°Π½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π½ΠΎ, СстСствСно, Π½Π΅ исках Π΄Π° Π³ΠΎ повтарям излишно. Π’ΠΎΠ·ΠΈ ΠΏΡŠΡ‚ исках Π΄Π° Π³ΠΎ направя ΠΌΡŠΠ΄Ρ€ΠΎ: Π°Ρ‚ΠΎΠΌΠ½ΠΈ Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ, ΡΡŠΠ·Π½Π°Ρ‚Π΅Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π° (Π° Π½Π΅ β€žΠ½ΠΈΠ·Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ символи Π·Π°Π΅Π΄Π½ΠΎ, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ сС ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π° (с прСдупрСТдСния)β€œ, ΠΊΠ°ΠΊΡ‚ΠΎ Линус Ворвалдс вСднъТ ΠΊΠ°Π·Π° Π·Π° някого, спорСд Wikiquote) ΠΈ Ρ‚.Π½.

Π“Ρ€Π΅ΡˆΠΊΠ° Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Ρ€ΠΈ: Π΄Π° влСзСш във Π²ΠΎΠ΄Π°Ρ‚Π°, Π±Π΅Π· Π΄Π° знаСш Π±Ρ€ΠΎΠ΄Π°

ВсС ΠΎΡ‰Π΅ Π½Π΅ съм сС ΠΎΡ‚ΡŠΡ€Π²Π°Π» напълно ΠΎΡ‚ Ρ‚ΠΎΠ²Π°, Π½ΠΎ сСга Ρ€Π΅ΡˆΠΈΡ… ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Π΄Π° Π½Π΅ слСдвам ΠΏΡŠΡ‚Ρ Π½Π° Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΎΡ‚ΠΎ ΡΡŠΠΏΡ€ΠΎΡ‚ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ Π΄Π° Π³ΠΎ направя β€žΠΊΠ°Ρ‚ΠΎ Π²ΡŠΠ·Ρ€Π°ΡΡ‚Π΅Π½β€œ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π° напиша своя TCG Π±Π΅ΠΊΠ΅Π½Π΄ ΠΎΡ‚ Π½ΡƒΠ»Π°Ρ‚Π°, Π·Π° Π΄Π° Π½Π΅ Π·Π° Π΄Π° трябва Π΄Π° ΠΊΠ°ΠΆΠ° ΠΏΠΎ-късно: β€žΠ”Π°, Ρ‚ΠΎΠ²Π° Π΅, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π±Π°Π²Π½ΠΎ, Π½ΠΎ Π½Π΅ ΠΌΠΎΠ³Π° Π΄Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π°ΠΌ всичко - Ρ‚Π°ΠΊΠ° сС пишС TCI...β€œ ОсвСн Ρ‚ΠΎΠ²Π° ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ Ρ‚ΠΎΠ²Π° изглСТдашС ΠΊΠ°Ρ‚ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌ Π΄Π²ΠΎΠΈΡ‡Π΅Π½ ΠΊΠΎΠ΄. ΠšΠ°ΠΊΡ‚ΠΎ сС ΠΊΠ°Π·Π²Π°, β€žΠ“Π΅Π½Ρ‚ сС ΡΡŠΠ±Ρ€Π°Ρƒ, Π½ΠΎ Π½Π΅ ΠΈ този”: ΠΊΠΎΠ΄ΡŠΡ‚, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π΅ Π΄Π²ΠΎΠΈΡ‡Π΅Π½, Π½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŠΡ‚ Π½Π΅ ΠΌΠΎΠΆΠ΅ просто Π΄Π° бъдС ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»Π΅Π½ към Π½Π΅Π³ΠΎ - Ρ‚ΠΎΠΉ трябва ΠΈΠ·Ρ€ΠΈΡ‡Π½ΠΎ Π΄Π° бъдС поставСн Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° Π·Π° компилация, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΎΠ±Π΅ΠΊΡ‚ ΠΎΡ‚ свСта Π½Π° JS, ΠΊΠΎΠΉΡ‚ΠΎ всС ΠΎΡ‰Π΅ трябва Π΄Π° Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈ някъдС. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, ΠΏΡ€ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΈ RISC Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ, Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°ΠΌ, Ρ‚ΠΈΠΏΠΈΡ‡Π½Π° ситуация Π΅ нСобходимостта ΠΎΡ‚ ΠΈΠ·Ρ€ΠΈΡ‡Π½ΠΎ Π½ΡƒΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° кСша Π½Π° инструкциитС Π·Π° Ρ€Π΅Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ ΠΊΠΎΠ΄ - Π°ΠΊΠΎ Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ Ρ‚ΠΎΠ²Π°, ΠΎΡ‚ ΠΊΠΎΠ΅Ρ‚ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ, Ρ‚ΠΎΠ³Π°Π²Π° във всСки случай Π΅ Π±Π»ΠΈΠ·ΠΎ. Π’ допълнСниС, ΠΎΡ‚ послСдния ΠΌΠΈ ΠΎΠΏΠΈΡ‚ Π½Π°ΡƒΡ‡ΠΈΡ…, Ρ‡Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŠΡ‚ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π½Π΅ сС ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»Ρ Π² срСдата Π½Π° Π±Π»ΠΎΠΊΠ° Π·Π° ΠΏΡ€Π΅Π²ΠΎΠ΄, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π½Π΅ сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ‚ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€Π°Π½ ΠΎΡ‚ всяко отмСстванС, ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ просто Π΄Π° Π³ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΎΡ‚ функцията Π½Π° TB .

Π”ΠΎΠΉΠ΄ΠΎΡ…Π° ΠΈ Ρ€ΠΈΡ‚Π°Ρ…Π°

Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ… Π΄Π° прСнаписвам ΠΊΠΎΠ΄Π° ΠΎΡ‰Π΅ ΠΏΡ€Π΅Π· юли, нСзабСлязано сС ΠΏΡ€ΠΎΠΊΡ€Π°Π΄Π½Π° магичСски ΡƒΠ΄Π°Ρ€: ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ писмата ΠΎΡ‚ GitHub пристигат ΠΊΠ°Ρ‚ΠΎ извСстия Π·Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΈ заявки Π·Π° изтСглянС, Π½ΠΎ Ρ‚ΡƒΠΊ, Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ спомСнаванС Π² Ρ‚Π΅ΠΌΠ°Ρ‚Π° Binaryen ΠΊΠ°Ρ‚ΠΎ Π±Π΅ΠΊΠ΅Π½Π΄ Π½Π° qemu Π² контСкста "Π’ΠΎΠΉ Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Ρ‰Π΅ ΠΊΠ°ΠΆΠ΅ Π½Π΅Ρ‰ΠΎ." Π“ΠΎΠ²ΠΎΡ€ΠΈΡ…ΠΌΠ΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ²ΡŠΡ€Π·Π°Π½Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π° Emscripten Π‘ΠΈΠ½Π°Ρ€ΠΈΠ΅Π½ Π·Π° създаванС Π½Π° WASM JIT. Π•, ΠΊΠ°Π·Π°Ρ…, Ρ‡Π΅ Ρ‚Π°ΠΌ ΠΈΠΌΠ°Ρ‚Π΅ Π»ΠΈΡ†Π΅Π½Π· Π·Π° Apache 2.0 ΠΈ QEMU ΠΊΠ°Ρ‚ΠΎ цяло сС разпространява ΠΏΠΎΠ΄ GPLv2 ΠΈ Π½Π΅ са ΠΌΠ½ΠΎΠ³ΠΎ ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΈ. ИзвСднъТ сС ΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ Π»ΠΈΡ†Π΅Π½Π· ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΎΠΏΡ€Π°Π²ΠΈ Π³ΠΎ някак (НС Π·Π½Π°ΠΌ: ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π³ΠΎ промСня, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎ Π»ΠΈΡ†Π΅Π½Π·ΠΈΡ€Π°Π½Π΅, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π½Π΅Ρ‰ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ...). Π’ΠΎΠ²Π°, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, ΠΌΠ΅ Π·Π°Ρ€Π°Π΄Π²Π°, Π·Π°Ρ‰ΠΎΡ‚ΠΎ ΠΏΠΎ Ρ‚ΠΎΠ²Π° Π²Ρ€Π΅ΠΌΠ΅ Π²Π΅Ρ‡Π΅ сС бях Π²Π³Π»Π΅Π΄Π°Π» Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½ΠΎ Π΄Π²ΠΎΠΈΡ‡Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ WebAssembly ΠΈ ΠΌΠΈ стана някак Ρ‚ΡŠΠΆΠ½ΠΎ ΠΈ Π½Π΅Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌΠΎ. ИмашС ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, която ΠΏΠΎΠ³Π»ΡŠΡ‰Π°ΡˆΠ΅ основнитС Π±Π»ΠΎΠΊΠΎΠ²Π΅ с Π³Ρ€Π°Ρ„ΠΈΠΊΠ°Ρ‚Π° Π½Π° ΠΏΡ€Π΅Ρ…ΠΎΠ΄Π°, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π°ΡˆΠ΅ Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π° ΠΈ Π΄ΠΎΡ€ΠΈ Π³ΠΎ изпълнявашС Π² самия ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

Π’ΠΎΠ³Π°Π²Π° имашС ΠΎΡ‰Π΅ писмо Π² пощСнския списък Π½Π° QEMU, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Π²ΡŠΠΏΡ€ΠΎΡΠ° β€žΠšΠΎΠΉ ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ ΠΈΠΌΠ° Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ Ρ‚ΠΎΠ²Π°?β€œ И Ρ‚ΠΎΠ²Π° Π΅ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ, ΠΎΠΊΠ°Π·Π° сС, Ρ‡Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. ΠšΠ°Ρ‚ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΡŠΠ±Π΅Ρ€Π΅Ρ‚Π΅ слСднитС Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅, Π°ΠΊΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΈΠ»ΠΈ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ Π±ΡŠΡ€Π·ΠΎ:

  • стартиранС Π½Π° Π½Π΅Ρ‰ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²Π° инсталация
  • виртуализация Π½Π° iOS, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ спорСд слуховСтС СдинствСното ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠΌΠ° ΠΏΡ€Π°Π²ΠΎ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΊΠΎΠ΄ Π² Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅, Π΅ JS Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π» (вярно Π»ΠΈ Π΅?)
  • дСмонстрация Π½Π° ΠΌΠΈΠ½ΠΈ-ОБ - Π΅Π΄Π½ΠΎΡ„Π»ΠΎΠΏΠΈ, Π²Π³Ρ€Π°Π΄Π΅Π½Π°, всякакъв Ρ„ΡŠΡ€ΠΌΡƒΠ΅Ρ€ ΠΈ Π΄Ρ€...

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° изпълнСниС Π½Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°

ΠšΠ°ΠΊΡ‚ΠΎ Π²Π΅Ρ‡Π΅ ΠΊΠ°Π·Π°Ρ…, QEMU Π΅ ΠΎΠ±Π²ΡŠΡ€Π·Π°Π½ с многопоточност, Π½ΠΎ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ΡŠΡ‚ Π³ΠΎ няма. Π•, Ρ‚ΠΎΠ²Π° Π΅, Π½Π΅... ΠŸΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Π½Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°ΡˆΠ΅, слСд Ρ‚ΠΎΠ²Π° сС появиха WebWorkers - Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°ΠΌ, Ρ‚ΠΎΠ²Π° Π΅ многопоточност, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π±Π΅Π· сподСлСни ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. ЕстСствСно, Ρ‚ΠΎΠ²Π° създава Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΡ€ΠΈ прСнасянС Π½Π° ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ ΠΊΠΎΠ΄, Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° Π½Π° сподСлСна ΠΏΠ°ΠΌΠ΅Ρ‚. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π°, ΠΏΠΎΠ΄ общСствСн натиск, бСшС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ ΠΈ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Ρ‚ΠΎ SharedArrayBuffers. Π’ΠΎΠΉ бСшС въвСдСн постСпСнно, ΠΎΡ‚ΠΏΡ€Π°Π·Π½ΡƒΠ²Π°Ρ…Π° стартиранСто ΠΌΡƒ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ΠΈ, слСд Ρ‚ΠΎΠ²Π° ΠΏΡ€Π°Π·Π½ΡƒΠ²Π°Ρ…Π° Нова Π³ΠΎΠ΄ΠΈΠ½Π°, Π° слСд Ρ‚ΠΎΠ²Π° Meltdown... Π‘Π»Π΅Π΄ ΠΊΠΎΠ΅Ρ‚ΠΎ стигнаха Π΄ΠΎ ΠΈΠ·Π²ΠΎΠ΄Π°, Ρ‡Π΅ Π³Ρ€ΡƒΠ±ΠΎ ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ, Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° сподСлСна ΠΏΠ°ΠΌΠ΅Ρ‚ ΠΈ нишка, ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π°Ρ‰Π° брояча, всичко Π΅ ΡΡŠΡ‰ΠΎΡ‚ΠΎ Ρ‰Π΅ сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ доста Ρ‚ΠΎΡ‡Π½ΠΎ. Π’Π°ΠΊΠ° Ρ‡Π΅ Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Ρ…ΠΌΠ΅ многопоточността със сподСлСна ΠΏΠ°ΠΌΠ΅Ρ‚. ИзглСТда, Ρ‡Π΅ ΠΏΠΎ-късно са Π³ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ ΠΎΡ‚Π½ΠΎΠ²ΠΎ, Π½ΠΎ ΠΊΠ°ΠΊΡ‚ΠΎ стана ясно ΠΎΡ‚ ΠΏΡŠΡ€Π²ΠΈΡ СкспСримСнт, ΠΈΠΌΠ° ΠΆΠΈΠ²ΠΎΡ‚ ΠΈ Π±Π΅Π· Π½Π΅Π³ΠΎ ΠΈ Π°ΠΊΠΎ Π΅ Ρ‚Π°ΠΊΠ°, Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ, Π±Π΅Π· Π΄Π° Ρ€Π°Π·Ρ‡ΠΈΡ‚Π°ΠΌΠ΅ Π½Π° многопоточност.

Π’Ρ‚ΠΎΡ€Π°Ρ‚Π° характСристика Π΅ Π½Π΅Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ†ΠΈΠΈ Π½Π° ниско Π½ΠΈΠ²ΠΎ със стСка: Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π΄Π° Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅, Π·Π°ΠΏΠ°Π·ΠΈΡ‚Π΅ тСкущия контСкст ΠΈ Π΄Π° ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ към Π½ΠΎΠ² с Π½ΠΎΠ² стСк. Π‘Ρ‚Π΅ΠΊΡŠΡ‚ Π·Π° повиквания сС управлява ΠΎΡ‚ JS Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° машина. ИзглСТда, какъв Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚, слСд ΠΊΠ°Ρ‚ΠΎ всС ΠΏΠ°ΠΊ Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π΄Π° управлявамС ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ‚Π΅ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ напълно Ρ€ΡŠΡ‡Π½ΠΎ? Π€Π°ΠΊΡ‚ Π΅, Ρ‡Π΅ Π±Π»ΠΎΠΊ I/O Π² QEMU сС изпълнява Ρ‡Ρ€Π΅Π· ΡΡŠΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΈ Ρ‚ΠΎΠ²Π° Π΅ мястото, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ†ΠΈΠΈΡ‚Π΅ Π½Π° стСка Π½Π° ниско Π½ΠΈΠ²ΠΎ Π±ΠΈΡ…Π° Π±ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ. Π—Π° щастиС, Emscipten Π²Π΅Ρ‡Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° асинхронни ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π΄ΠΎΡ€ΠΈ Π΄Π²Π°: АсинцифицирайтС ΠΈ Emterpreter. ΠŸΡŠΡ€Π²ΠΈΡΡ‚ Ρ€Π°Π±ΠΎΡ‚ΠΈ Ρ‡Ρ€Π΅Π· Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅ Π½Π° гСнСрирания JavaScript ΠΊΠΎΠ΄ ΠΈ Π²Π΅Ρ‡Π΅ Π½Π΅ сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°. Вторият Π΅ тСкущият "ΠΏΡ€Π°Π²ΠΈΠ»Π΅Π½ Π½Π°Ρ‡ΠΈΠ½" ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ Ρ‡Ρ€Π΅Π· Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄ Π·Π° родния ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€. Π Π°Π±ΠΎΡ‚ΠΈ, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π±Π°Π²Π½ΠΎ, Π½ΠΎ Π½Π΅ Ρ€Π°Π·Π΄ΡƒΠ²Π° ΠΊΠΎΠ΄Π°. Вярно Π΅, Ρ‡Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° ΡΡŠΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Π·Π° Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° бъдС прСдоставСна нСзависимо (Π²Π΅Ρ‡Π΅ имашС ΡΡŠΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, написани Π·Π° Asyncify ΠΈ имашС имплСмСнтация Π½Π° ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π½ΠΎ ΡΡŠΡ‰ΠΈΡ API Π·Π° Emterpreter, просто Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° Π³ΠΈ ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅).

Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° всС ΠΎΡ‰Π΅ Π½Π΅ съм успял Π΄Π° раздСля ΠΊΠΎΠ΄Π° Π½Π° Π΅Π΄ΠΈΠ½, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½ Π² 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 ΠΊΠΎΠ΄. Напротив, Ρ‚ΠΎΠΉ Π΅ чисто Π΄Π²ΠΎΠΈΡ‡Π΅Π½ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ ΠΈ Π΄ΠΎΡ€ΠΈ простото записванС Π½Π° цяло число Π² Π½Π΅Π³ΠΎ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ просто: Π·Π° компактност Ρ‚ΠΎ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ LEB128.

МоТС Π΄Π° стС Ρ‡ΡƒΠ²Π°Π»ΠΈ Π·Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ° Π·Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ Ρ†ΠΈΠΊΡŠΠ» Π·Π° Asm.js - Ρ‚ΠΎΠ²Π° Π΅ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° инструкции Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΡ‚ β€žΠ²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎβ€œ (Ρ‚.Π΅. if-then-else, Ρ†ΠΈΠΊΠ»ΠΈ ΠΈ Ρ‚.Π½.), Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ са ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½ΠΈ JS Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅, ΠΎΡ‚ LLVM IR Π½Π° ниско Π½ΠΈΠ²ΠΎ, ΠΏΠΎ-Π±Π»ΠΈΠ·ΠΎ Π΄ΠΎ машинния ΠΊΠΎΠ΄, изпълняван ΠΎΡ‚ процСсора. ЕстСствСно, ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΎΡ‚ΠΎ прСдставянС Π½Π° QEMU Π΅ ΠΏΠΎ-Π±Π»ΠΈΠ·ΠΎ Π΄ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΡ‚ΠΎ. ИзглСТда, Ρ‡Π΅ Ρ‚ΡƒΠΊ Π΅ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ΡŠΡ‚, краят Π½Π° ΠΌΡŠΠΊΠΈΡ‚Π΅... И Ρ‚ΠΎΠ³Π°Π²Π° ΠΈΠΌΠ° Π±Π»ΠΎΠΊΠΎΠ²Π΅, if-then-else ΠΈ Ρ†ΠΈΠΊΠ»ΠΈ!..

И Ρ‚ΠΎΠ²Π° Π΅ ΠΎΡ‰Π΅ Π΅Π΄Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎΡ€Π°Π΄ΠΈ която Binaryen Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½: Ρ‚ΠΎΠΉ ΠΌΠΎΠΆΠ΅ СстСствСно Π΄Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΎΡ‚ високо Π½ΠΈΠ²ΠΎ, Π±Π»ΠΈΠ·ΠΊΠΈ Π΄ΠΎ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π±ΠΈ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π»ΠΎ Π² WASM. Но ΠΌΠΎΠΆΠ΅ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π΄Π° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π° ΠΊΠΎΠ΄ ΠΎΡ‚ Π³Ρ€Π°Ρ„ΠΈΠΊΠ° Π½Π° основни Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΈ ΠΏΡ€Π΅Ρ…ΠΎΠ΄ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ тях. Π•, Π²Π΅Ρ‡Π΅ ΠΊΠ°Π·Π°Ρ…, Ρ‡Π΅ Ρ‚ΠΎΠΉ скрива Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° WebAssembly Π·Π°Π΄ удобния C/C++ API.

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

TCG бСшС ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ Π±Π΅ΠΊΠ΅Π½Π΄ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π° C. Π’ΠΎΠ³Π°Π²Π° ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Π½Π΅ моТСшС Π΄Π° ΠΈΠ·Π΄ΡŠΡ€ΠΆΠΈ Π½Π° конкурСнцията с GCC, Π½ΠΎ Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка Π½Π°ΠΌΠ΅Ρ€ΠΈ своСто място Π² QEMU ΠΊΠ°Ρ‚ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄ Π·Π° хост ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°. Има ΠΈ TCG Π±Π΅ΠΊΠ΅Π½Π΄, ΠΊΠΎΠΉΡ‚ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° някакъв абстрактСн Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ Π²Π΅Π΄Π½Π°Π³Π° сС изпълнява ΠΎΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, Π½ΠΎ Ρ€Π΅ΡˆΠΈΡ… Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ ΠΌΡƒ Ρ‚ΠΎΠ·ΠΈ ΠΏΡŠΡ‚. Π€Π°ΠΊΡ‚ΡŠΡ‚ ΠΎΠ±Π°Ρ‡Π΅, Ρ‡Π΅ Π² QEMU Π²Π΅Ρ‡Π΅ Π΅ възмоТно Π΄Π° сС Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π° ΠΏΡ€Π΅Ρ…ΠΎΠ΄ΡŠΡ‚ към Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π°Ρ‚Π° TB Ρ‡Ρ€Π΅Π· функцията 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-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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€