QEMU.js: рдЕрдм рдЧрдВрднреАрд░ рдФрд░ WASM рдХреЗ рд╕рд╛рде

рдПрдХ рдмрд╛рд░ рдореИрдВрдиреЗ рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЙрддреНрдХреНрд░рдордгреАрдпрддрд╛ рд╕рд┐рджреНрдз рдХрд░реЗрдВ рдФрд░ рд╕реАрдЦреЗрдВ рдХрд┐ рдорд╢реАрди рдХреЛрдб рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, Asm.js) рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП QEMU рдХреЛ рдЪреБрдирд╛ рдЧрдпрд╛ рдФрд░ рдХреБрдЫ рд╕рдордп рдмрд╛рдж Habr рдкрд░ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдореБрдЭреЗ WebAssembly рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд░реАрдореЗрдХ рдмрдирд╛рдиреЗ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЦреБрдж рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЧрдИ рд▓рдЧрднрдЧ рд╕рдорд╛рдкреНрдд рдореИрдВ рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛... рдХрд╛рдо рдЪрд▓ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ, рдФрд░ рдЕрдм, рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╡рд╣ рд▓реЗрдЦ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рдЯрд┐рдкреНрдкрдгреА рд╡рд┐рд╖рдп рдкрд░ "рддреЛ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ?" рдореЗрд░реЗ рд╡рд┐рд╕реНрддреГрдд рдЙрддреНрддрд░ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ, рдореИрдВрдиреЗ рд╕реБрдирд╛ "рдпрд╣ рдПрдХ рд▓реЗрдЦ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред" рдЦреИрд░, рдпрджрд┐ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд▓реЗрдЦ рд╣реЛрдЧрд╛ред рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд▓рдЧреЗрдЧрд╛. рдЗрд╕рд╕реЗ рдкрд╛рдардХ QEMU рдХреЛрдб рдЬрдирд░реЗрд╢рди рдмреИрдХрдПрдВрдб рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рддрдереНрдп рд╕реАрдЦреЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЬрд╕реНрдЯ-рдЗрди-рдЯрд╛рдЗрдо рдХрдВрдкрд╛рдЗрд▓рд░ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВред

рдХрд╛рд░реНрдп

рдЪреВрдБрдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реАрдЦ рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ QEMU рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ "рдХрд┐рд╕реА рддрд░рд╣" рдХреИрд╕реЗ рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕ рдмрд╛рд░ рдЗрд╕реЗ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рдХрд░рдиреЗ рдФрд░ рдкреБрд░рд╛рдиреА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рди рджреЛрд╣рд░рд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред

рддреНрд░реБрдЯрд┐ рд╕рдВрдЦреНрдпрд╛ рдПрдХ: рдмрд┐рдВрджреБ рд░рд┐рд▓реАрдЬ рд╕реЗ рд╢рд╛рдЦрд╛

рдореЗрд░реА рдкрд╣рд▓реА рдЧрд▓рддреА рдореЗрд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдкрд╕реНрдЯреНрд░реАрдо рд╕рдВрд╕реНрдХрд░рдг 2.4.1 рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдерд╛ред рддрдм рдореБрдЭреЗ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд▓рдЧрд╛: рдпрджрд┐ рдкреЙрдЗрдВрдЯ рд░рд┐рд▓реАрдЬрд╝ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╕рд░рд▓ 2.4 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рд╢рд╛рдЦрд╛ master. рдФрд░ рдЪреВрдБрдХрд┐ рдореИрдВрдиреЗ рдЙрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдмрдЧ рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдХрд┐рд╕реА рдФрд░ рдХреА рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдРрд╕рд╛ рд╣реА рд╣реБрдЖред рд▓реЗрдХрд┐рди рдмрд╛рдд рдпрд╣ рд╣реИ: QEMU рдЕрднреА рднреА рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ 10 рдкреНрд░рддрд┐рд╢рдд рддрдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдШреЛрд╖рдгрд╛ рдХреАред "рд╣рд╛рдБ, рдЕрдм рдореИрдВ рдлреНрд░реАрдЬ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ," рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдФрд░ рдЯреВрдЯ рдЧрдпрд╛ред рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: QEMU.js рдХреА рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдкреНрд░рдХреГрддрд┐ рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдореВрд▓ QEMU рдорд▓реНрдЯреА-рдереНрд░реЗрдбрд┐рдВрдЧ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, рдПрдХ рд╕рд╛рде рдХрдИ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдкрдереЛрдВ рдХреЛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдФрд░ рди рдХреЗрд╡рд▓ "рд╕рднреА рдХрд░реНрдиреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ") рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдереНрд░реЗрдб рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдореБрдЭреЗ рдмрд╛рд╣рд░ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП "рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдирд╛" рдерд╛ред рдЗрд╕рд╕реЗ рд╡рд┐рд▓рдп рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рд╣реБрдИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╢рд╛рдЦрд╛ рд╕реЗ рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрди master, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдерд╛, рдпрджрд┐ рдкреЙрдЗрдВрдЯ рд░рд┐рд▓реАрдЬрд╝ (рдФрд░ рдЗрд╕рд▓рд┐рдП рдореЗрд░реА рд╢рд╛рдЦрд╛ рдореЗрдВ) рдореЗрдВ рднреА рдЪреЗрд░реА рдХреЛ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реЛрддрд╛ рддреЛ рд╢рд╛рдпрдж рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рд╣реЛрддреАред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдмрд╛рд╣рд░ рдлреЗрдВрдХрдирд╛, рдЙрд╕реЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рдирд╛ рдФрд░ рдХрд┐рд╕реА рдирдИ рдФрд░ рдЕрдм рдХреА рдЪреАрдЬрд╝ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдирд╛ рдЕрднреА рднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред master.

рдЧрд▓рддреА рдирдВрдмрд░ рджреЛ: рдЯреАрдПрд▓рдкреА рдкрджреНрдзрддрд┐

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рдХреЛрдИ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ "рдХрд╣рд╛рдВ рдФрд░ рдХреИрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реИ?" рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ "рдХреНрдпрд╛ рд╣рдо рд╡рд╣рд╛рдВ рдкрд╣реБрдВрдЪреЗрдВрдЧреЗ?" рджреЛрдиреЛрдВ рдХреА рдкреВрд░реА рдЧрд▓рддрдлрд╣рдореА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдЗрди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЕрдирд╛рдбрд╝реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рд╡рд┐рдХрд▓реНрдк рдерд╛, рд▓реЗрдХрд┐рди, рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдореИрдВ рдЗрд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рджреЛрд╣рд░рд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрд╕ рдмрд╛рд░ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛: рдкрд░рдорд╛рдгреБ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛рдПрдВ, рд╕рдЪреЗрдд рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди (рдФрд░ "рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдиреЗ рддрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рд░реНрдгреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рдирд╣реАрдВ (рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде)", рдЬреИрд╕рд╛ рдХрд┐ рд▓рд┐рдиреБрд╕ рдЯреЛрд░рд╡рд╛рд▓реНрдбреНрд╕ рдиреЗ рдПрдХ рдмрд╛рд░ рдХрд┐рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛ рдерд╛, рд╡рд┐рдХреАрдХреЛрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░), рдЖрджрд┐ред

рдЧрд▓рддреА рдирдВрдмрд░ рддреАрди: рдШрд╛рдЯ рдХреЛ рдЬрд╛рдиреЗ рдмрд┐рдирд╛ рдкрд╛рдиреА рдореЗрдВ рдЙрддрд░рдирд╛

рдореИрдВ рдЕрднреА рднреА рдЗрд╕рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдирд╣реАрдВ рдкрд╛ рд╕рдХрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рд░реЛрдз рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рдЕрдкрдирд╛рдКрдВрдЧрд╛, рдФрд░ рдЗрд╕реЗ "рдПрдХ рд╡рдпрд╕реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ" рдХрд░реВрдВрдЧрд╛, рдЕрд░реНрдерд╛рддреН, рдЕрдкрдиреЗ рдЯреАрд╕реАрдЬреА рдмреИрдХрдПрдВрдб рдХреЛ рдЦрд░реЛрдВрдЪ рд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛, рддрд╛рдХрд┐ рдРрд╕рд╛ рди рд╣реЛред рдмрд╛рдж рдореЗрдВ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛, "рд╣рд╛рдБ, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдзреАрд░реЗ-рдзреАрд░реЗ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╣рд░ рдЪреАрдЬрд╝ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ - рдЯреАрд╕реАрдЖрдИ рдЗрд╕реА рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ..." рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╢реБрд░реВ рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдореИрдВ рдмрд╛рдЗрдирд░реА рдХреЛрдб рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ. рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, тАЬрдЧреЗрдиреНрдЯ рдЗрдХрдЯреНрдард╛ рд╣реБрдЖ╤Г, рд▓реЗрдХрд┐рди рд╡рд╣ рдирд╣реАрдВ": рдХреЛрдб, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдмрд╛рдЗрдирд░реА рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЗрд╕реЗ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдзрдХреЗрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЬреЗрдПрд╕ рджреБрдирд┐рдпрд╛ рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдЕрднреА рднреА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд╣реАрдВ рдмрдЪрд╛ рд▓рд┐рдпрд╛ рдЬрд╛рдП. рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рд╛рдорд╛рдиреНрдп рдЖрд░рдЖрдИрдПрд╕рд╕реА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░, рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдХреИрд╢ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдпрджрд┐ рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ, рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдХрд░реАрдм рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдпрд╛рд╕ рд╕реЗ, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рдЕрдиреБрд╡рд╛рдж рдмреНрд▓реЙрдХ рдХреЗ рдордзреНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рдСрдлрд╕реЗрдЯ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдП рдЧрдП рдмрд╛рдЗрдЯрдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЯреАрдмреА рдкрд░ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ .

рдЙрдиреНрд╣реЛрдВрдиреЗ рдЖрдХрд░ рд▓рд╛рдд рдорд╛рд░реА

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВрдиреЗ рдЬреБрд▓рд╛рдИ рдореЗрдВ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЬрд╛рджреБрдИ рдХрд┐рдХ рдкрд░ рдХрд┐рд╕реА рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рдЧрдпрд╛: рдЖрдорддреМрд░ рдкрд░ GitHub рдХреЗ рдкрддреНрд░ рдореБрджреНрджреЛрдВ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЬрд╡рд╛рдмреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ, рдЕрдЪрд╛рдирдХ рд╕реВрддреНрд░ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВ рдХреНрдпреВрдореВ рдмреИрдХрдПрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдЗрдирд░реАрди рд╕рдВрджрд░реНрдн рдореЗрдВ, "рдЙрд╕рдиреЗ рдРрд╕рд╛ рдХреБрдЫ рдХрд┐рдпрд╛, рд╢рд╛рдпрдж рд╡рд╣ рдХреБрдЫ рдХрд╣реЗрдЧрд╛ред" рд╣рдо рдПрдореНрд╕рд╕реНрдХреНрд░рд┐рдкреНрдЯрди рдХреА рд╕рдВрдмрдВрдзрд┐рдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ рдмрд╛рдЗрдирд░реАрдПрди WASM JIT рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП. рдЦреИрд░, рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрд╛рдЪреЗ 2.0 рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╣реИ, рдФрд░ рдХреНрдпреВрдИрдПрдордпреВ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рдЬреАрдкреАрдПрд▓рд╡реА2 рдХреЗ рддрд╣рдд рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдмрд╣реБрдд рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИрдВред рдЕрдЪрд╛рдирдХ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рдареАрдХ рдХрд░реЛ (рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛: рд╢рд╛рдпрдж рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВ, рд╢рд╛рдпрдж рджреЛрд╣рд░реА рд▓рд╛рдЗрд╕реЗрдВрд╕рд┐рдВрдЧ, рд╢рд╛рдпрдж рдХреБрдЫ рдФрд░...)ред рдирд┐рдГрд╕рдВрджреЗрд╣, рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реБрдИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рд╕рдордп рддрдХ рдореИрдВ рдкрд╣рд▓реЗ рд╣реА рдХрд░реАрдм рд╕реЗ рджреЗрдЦ рдЪреБрдХрд╛ рдерд╛ рдмрд╛рдЗрдирд░реА рдкреНрд░рд╛рд░реВрдк WebAssembly, рдФрд░ рдореИрдВ рдХрд┐рд╕реА рддрд░рд╣ рджреБрдЦреА рдФрд░ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рдерд╛ред рд╡рд╣рд╛рдБ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рднреА рдерд╛ рдЬреЛ рд╕рдВрдХреНрд░рдордг рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╕рд╛рде рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдЦрд╛ рдЬрд╛рддрд╛ рдерд╛, рдмрд╛рдЗрдЯрдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рдерд╛, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕реЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рднреА рдЪрд▓рд╛рддрд╛ рдерд╛ред

рдлрд┐рд░ рдФрд░ рднреА рдХреБрдЫ рдерд╛ рдПрдХ рдкрддреНрд░ QEMU рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдкрд░, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИ, "рдХрд┐рд╕реЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?" рдФрд░ рдпрд╣ рд╣реИ рдЕрдЪрд╛рдирдХ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдпрджрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо, рдЖрдк рдЙрдкрдпреЛрдЧ рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдкрд░рд┐рдорд╛рд░реНрдЬрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЗрдВрд╕реНрдЯрд╛рд▓реЗрд╢рди рдХреЗ рдХреБрдЫ рд╢реИрдХреНрд╖рд┐рдХ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛
  • рдЖрдИрдУрдПрд╕ рдкрд░ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди, рдЬрд╣рд╛рдВ, рдЕрдлрд╡рд╛рд╣реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдХрдорд╛рддреНрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рддреБрд░рдВрдд рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ, рд╡рд╣ рдЬреЗрдПрд╕ рдЗрдВрдЬрди рд╣реИ (рдХреНрдпрд╛ рдпрд╣ рд╕рдЪ рд╣реИ?)
  • рдорд┐рдиреА-рдУрдПрд╕ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди - рд╕рд┐рдВрдЧрд▓-рдлреНрд▓реЙрдкреА, рдмрд┐рд▓реНрдЯ-рдЗрди, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд░реНрдорд╡реЗрдпрд░, рдЖрджрд┐...

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд░рдирдЯрд╛рдЗрдо рд╕реБрд╡рд┐рдзрд╛рдПрдБ

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛, QEMU рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИред рдареАрдХ рд╣реИ, рдпрд╛рдиреА, рдирд╣реАрдВ... рдкрд╣рд▓реЗ рддреЛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдирд╣реАрдВ рдерд╛, рдлрд┐рд░ рд╡реЗрдмрд╡рд░реНрдХрд░реНрд╕ рд╕рд╛рдордиреЗ рдЖрдП - рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпрд╣ рд╕рдВрджреЗрд╢ рдкрд╛рд╕рд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рд╣реИ рд╕рд╛рдЭрд╛ рдЪрд░ рдХреЗ рдмрд┐рдирд╛. рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рдЬрдирддрд╛ рдХреЗ рджрдмрд╛рд╡ рдореЗрдВ рдЗрд╕реЗ рдЗрд╕ рдирд╛рдо рд╕реЗ рд▓рд╛рдЧреВ рднреА рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ SharedArrayBuffers. рдЗрд╕реЗ рдзреАрд░реЗ-рдзреАрд░реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рд▓реЙрдиреНрдЪ рдХрд╛ рдЬрд╢реНрди рдордирд╛рдпрд╛, рдлрд┐рд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдирдП рд╕рд╛рд▓ рдХрд╛ рдЬрд╢реНрди рдордирд╛рдпрд╛, рдФрд░ рдлрд┐рд░ рдореЗрд▓реНрдЯрдбрд╛рдЙрди... рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡реЗ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ рдХрд┐ рд╕рдордп рдорд╛рдк рдХреЛ рдореЛрдЯрд╛ рдпрд╛ рд╕реНрдереВрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдФрд░ рдП рдХреА рдорджрдж рд╕реЗ рдереНрд░реЗрдб рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдмрдврд╝рд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рд╕рдм рд╕рдорд╛рди рд╣реИ рдпрд╣ рдХрд╛рдлреА рд╕рдЯреАрдХрддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛. рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджрд┐рдпрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдЪрд╛рд▓реВ рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдкреНрд░рдпреЛрдЧ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛, рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдЬреАрд╡рди рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рд╣рдо рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред

рджреВрд╕рд░реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╣реЗрд░рдлреЗрд░ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ рд╣реИ: рдЖрдк рдмрд╕ рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдХреЛ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ, рд╕рд╣реЗрдЬ рдирд╣реАрдВ рд╕рдХрддреЗ рдФрд░ рдирдП рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдирдП рдкрд░ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЛ JS рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ, рдЪреВрдБрдХрд┐ рд╣рдордиреЗ рдЕрднреА рднреА рдкрд┐рдЫрд▓реЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ QEMU рдореЗрдВ рдмреНрд▓реЙрдХ I/O рдХреЛ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣реАрдВ рдкрд░ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╕реНрдЯреИрдХ рд╣реЗрд░рдлреЗрд░ рдХрд╛рдо рдЖрдПрдЧрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, Emscipten рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рджреЛ рднреА: рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ ╨╕ рдПрдореНрдкреНрдЯрд░рдкреНрд░реЗрдЯрд░. рдкрд╣рд▓рд╛ рдЙрддреНрдкрдиреНрди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмреНрд▓реЛрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдм рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░рд╛ рд╡рд░реНрддрдорд╛рди "рд╕рд╣реА рддрд░реАрдХрд╛" рд╣реИ рдФрд░ рдореВрд▓ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯрдХреЛрдб рдкреАрдврд╝реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рдХреЛ рдЦрд╝рд░рд╛рдм рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рдЪ рд╣реИ, рдЗрд╕ рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдХреЛрд░рдЖрдЙрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ (Asyncify рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрд░рдЖрдЙрдЯреНрд╕ рдереЗ рдФрд░ Emterpreter рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдЙрд╕реА рдПрдкреАрдЖрдИ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдерд╛, рдЖрдкрдХреЛ рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА)ред

рдлрд┐рд▓рд╣рд╛рд▓, рдореИрдВ рдЕрднреА рддрдХ рдХреЛрдб рдХреЛ WASM рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдПрдХ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ Emterpreter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рдирд╣реАрдВ рд╣реБрдЖ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдЕрднреА рддрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЕрдЧрд▓реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рджреЗрдЦреЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ...)ред рдпрд╛рдиреА, рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ рдЗрд╕ рдордЬрд╝реЗрджрд╛рд░ рд╕реНрддрд░рд┐рдд рдЪреАрдЬрд╝ рдЬреИрд╕рд╛ рдХреБрдЫ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:

  • рдмреНрд▓реЙрдХ I/O рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИред рдЦреИрд░, рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЗрд╢реА рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдЕрдиреБрдХрд░рдгреАрдп рдПрдирд╡реАрдПрдордИ рдХреА рдЙрдореНрдореАрдж рдереА? ЁЯЩВ
  • рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдореБрдЦреНрдп QEMU рдХреЛрдб (рдЕрдиреБрд╡рд╛рджрдХ, рдЕрдиреНрдп рдЕрдиреБрдХрд░рдгрд┐рдд рдЙрдкрдХрд░рдг, рдЖрджрд┐)
  • WASM рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдЕрддрд┐рдерд┐ рдХреЛрдб

QEMU рд╕реНрд░реЛрддреЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рдХреНрдпреВрдИрдПрдордпреВ рдореЗрдВ рдЕрддрд┐рдерд┐ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдФрд░ рд╣реЛрд╕реНрдЯ рдорд╢реАрди рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдереЛрдбрд╝рд╛ рдкреЗрдЪреАрджрд╛ рднреА рд╣реИ:

  • рдЕрддрд┐рдерд┐ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рдПрдВ рд╣реИрдВ
  • рд╡рд╣рд╛рдБ рд╣реИ рддреНрд╡рд░рдХ, рдЕрд░реНрдерд╛рддреН, рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡реАрдПрдо (рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдЕрддрд┐рдерд┐ рдФрд░ рд╣реЛрд╕реНрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП), рдХрд╣реАрдВ рднреА рдЬреЗрдЖрдИрдЯреА рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЯреАрд╕реАрдЬреАред QEMU 2.9 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ HAXM рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдорд╛рдирдХ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ (рд╡рд┐рд╡рд░рдг)
  • рдпрджрд┐ рдЯреАрд╕реАрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╣реЛрд╕реНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдХреЛрдб рдЬрдирд░реЗрд╢рди рд╕рдорд░реНрдерди рд╣реЛрддрд╛ рд╣реИ
  • ... рдФрд░ рдЗрди рд╕рдмрдХреЗ рдЖрд╕рдкрд╛рд╕ - рдЕрдиреБрдХрд░рдгрд┐рдд рдмрд╛рд╣реНрдп рдЙрдкрдХрд░рдг, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдорд╛рдЗрдЧреНрд░реЗрд╢рди, рд░рд┐рдХреЙрд░реНрдб-рд░реАрдкреНрд▓реЗ, рдЖрджрд┐ред

рд╡реИрд╕реЗ, рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ: рдХреНрдпреВрдИрдПрдордпреВ рди рдХреЗрд╡рд▓ рдкреВрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╣реЛрд╕реНрдЯ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рднреА рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рдЗрдирд░реА рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдПрдлрдПрд▓ рдлрд╝рдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдХреЛрдИ QEMU рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЗрд╕ рддрд░реАрдХреЗ рдХреЛ JS рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛? ЁЯШЙ

рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓реЗ рдЖ рд░рд╣реЗ рдореБрдлреНрдд рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреА рддрд░рд╣, QEMU рдХреЛ рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ configure ╨╕ make. рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ: рдПрдХ рдЯреАрд╕реАрдЬреА рдмреИрдХрдПрдВрдб, рдереНрд░реЗрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдХреБрдЫ рдФрд░ред рдСрдЯреЛрдХреЙрдиреНрдл рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рдЦреБрд╢/рднрдпрднреАрдд рд╣реЛрдиреЗ рдореЗрдВ рдЬрд▓реНрджрдмрд╛рдЬреА рди рдХрд░реЗрдВ (рдЬреИрд╕рд╛ рдЙрдЪрд┐рдд рд╣реЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░реЗрдВ) - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, configure QEMU рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред

WebAssembly

рддреЛ WebAssembly (рдЙрд░реНрдл WASM) рдирд╛рдордХ рдпрд╣ рдЪреАрдЬрд╝ рдХреНрдпрд╛ рд╣реИ? рдпрд╣ Asm.js рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИ, рдЬреЛ рдЕрдм рд╡реИрдз рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рдЗрдирд░реА рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рд▓рд┐рдЦрдирд╛ рднреА рдмрд╣реБрдд рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ: рдХреЙрдореНрдкреИрдХреНрдЯрдиреЗрд╕ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдПрд▓рдИрдмреА128.

рдЖрдкрдиреЗ Asm.js рдХреЗ рд▓рд┐рдП рд░реАрд▓реВрдкрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реЛрдЧрд╛ - рдпрд╣ "рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп" рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдирд┐рд░реНрджреЗрд╢реЛрдВ (рдпрд╛рдиреА, рдпрджрд┐-рддрдм-рдЕрдиреНрдпрдерд╛, рд▓реВрдк рдЗрддреНрдпрд╛рджрд┐) рдХреА рдмрд╣рд╛рд▓реА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЬреЗрдПрд╕ рдЗрдВрдЬрди рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░, рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдорд╢реАрди рдХреЛрдб рдХреЗ рдХрд░реАрдмред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, QEMU рдХрд╛ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджреВрд╕рд░реЗ рдХреЗ рдХрд░реАрдм рд╣реИред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ, рдмрд╛рдЗрдЯрдХреЛрдб, рдкреАрдбрд╝рд╛ рдХрд╛ рдЕрдВрдд... рдФрд░ рдлрд┐рд░ рдмреНрд▓реЙрдХ рд╣реИрдВ, рдпрджрд┐-рддрдм-рдЕрдиреНрдпрдерд╛ рдФрд░ рд▓реВрдк!..

рдФрд░ рдпрд╣ рдПрдХ рдФрд░ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдмрд╛рдЗрдирд░реАрдпрди рдЙрдкрдпреЛрдЧреА рд╣реИ: рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ WASM рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдХрд░реАрдм рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдмреНрд▓реЙрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХреЛрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХреЗ рдЧреНрд░рд╛рдл рд╕реЗ рднреА рдХреЛрдб рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЦреИрд░, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ C/C++ API рдХреЗ рдкреАрдЫреЗ WebAssembly рд╕реНрдЯреЛрд░реЗрдЬ рдлреЙрд░реНрдореЗрдЯ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИред

рдЯреАрд╕реАрдЬреА (рдЯрд┐рдиреА рдХреЛрдб рдЬреЗрдирд░реЗрдЯрд░)

TCG рдореВрд▓рд░реВрдк рд╕реЗ рдерд╛ рд╕реА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдмреИрдХрдПрдВрдбред рдлрд┐рд░, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдпрд╣ рдЬреАрд╕реАрд╕реА рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рд╣реЛрд╕реНрдЯ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬрдирд░реЗрд╢рди рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреВрдИрдПрдордпреВ рдореЗрдВ рдЕрдкрдиреА рдЬрдЧрд╣ рдорд┐рд▓ рдЧрдИред рдПрдХ рдЯреАрд╕реАрдЬреА рдмреИрдХрдПрдВрдб рднреА рд╣реИ рдЬреЛ рдХреБрдЫ рдЕрдореВрд░реНрдд рдмрд╛рдЗрдЯрдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рддреБрд░рдВрдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ QEMU рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрддреНрдкрдиреНрди рдЯреАрдмреА рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИ tcg_qemu_tb_exec, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реБрдЖред

QEMU рдореЗрдВ рдПрдХ рдирдпрд╛ TCG рдмреИрдХрдПрдВрдб рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдиреА рд╣реЛрдЧреА tcg/<╨╕╨╝╤П ╨░╤А╤Е╨╕╤В╨╡╨║╤В╤Г╤А╤Л> (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, tcg/binaryen), рдФрд░ рдЗрд╕рдореЗрдВ рджреЛ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реИрдВ: tcg-target.h ╨╕ tcg-target.inc.c ╨╕ рд╕рд▓рд╛рд╣ рджреЗрдирд╛ рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ configure. рдЖрдк рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЗрдВ рд╡рд╣рд╛рдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрди рджреЛрдиреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рджреЛрдиреЛрдВ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреА: рдПрдХ рдирд┐рдпрдорд┐рдд рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ (рдпрд╣ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ) tcg/tcg.h, рдФрд░ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╣реИ tcg, accel рдФрд░ рди рдХреЗрд╡рд▓), рдЕрдиреНрдп - рдХреЗрд╡рд▓ рдПрдХ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ tcg/tcg.c, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕реНрдерд┐рд░ рдХрд╛рд░реНрдпреЛрдВ рддрдХ рдЗрд╕рдХреА рдкрд╣реБрдВрдЪ рд╣реИред

рдпрд╣ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реБрдП рдХрд┐ рдореИрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЗрд╕рдХреА рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдВрдЪ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рд╡реНрдпрддреАрдд рдХрд░реВрдВрдЧрд╛, рдореИрдВрдиреЗ рдмрд╕ рдЗрди рджреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ "рдХрдВрдХрд╛рд▓реЛрдВ" рдХреЛ рдПрдХ рдЕрдиреНрдп рдмреИрдХрдПрдВрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛, рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЗрд╕реЗ рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╣реЗрдбрд░ рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ред

рдлрд╝рд╛рдЗрд▓ tcg-target.h рдкреНрд░рдкрддреНрд░ рдореЗрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ #define-рдПрд╕:

  • рд▓рдХреНрд╖реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдХрд┐рддрдиреЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдФрд░ рдХрд┐рддрдиреА рдЪреМрдбрд╝рд╛рдИ рд╣реИ (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрд┐рддрдиреЗ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрддрдиреЗ рд╣реИрдВ, рдЬрд┐рддрдиреЗ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ "рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рдХреНрд╖реНрдп" рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдХреЛрдб рдореЗрдВ рдХреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ...)
  • рд╣реЛрд╕реНрдЯ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕рдВрд░реЗрдЦрдг: x86 рдкрд░, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЯреАрд╕реАрдЖрдИ рдореЗрдВ рднреА, рдирд┐рд░реНрджреЗрд╢ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдВрд░реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреЛрдб рдмрдлрд░ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдмрд╛рдЗрдирд░реАрдпрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдбрд╛рд▓рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХрд╣реВрдВрдЧрд╛: 4 рдмрд╛рдЗрдЯреНрд╕
  • рдмреИрдХрдПрдВрдб рдХреМрди рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рд╣рдо рдмрд╛рдЗрдирд░реАрди рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдкрд╛рддреЗ рд╣реИрдВ рдЙрд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреНрд╡рд░рдХ рдХреЛ рдмрд╛рдХреА рдХреЛ рд╕рд░рд▓ рдореЗрдВ рддреЛрдбрд╝рдиреЗ рджреЗрдВ
  • рдмреИрдХрдПрдВрдб рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдзрд┐рдд рдЯреАрдПрд▓рдмреА рдХреИрд╢ рдХрд╛ рдЕрдиреБрдорд╛рдирд┐рдд рдЖрдХрд╛рд░ рдХреНрдпрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпреВрдИрдПрдордпреВ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЧрдВрднреАрд░ рд╣реИ: рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕реЗ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдЕрддрд┐рдерд┐ рдПрдордПрдордпреВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд▓реЛрдб/рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ (рдЕрдм рд╣рдо рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд╣рд╛рдВ рд╣реЛрдВрдЧреЗ?), рд╡реЗ рдЕрдкрдиреЗ рдЕрдиреБрд╡рд╛рдж рдХреИрд╢ рдХреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реАрдзреЗ рдкреНрд░рд╕рд╛рд░рдг рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреМрди рд╕рд╛ рдСрдлрд╕реЗрдЯ рдЖрджреЗрд╢реЛрдВ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рдФрд░ рддреЗрдЬрд╝ рдЕрдиреБрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
  • рдпрд╣рд╛рдВ рдЖрдк рдПрдХ рдпрд╛ рджреЛ рдЖрд░рдХреНрд╖рд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреАрдмреА рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рдЫреЛрдЯреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ inline-рдЬреИрд╕реЗ рдХрд╛рд░реНрдп flush_icache_range (рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░рд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ)

рдлрд╝рд╛рдЗрд▓ tcg-target.inc.cрдмреЗрд╢рдХ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЖрдХрд╛рд░ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрдИ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ:

  • рдЖрд░рдВрднреАрдХрд░рдг, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдз рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рдирд┐рд░реНрджреЗрд╢ рдХрд┐рд╕ рдСрдкрд░реЗрдВрдб рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рджреВрд╕рд░реЗ рдмреИрдХрдПрдВрдб рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирдХрд▓ рдХреА рдЧрдИ
  • рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдмрд╛рдЗрдЯрдХреЛрдб рдирд┐рд░реНрджреЗрд╢ рд▓реЗрддрд╛ рд╣реИ
  • рдЖрдк рдпрд╣рд╛рдВ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рднреА рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рд╕реНрдереИрддрд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ tcg/tcg.c

рдЕрдкрдиреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░рдгрдиреАрддрд┐ рдЪреБрдиреА: рдЕрдЧрд▓реЗ рдЕрдиреБрд╡рд╛рдж рдмреНрд▓реЙрдХ рдХреЗ рдкрд╣рд▓реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ рдЪрд╛рд░ рд╕рдВрдХреЗрддрдХ рд▓рд┐рдЦреЗ: рдПрдХ рдкреНрд░рд╛рд░рдВрдн рдЪрд┐рд╣реНрди (рдЖрд╕рдкрд╛рд╕ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп) 0xFFFFFFFF, рдЬрд┐рд╕рдиреЗ рдЯреАрдмреА рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА), рд╕рдВрджрд░реНрдн, рдЙрддреНрдкрдиреНрди рдореЙрдбреНрдпреВрд▓ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬрд╛рджреБрдИ рд╕рдВрдЦреНрдпрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╢рд╛рди рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ 0xFFFFFFFF - nрдЬрд╣рд╛рдВ n - рдПрдХ рдЫреЛрдЯреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛, рдФрд░ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЗрд╕реЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рддреЛ рдЗрд╕рдореЗрдВ 1 рдХреА рд╡реГрджреНрдзрд┐ рд╣реБрдИред рдЬрдм рдпрд╣ рдкрд╣реБрдВрдЪреА 0xFFFFFFFE, рд╕рдВрдХрд▓рди рд╣реБрдЖ, рдореЙрдбреНрдпреВрд▓ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛, рдПрдХ рдЫреЛрдЯреЗ "рд▓реЙрдиреНрдЪрд░" рдореЗрдВ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рд╣реБрдЖ tcg_qemu_tb_exec, рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ QEMU рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдХреНрд▓рд╛рд╕рд┐рдХреНрд╕ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "рдмреИрд╕рд╛рдЦреА, рдкреНрд░реЛрдЧрд░ рдХреЗ рджрд┐рд▓ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдзреНрд╡рдирд┐ рдореЗрдВ рдХрд┐рддрдирд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣реИ..."ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореЗрдореЛрд░реА рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд▓реАрдХ рд╣реЛ рд░рд╣реА рдереАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ QEMU рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдмрдВрдзрд┐рдд рдореЗрдореЛрд░реА рдереА! рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдХреЛрдб рдерд╛, рдЬреЛ рдЕрдЧрд▓рд╛ рдирд┐рд░реНрджреЗрд╢ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдПрдХ рд╕реВрдЪрдХ) рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рдерд╛ рдЬрд┐рд╕рдХрд╛ рд▓рд┐рдВрдХ рдкрд╣рд▓реЗ рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реАред рджрд░рдЕрд╕рд▓, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, QEMU рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИред рдЬрдм рдмрдлрд╝рд░ рдЦрд╝рддреНрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЕрдЧрд▓рд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЬрд╛рджреБрдИ рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд▓реА рдЪрд╛рд▓ рдиреЗ рдореБрдЭреЗ рдкрд╣рд▓реЗ рдкрд╛рд╕ рдкрд░ рдПрдХ рдЕрдкреНрд░рд╛рд░рдВрднреАрдХреГрдд рдмрдлрд░ рдкрд░ рдХреБрдЫ рдЧрд▓рдд рдореБрдХреНрдд рдХрд░рдХреЗ рдвреЗрд░ рд╡рд┐рдирд╛рд╢ рдореЗрдВ рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛрдиреЗ рджрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдореЗрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдлрд╝рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреМрди рд▓рд┐рдЦрддрд╛ рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ рдПрдореНрд╕рд╕реНрдХреНрд░рд┐рдкреНрдЯрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВ, рдЬрдм рдореИрдВ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рддреЛ рдореИрдВрдиреЗ рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рдХреЛ рдореВрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рд╡рд╛рдкрд╕ рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛, рдЙрд╕ рдкрд░ рдореЛрдЬрд╝рд┐рд▓рд╛ рд░рд┐рдХреЙрд░реНрдб-рд░реАрдкреНрд▓реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛... рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрдВрдд рдореЗрдВ рдореБрдЭреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрд╛рдд рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ: рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП, рдП struct TranslationBlock рдЗрд╕рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде. рдЕрдВрджрд╛рдЬрд╝рд╛ рд▓рдЧрд╛рдУ рдХрд┐ рдХрд╣рд╛рдБ... рдпрд╣ рд╕рд╣реА рд╣реИ, рдмрдлрд╝рд░ рдореЗрдВ рдмреНрд▓реЙрдХ рдХреЗ рдареАрдХ рдкрд╣рд▓реЗред рдЗрд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдмреИрд╕рд╛рдЦреА (рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдмрд╕ рдЬрд╛рджреБрдИ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджрд┐рдпрд╛, рдФрд░ рд╢реЗрд╖ рд╢рдмреНрджреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ struct TranslationBlock, рдПрдХ рдПрдХрд▓ рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдмрдирд╛рдирд╛ рдЬрд┐рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХреИрд╢ рд░реАрд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░ рддреБрд░рдВрдд рдЯреНрд░реИрд╡рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдореЗрдореЛрд░реА рдХреЛ рдЦрд╛рд▓реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреБрдЫ рдмреИрд╕рд╛рдЦрд┐рдпрд╛рдБ рдмрдиреА рд╣реБрдИ рд╣реИрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдмрдлрд░ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдкреЙрдЗрдВрдЯрд░реНрд╕ - рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдмрд╕ рд╣реИрдВ BinaryenExpressionRef, рдЕрд░реНрдерд╛рддреН, рд╡реЗ рдЙрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЙрддреНрдкрдиреНрди рдореВрд▓ рдмреНрд▓реЙрдХ рдореЗрдВ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рднрд╛рдЧ рдмреАрдмреА рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИ, рднрд╛рдЧ рд╡рд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЬрд╛рдирд╛ рд╣реИред рдЦреИрд░, рд░реАрд▓реВрдкрд░ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рдмреНрд▓реЙрдХ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╢рд░реНрддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕рднреА рдХрдо рд╕реЗ рдХрдо рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░реЗрдЦрд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд▓реЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреЛ рдмрд┐рдЯреНрд╕ рдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдмрд╕ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд╡реИрд╕реЗ, рдЯреАрд╕реАрдЬреА рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП QEMU рдореЗрдВ рдРрд╕реЗ рд▓реЗрдмрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдмрд╛рдЗрдирд░реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

WebAssembly рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдПрдХ рдмреЙрдбреА рд╣реЛрддреА рд╣реИ, рдЬреЛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдПрдХрд╛рддреНрдордХ рдФрд░ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╕рдВрдЪрд╛рд▓рди рд╣реИрдВ, рдЕрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА, рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЖрджрд┐ рд╕реЗ рдпреБрдХреНрдд рдмреНрд▓реЙрдХред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛, рдпрд╣рд╛рдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╢рд╛рдЦрд╛рдУрдВ, рд▓реВрдк, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЖрджрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рддрд░реНрдХ рд╕реНрдЯреИрдХ рдкрд░ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдЬреЗрдПрд╕ рдХреА рддрд░рд╣ред рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рднреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛ред

рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рднреА рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рд╢реВрдиреНрдп рд╕реЗ рдХреНрд░рдорд╛рдВрдХрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдкреНрд░рдХрд╛рд░: int32 / int64 / рдлрд╝реНрд▓реЛрдЯ / рдбрдмрд▓ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд╣рд▓реЗ n рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рддрд░реНрдХ рд╣реИрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджреНрдпрдкрд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рдореНрди-рд╕реНрддрд░ рдХрд╛ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ "рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд/рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд" рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ: рд╕рдВрдЦреНрдпрд╛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИ рдпрд╣ рдСрдкрд░реЗрд╢рди рдХреЛрдб рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдмрд╛рдЗрдирд░реАрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рд╕рд░рд▓ рд╕реА-рдПрдкреАрдЖрдИ: рдЖрдк рдПрдХ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрдирд╛рдПрдБ - рдпреВрдирд░реА, рдмрд╛рдЗрдирд░реА, рдЕрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдмреНрд▓реЙрдХ, рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣, рдЖрджрд┐ред рдлрд┐рд░ рдЖрдк рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЙрд╕рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдХрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдореЗрд░реА рддрд░рд╣ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╕рдВрдХреНрд░рдордг рдЧреНрд░рд╛рдлрд╝ рд╣реИ, рддреЛ рд░реАрд▓реВрдкрд░ рдШрдЯрдХ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдЧрд╛ред рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБ, рдХрд┐рд╕реА рдмреНрд▓реЙрдХ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рддрдм рддрдХ рд╕рдВрднрд╡ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдмреНрд▓реЙрдХ рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ - рдЕрд░реНрдерд╛рдд, рдЖрдВрддрд░рд┐рдХ рддреЗрдЬрд╝ рдкрде / рдзреАрдорд╛ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЯреАрдПрд▓рдмреА рдХреИрд╢ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдкрде рд╢рд╛рдЦрд╛рдХрд░рдг, рд▓реЗрдХрд┐рди "рдмрд╛рд╣рд░реА" рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдЬрдм рдЖрдк рдПрдХ рд░реАрд▓реВрдкрд░ рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕рдХреЗ рдмреНрд▓реЙрдХ рдореБрдХреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ; рдЬрдм рдЖрдк рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ, рдлрд╝рдВрдХреНрд╢рди рдЖрджрд┐ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЕрдЦрд╛рдбрд╝рд╛.

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рджреБрднрд╛рд╖рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рд▓реЛрдкрди рдХреЗ рдмрд┐рдирд╛ рддреБрд░рдВрдд рдХреЛрдб рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рддрд░реНрдХ рдХреЛ 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);

...рдЕрдЧрд░ рдореИрдВ рдХреБрдЫ рднреВрд▓ рдЧрдпрд╛, рддреЛ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдкреИрдорд╛рдиреЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рд╡рд┐рд╡рд░рдг рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╣реИрдВред

рдФрд░ рдЕрдм рдХреНрд░реИрдХ-рдлреЗрдХреНрд╕-рдкреЗрдХреНрд╕ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

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 рдореЙрдбреНрдпреВрд▓ рдХреЗ рдПрдХ рд╣рдЬрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЛрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХреА рдПрдХ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдЖрд╡рдВрдЯрд┐рдд рдХреА...

рдЕрднреА рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рд╣реАред рдпрджрд┐ рдХрд┐рд╕реА рдХреА рд░реБрдЪрд┐ рд╣реЛ рддреЛ рд╢рд╛рдпрдж рдПрдХ рдФрд░ рд▓реЗрдЦ рд╣реЛрдЧрд╛ред рдЕрд░реНрдерд╛рддреН, рдХрдо рд╕реЗ рдХрдо рд╡рд╣рд╛рдБ рд░рд╣рддрд╛ рд╣реИ рдХреЗрд╡рд▓ рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдХрд╛рд░реНрдпрд╢реАрд▓ рдмрдирд╛рдПрдВред WebAssembly рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдВрдХрд▓рди рдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдмрдирд╛рдирд╛ рднреА рдЙрдЪрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ JS рджреБрдирд┐рдпрд╛ рдореЗрдВ рдкреНрд░рдерд╛рдЧрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрднреА рднреА рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╣реИ рдЬреЛ рдореВрд▓ рдореЙрдбреНрдпреВрд▓ рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рддрдХ рдпрд╣ рд╕рдм рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ рдПрдХ рдкрд╣реЗрд▓реА: рдЖрдкрдиреЗ 32-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдПрдХ рдмрд╛рдЗрдирд░реА рд╕рдВрдХрд▓рд┐рдд рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб, рдореЗрдореЛрд░реА рдСрдкрд░реЗрд╢рдВрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдмрд╛рдЗрдирд░реАрди рд╕реЗ рдЪрдврд╝рддрд╛ рд╣реИ, рдХрд╣реАрдВ рд╕реНрдЯреИрдХ рдкрд░, рдпрд╛ рдХрд╣реАрдВ рдФрд░ 2-рдмрд┐рдЯ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХреЗ рдКрдкрд░реА 32 рдЬреАрдмреА рдореЗрдВред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдмрд╛рдЗрдирд░реАрди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдпрд╣ рдмрд╣реБрдд рдмрдбрд╝реЗ рдкрд░рд┐рдгрд╛рдореА рдкрддреЗ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ?

рдПрдбрдорд┐рди рдХреЗ рддрд░реАрдХреЗ рд╕реЗ

рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдерд╛ рдХрд┐ "рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ 32-рдмрд┐рдЯ рд▓рд┐рдирдХреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВрдВ?" рдлрд┐рд░ рдкрддрд╛ рд╕реНрдерд╛рди рдХрд╛ рдКрдкрд░реА рднрд╛рдЧ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХрдорд╛рддреНрд░ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рддрдирд╛ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: 1 рдпрд╛ 2 рдЬреАрдмреАред

рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рддрд░реАрдХреЗ рд╕реЗ (рдЕрднреНрдпрд╛рд╕рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк)

рдЖрдЗрдП рдкрддрд╛ рд╕реНрдерд╛рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдмреБрд▓рдмреБрд▓рд╛ рдЙрдбрд╝рд╛рдПрдБред рдореИрдВ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╣рд╛рдВ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдкрд╣рд▓реЗ рд╣реА рд╡рд╣рд╛рдБ рдПрдХ рдвреЗрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП. рд▓реЗрдХрд┐рди "рд╣рдо рдЕрднреНрдпрд╛рд╕реА рд╣реИрдВ: рд╕рдм рдХреБрдЫ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреНрдпреЛрдВ..."

// 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));
}

... рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд▓рдЧреНрд░рд┐рдВрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд╛рд▓рдЧреНрд░рд┐рдВрдб рд╕реНрд╡рдпрдВ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╕рднреА рдХреЛ рд╡рд╣рд╛рдВ рд╕реЗ рдмрд╛рд╣рд░ рдзрдХреЗрд▓ рджреЗрддрд╛ рд╣реИ :)

рд╢рд╛рдпрдж рдХреЛрдИ рдмреЗрд╣рддрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдЧрд╛ рдХрд┐ рдореЗрд░рд╛ рдпрд╣ рдХреЛрдб рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ...

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ