QEMU.js: рдЖрддрд╛ рдЧрдВрднреАрд░ рдЖрдгрд┐ WASM рд╕рд╣

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

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

QEMU рд▓рд╛ JavaScript рд╡рд░ "рдХрд╕реЗ рддрд░реА" рдХрд╕реЗ рдкреЛрд░реНрдЯ рдХрд░рд╛рдпрдЪреЗ рд╣реЗ рдореА рдЖрдзреАрдЪ рд╢рд┐рдХрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдпрд╛рд╡реЗрд│реА рддреЗ рд╢рд╣рд╛рдгрдкрдгрд╛рдиреЗ рдХрд░рд╛рдпрдЪреЗ рдЖрдгрд┐ рдЬреБрдиреНрдпрд╛ рдЪреБрдХрд╛ рдкреБрдиреНрд╣рд╛ рди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛.

рддреНрд░реБрдЯреА рдХреНрд░рдорд╛рдВрдХ рдПрдХ: рдмрд┐рдВрджреВ рдкреНрд░рдХрд╛рд╢рди рдкрд╛рд╕реВрди рд╢рд╛рдЦрд╛

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

рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдореА рдард░рд╡рд▓реЗ рдЖрд╣реЗ рдХреА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдлреЗрдХреВрди рджреЗрдгреЗ, рднрд╛рдЧрд╛рдВрд╕рд╛рдареА рддреЗ рд╡реЗрдЧрд│реЗ рдХрд░рдгреЗ рдЖрдгрд┐ рдирд╡реАрди рдЖрд╡реГрддреНрддреАрдЪреНрдпрд╛ рдЖрдзрд╛рд░реЗ рдирд╡реАрди рдЖрд╡реГрддреНрддреА рддрдпрд╛рд░ рдХрд░рдгреЗ рдЕрдЬреВрдирд╣реА рдЕрд░реНрдердкреВрд░реНрдг рдЖрд╣реЗ. master.

рдЪреВрдХ рдХреНрд░рдорд╛рдВрдХ рджреЛрди: TLP рдкрджреНрдзрдд

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

рдЪреВрдХ рдХреНрд░рдорд╛рдВрдХ рддреАрди: рдлреЛрд░реНрдб рдирдХрд│рдд рдкрд╛рдгреНрдпрд╛рдд рдЙрддрд░рдгреЗ

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

рддреНрдпрд╛рдВрдиреА рдпреЗрдКрди рд▓рд╛рде рдорд╛рд░рд▓реА

рдореА рдЬреБрд▓реИрдордзреНрдпреЗ рдХреЛрдб рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕ рд╕реБрд░реБрд╡рд╛рдд рдХреЗрд▓реА рдЕрд╕рд▓реА рддрд░реА, рдПрдХ рдЬрд╛рджреВрдИ рдХрд┐рдХ рдХреЛрдгрд╛рдЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдЖрд▓реЗ рдирд╛рд╣реА: рд╕рд╣рд╕рд╛ GitHub рдХрдбреВрди рдкрддреНрд░реЗ рдЗрд╢реНрдпреВрдЬ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреНрдпрд╛ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдВрдмрджреНрджрд▓ рд╕реВрдЪрдирд╛ рдореНрд╣рдгреВрди рдпреЗрддрд╛рдд, рдкрд░рдВрддреБ рдпреЗрдереЗ, рдЕрдЪрд╛рдирдХ рдзрд╛рдЧреНрдпрд╛рдд рдЙрд▓реНрд▓реЗрдЦ qemu рдмреЕрдХрдПрдВрдб рдореНрд╣рдгреВрди Binaryen рд╕рдВрджрд░реНрднрд╛рдд, "рддреНрдпрд╛рдиреЗ рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рдХреЗрд▓реЗ, рдХрджрд╛рдЪрд┐рдд рддреЛ рдХрд╛рд╣реАрддрд░реА рдмреЛрд▓реЗрд▓." рдЖрдореНрд╣реА Emscripten рдЪреНрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рд▓рд╛рдпрдмреНрд░рд░реА рд╡рд╛рдкрд░рдгреНрдпрд╛рдмрджреНрджрд▓ рдмреЛрд▓рдд рд╣реЛрддреЛ рдмрд╛рдпрдирд░реЗрди WASM JIT рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА. рдмрд░рдВ, рдореА рдореНрд╣рдЯрд▓рдВ рдХреА рддреБрдордЪреНрдпрд╛рдХрдбреЗ Apache 2.0 рд▓рд╛рдпрд╕рдиреНрд╕ рдЖрд╣реЗ рдЖрдгрд┐ QEMU рд╕рдВрдкреВрд░реНрдгрдкрдгреЗ GPLv2 рдЕрдВрддрд░реНрдЧрдд рд╡рд┐рддрд░реАрдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рдлрд╛рд░рд╕реЗ рд╕реБрд╕рдВрдЧрдд рдирд╛рд╣реАрдд. рдЕрдЪрд╛рдирдХ рдЕрд╕реЗ рджрд┐рд╕реВрди рдЖрд▓реЗ рдХреА рдкрд░рд╡рд╛рдирд╛ рдЕрд╕реВ рд╢рдХрддреЛ рддреЗ рдХрд╕реЗ рддрд░реА рджреБрд░реБрд╕реНрдд рдХрд░рд╛ (рдорд▓рд╛ рдорд╛рд╣рд┐рдд рдирд╛рд╣реА: рдХрджрд╛рдЪрд┐рдд рддреЗ рдмрджрд▓рд╛, рдХрджрд╛рдЪрд┐рдд рджреБрд╣реЗрд░реА рдкрд░рд╡рд╛рдирд╛, рдХрджрд╛рдЪрд┐рдд рджреБрд╕рд░реЗ рдХрд╛рд╣реАрддрд░реА...). рдпрд╛рдореБрд│реЗ рдорд▓рд╛ рдирдХреНрдХреАрдЪ рдЖрдирдВрдж рдЭрд╛рд▓рд╛, рдХрд╛рд░рдг рддреЛрдкрд░реНрдпрдВрдд рдореА рдЖрдзреАрдЪ рдЬрд╡рд│реВрди рдкрд╛рд╣рд┐рд▓реЗ рд╣реЛрддреЗ рдмрд╛рдпрдирд░реА рд╕реНрд╡рд░реВрдк WebAssembly, рдЖрдгрд┐ рдореА рдХрд╕рд╛ рддрд░реА рджреБрдГрдЦреА рдЖрдгрд┐ рдЕрдирд╛рдХрд▓рдиреАрдп рд╣реЛрддреЛ. рдПрдХ рд▓рд╛рдпрдмреНрд░рд░реА рджреЗрдЦреАрд▓ рд╣реЛрддреА рдЬреА рд╕рдВрдХреНрд░рдордг рдЖрд▓реЗрдЦрд╛рд╕рд╣ рдореВрд▓рднреВрдд рдмреНрд▓реЙрдХреНрд╕ рдЦрд╛рдКрди рдЯрд╛рдХреЗрд▓, рдмрд╛рдпрдХреЛрдб рддрдпрд╛рд░ рдХрд░реЗрд▓ рдЖрдгрд┐ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕ рддреЗ рдЗрдВрдЯрд░рдкреНрд░рд┐рдЯрд░рдордзреНрдпреЗ рджреЗрдЦреАрд▓ рдЪрд╛рд▓рд╡реЗрд▓.

рдордЧ рдЖрдгрдЦреА рдХрд╛рд╣реА рд╣реЛрддреЗ рдПрдХ рдкрддреНрд░ QEMU рдореЗрд▓рд┐рдВрдЧ рд▓рд┐рд╕реНрдЯрд╡рд░, рдкрд░рдВрддреБ рд╣рд╛ рдкреНрд░рд╢реНрди рдЕрдзрд┐рдХ рдЖрд╣реЗ, "рддрд░реАрд╣реА рддреНрдпрд╛рдЪреА рдХреЛрдгрд╛рд▓рд╛ рдЧрд░рдЬ рдЖрд╣реЗ?" рдЖрдгрд┐ рдЖрд╣реЗ рдЕрдЪрд╛рдирдХ, рддреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ рдмрд╛рд╣реЗрд░ рд╡рд│рд▓реЗ. рдХрдореАрдд рдХрдореА, рддреБрдореНрд╣реА рд╡рд╛рдкрд░рд╛рдЪреНрдпрд╛ рдЦрд╛рд▓реАрд▓ рд╢рдХреНрдпрддрд╛ рдПрдХрддреНрд░рд┐рддрдкрдгреЗ рд╕реНрдХреНрд░реЕрдк рдХрд░реВ рд╢рдХрддрд╛, рдЬрд░ рддреЗ рдХрдореА-рдЕрдзрд┐рдХ рд╡реЗрдЧрд╛рдиреЗ рдХрд╛рдо рдХрд░рдд рдЕрд╕реЗрд▓:

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

рдмреНрд░рд╛рдЙрдЭрд░ рд░рдирдЯрд╛рдЗрдо рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ

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

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

рдпрд╛рдХреНрд╖рдгреА, рдореА рдЕрджреНрдпрд╛рдк WASM рдордзреНрдпреЗ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЖрдгрд┐ рдПрдореНрдЯрд░рдкреНрд░реАрдЯрд░ рд╡рд╛рдкрд░реВрди рднрд╛рд╖рд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХреЛрдбрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдгреНрдпрд╛рдд рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗрд▓реЗ рдирд╛рд╣реА, рдореНрд╣рдгреВрди рдмреНрд▓реЙрдХ рдбрд┐рд╡реНрд╣рд╛рдЗрд╕реЗрд╕ рдЕрджреНрдпрд╛рдк рдХрд╛рд░реНрдп рдХрд░рдд рдирд╛рд╣реАрдд (рдкреБрдвреАрд▓ рдорд╛рд▓рд┐рдХреЗрдд рдкрд╣рд╛, рдЬрд╕реЗ рддреЗ рдореНрд╣рдгрддрд╛рдд ...). рдореНрд╣рдгрдЬреЗрдЪ, рд╢реЗрд╡рдЯреА рддреБрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рдордЬреЗрджрд╛рд░ рд╕реНрддрд░рд┐рдд рдЧреЛрд╖реНрдЯреАрд╕рд╛рд░рдЦреЗ рдХрд╛рд╣реАрддрд░реА рдорд┐рд│рд╛рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ:

  • рдЕрд░реНрде рд▓рд╛рд╡рд▓реЗрд▓рд╛ рдмреНрд▓реЙрдХ I/O. рдмрд░рдВ, рддреБрдореНрд╣рд╛рд▓рд╛ рдЦрд░рдВрдЪ рдиреЗрдЯрд┐рд╡реНрд╣ рдкрд░рдлреЙрд░реНрдордиреНрд╕рд╕рд╣ рдЕрдиреБрдХрд░рдг NVMe рдЪреА рдЕрдкреЗрдХреНрд╖рд╛ рд╣реЛрддреА рдХрд╛? ЁЯЩВ
  • рд╕реНрдерд┐рд░рдкрдгреЗ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реЗрд▓рд╛ рдореБрдЦреНрдп QEMU рдХреЛрдб (рдЕрдиреБрд╡рд╛рджрдХ, рдЗрддрд░ рдЕрдиреБрдХрд░рдг рдХреЗрд▓реЗрд▓реА рдЙрдкрдХрд░рдгреЗ рдЗ.)
  • рдбрд╛рдпрдиреЕрдорд┐рдХрд▓реА рдЧреЗрд╕реНрдЯ рдХреЛрдб WASM рдордзреНрдпреЗ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓рд╛

QEMU рд╕реНрддреНрд░реЛрддрд╛рдВрдЪреА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ

рдЬрд╕реЗ рддреБрдореНрд╣реА рдЖрдзреАрдЪ рдЕрдВрджрд╛рдЬ рд▓рд╛рд╡рд▓рд╛ рдЕрд╕реЗрд▓, рдЕрддрд┐рдереА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдЪреЗ рдЕрдиреБрдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЛрдб рдЖрдгрд┐ рд╣реЛрд╕реНрдЯ рдорд╢реАрди рд╕реВрдЪрдирд╛ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЛрдб QEMU рдордзреНрдпреЗ рд╡реЗрдЧрд│реЗ рдХреЗрд▓реЗ рдЖрд╣реЗрдд. рдЦрд░рдВ рддрд░, рд╣реЗ рдереЛрдбреЗ рдЕрд╡рдШрдб рдЖрд╣реЗ:

  • рдЕрддрд┐рдереА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрд╣реЗрдд
  • рдЖрд╣реЗ рдкреНрд░рд╡реЗрдЧрдХ, рдореНрд╣рдгрдЬреЗ, Linux рд╡рд░ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░ рд╡рд░реНрдЪреНрдпреБрдЕрд▓рд╛рдпрдЭреЗрд╢рдирд╕рд╛рдареА KVM (рдПрдХрдореЗрдХрд╛рдВрд╢реА рд╕реБрд╕рдВрдЧрдд рдЕрддрд┐рдереА рдЖрдгрд┐ рд╣реЛрд╕реНрдЯ рд╕рд┐рд╕реНрдЯрдорд╕рд╛рдареА), рдХреБрдареЗрд╣реА JIT рдХреЛрдб рдирд┐рд░реНрдорд┐рддреАрд╕рд╛рдареА TCG. QEMU 2.9 рд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░реВрди, Windows рд╡рд░ HAXM рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░ рд╡рд░реНрдЪреНрдпреБрдЕрд▓рд╛рдпрдЭреЗрд╢рди рдорд╛рдирдХрд╛рд╕рд╛рдареА рд╕рдорд░реНрдерди рджрд┐рд╕реВ рд▓рд╛рдЧрд▓реЗ (рддрдкрд╢реАрд▓)
  • рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░ рд╡рд░реНрдЪреНрдпреБрдЕрд▓рд╛рдпрдЭреЗрд╢рди рдирд╕реВрди TCG рд╡рд╛рдкрд░рд▓реЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рдкреНрд░рддреНрдпреЗрдХ рд╣реЛрд╕реНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╕рд╛рдареА рддрд╕реЗрдЪ рдпреБрдирд┐рд╡реНрд╣рд░реНрд╕рд▓ рдЗрдВрдЯрд░рдкреНрд░рд┐рдЯрд░рд╕рд╛рдареА рд╕реНрд╡рддрдВрддреНрд░ рдХреЛрдб рдЬрдирд░реЗрд╢рди рд╕рдкреЛрд░реНрдЯ рдЖрд╣реЗ.
  • ... рдЖрдгрд┐ рдпрд╛ рд╕рд░реНрд╡рд╛рдВрднреЛрд╡рддреА - рдЕрдиреБрдХрд░рдг рдХреЗрд▓реЗрд▓реЗ рдкреЗрд░рд┐рдлреЗрд░рд▓реНрд╕, рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕, рд╕реНрдерд▓рд╛рдВрддрд░, рд░реЗрдХреЙрд░реНрдб-рд░реАрдкреНрд▓реЗ рдЗ.

рддрд╕реЗ, рддреБрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ рдХрд╛: QEMU рдХреЗрд╡рд│ рд╕рдВрдкреВрд░реНрдг рд╕рдВрдЧрдгрдХрд╛рдЪреЗрдЪ рдЕрдиреБрдХрд░рдг рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА, рддрд░ рд╣реЛрд╕реНрдЯ рдХрд░реНрдирд▓рдордзреАрд▓ рд╡реЗрдЧрд│реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕рд╛рдареА рдкреНрд░реЛрд╕реЗрд╕рд░рдЪреЗ рджреЗрдЦреАрд▓ рдЕрдиреБрдХрд░рдг рдХрд░реВ рд╢рдХрддреЗ, рдЬреНрдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдмрд╛рдпрдирд░реА рдЗрдиреНрд╕реНрдЯреНрд░реБрдореЗрдВрдЯреЗрд╢рдирд╕рд╛рдареА AFL рдлрдЬрд░рджреНрд╡рд╛рд░реЗ. рдХрджрд╛рдЪрд┐рдд рдХреЛрдгреАрддрд░реА QEMU рдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирдЪрд╛ рд╣рд╛ рдореЛрдб JS рд╡рд░ рдкреЛрд░реНрдЯ рдХрд░реВ рдЗрдЪреНрдЫрд┐рдд рдЕрд╕реЗрд▓? ЁЯШЙ

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

рд╡реЗрдмрдЕрд╕реЙрдмрд▓

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

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

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

TCG (рд▓рд╣рд╛рди рдХреЛрдб рдЬрдирд░реЗрдЯрд░)

рдЯреАрд╕реАрдЬреА рдореВрд▓рддрдГ рд╣реЛрддреЗ C рдХрдВрдкрд╛рдЗрд▓рд░рд╕рд╛рдареА рдмреЕрдХрдПрдВрдб. рдирдВрддрд░, рд╡рд░рд╡рд░ рдкрд╛рд╣рддрд╛, рддреЗ GCC рдмрд░реЛрдмрд░рдЪреНрдпрд╛ рд╕реНрдкрд░реНрдзреЗрд▓рд╛ рддреЛрдВрдб рджреЗрдК рд╢рдХрд▓реЗ рдирд╛рд╣реА, рдкрд░рдВрддреБ рд╢реЗрд╡рдЯреА рд╣реЛрд╕реНрдЯ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╕рд╛рдареА рдХреЛрдб рдЬрдирд░реЗрд╢рди рдпрдВрддреНрд░рдгрд╛ рдореНрд╣рдгреВрди QEMU рдордзреНрдпреЗ рддреНрдпрд╛рдЪреЗ рд╕реНрдерд╛рди рдорд┐рд│рд╛рд▓реЗ. рдПрдХ 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-s:

  • рд▓рдХреНрд╖реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╡рд░ рдХрд┐рддреА рд░рдЬрд┐рд╕реНрдЯрд░реНрд╕ рдЖрдгрд┐ рдХрд┐рддреА рд░реБрдВрджреА рдЖрд╣реЗрдд (рдЖрдореНрд╣рд╛рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ рддрд┐рддрдХреЗ рдЖрд╣реЗрдд, рдЖрдореНрд╣рд╛рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ рддрд┐рддрдХреЗ - "рдкреВрд░реНрдгрдкрдгреЗ рд▓рдХреНрд╖реНрдп" рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╡рд░ рдмреНрд░рд╛рдЙрдЭрд░рджреНрд╡рд╛рд░реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдо рдХреЛрдбрдордзреНрдпреЗ рдХрд╛рдп рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рдпрд╛рдмрджреНрджрд▓ рдкреНрд░рд╢реНрди рдЕрдзрд┐рдХ рдЖрд╣реЗ. ...)
  • рдпрдЬрдорд╛рди рд╕реВрдЪрдирд╛рдВрдЪреЗ рд╕рдВрд░реЗрдЦрди: x86 рд╡рд░, рдЖрдгрд┐ рдЕрдЧрджреА TCI рдордзреНрдпреЗрд╣реА, рд╕реВрдЪрдирд╛ рдЕрдЬрд┐рдмрд╛рдд рд╕рдВрд░реЗрдЦрд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдд рдирд╛рд╣реАрдд, рдкрд░рдВрддреБ рдореА рдХреЛрдб рдмрдлрд░рдордзреНрдпреЗ рдЕрдЬрд┐рдмрд╛рдд рд╕реВрдЪрдирд╛ рджреЗрдгрд╛рд░ рдирд╛рд╣реА, рдкрд░рдВрддреБ Binaryen рд▓рд╛рдпрдмреНрд░рд░реА рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕рдХрдбреЗ рдкреЙрдЗрдВрдЯрд░ рдареЗрд╡рдгрд╛рд░ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдореА рдореНрд╣рдгреЗрди: 4 рдмрд╛рдЗрдЯреНрд╕
  • рдмреЕрдХрдПрдВрдб рдХреЛрдгрддреНрдпрд╛ рдкрд░реНрдпрд╛рдпреА рд╕реВрдЪрдирд╛ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░реВ рд╢рдХрддреЛ - рдЖрдореНрд╣реА рдмрд╛рдпрдирд░реАрдирдордзреНрдпреЗ рд╕рд╛рдкрдбрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯреАрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдХрд░рддреЛ, рдПрдХреНрд╕реАрд▓рд░реЗрдЯрд░рд▓рд╛ рдмрд╛рдХреАрдЪреНрдпрд╛ рд╕реЛрдкреНрдпрд╛ рд╕реВрдЪрдирд╛рдВрдордзреНрдпреЗ рдореЛрдбреВ рджреНрдпрд╛
  • рдмреЕрдХрдПрдВрдбрдиреЗ рд╡рд┐рдирдВрддреА рдХреЗрд▓реЗрд▓реНрдпрд╛ TLB рдХреЕрд╢реЗрдЪрд╛ рдЕрдВрджрд╛рдЬреЗ рдЖрдХрд╛рд░ рдХрд┐рддреА рдЖрд╣реЗ. рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ рдХреА QEMU рдордзреНрдпреЗ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЧрдВрднреАрд░ рдЖрд╣реЗ: рдЬрд░реА рдХрд╛рд╣реА рд╣реЗрд▓реНрдкрд░ рдлрдВрдХреНрд╢рдиреНрд╕ рдЖрд╣реЗрдд рдЬреЗ рдЕрддрд┐рдереА MMU (рдЖрддрд╛ рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп рдХреЛрдареЗ рдЕрд╕рддреАрд▓?) рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрдКрди рд▓реЛрдб/рд╕реНрдЯреЛрдЕрд░ рдХрд░рддрд╛рдд, рддрд░реА рддреЗ рддреНрдпрд╛рдВрдЪреЗ рднрд╛рд╖рд╛рдВрддрд░ рдХреЕрд╢реЗ рдПрдХрд╛ рд╕рдВрд░рдЪрдиреЗрдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдЬрддрди рдХрд░рддрд╛рдд, рдЬреНрдпрд╛рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдереЗрдЯ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯ рдмреНрд▓реЙрдХреНрд╕рдордзреНрдпреЗ рдПрдореНрдмреЗрдб рдХрд░рдгреЗ рд╕реЛрдпреАрд╕реНрдХрд░ рдЖрд╣реЗ. рдкреНрд░рд╢реНрди рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА, рдпрд╛ рд╕рдВрд░рдЪрдиреЗрддреАрд▓ рдХреЛрдгрддреНрдпрд╛ рдСрдлрд╕реЗрдЯрд╡рд░ рдЖрдЬреНрдЮрд╛рдВрдЪреНрдпрд╛ рд▓рд╣рд╛рди рдЖрдгрд┐ рдЬрд▓рдж рдХреНрд░рдорд╛рдиреЗ рд╕рд░реНрд╡рд╛рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реА рдЬрд╛рддреЗ?
  • рдпреЗрдереЗ рддреБрдореНрд╣реА рдПрдХ рдХрд┐рдВрд╡рд╛ рджреЛрди рдЖрд░рдХреНрд╖рд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░реНрд╕рдЪреНрдпрд╛ рдЙрджреНрджреЗрд╢рд╛рдд рдмрджрд▓ рдХрд░реВ рд╢рдХрддрд╛, рдлрдВрдХреНрд╢рдирджреНрд╡рд╛рд░реЗ рдЯреАрдмреА рдХреЙрд▓ рдХрд░рдгреЗ рд╕рдХреНрд╖рдо рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХрд░рд┐рддреНрдпрд╛ рдХрд╛рд╣реА рд▓рд╣рд╛рди рдЧреЛрд╖реНрдЯреАрдВрдЪреЗ рд╡рд░реНрдгрди рдХрд░реВ рд╢рдХрддрд╛. inline-рд╕рд╛рд░рдЦреА рдХрд╛рд░реНрдпреЗ flush_icache_range (рдкрд░рдВрддреБ рд╣реЗ рдЖрдордЪреЗ рдкреНрд░рдХрд░рдг рдирд╛рд╣реА)

рдлрд╛рдЗрд▓ tcg-target.inc.c, рдЕрд░реНрдерд╛рддрдЪ, рд╕рд╣рд╕рд╛ рдЖрдХрд╛рд░рд╛рдиреЗ рдЦреВрдк рдореЛрдард╛ рдЕрд╕рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдд рдЕрдиреЗрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд╛рд░реНрдпреЗ рдЕрд╕рддрд╛рдд:

  • рдХреЛрдгрддреНрдпрд╛ рд╕реВрдЪрдирд╛ рдХреЛрдгрддреНрдпрд╛ рдСрдкрд░реЗрдВрдбрд╡рд░ рдХрд╛рд░реНрдп рдХрд░реВ рд╢рдХрддрд╛рдд рдпрд╛рд╡рд░ рдирд┐рд░реНрдмрдВрдзрд╛рдВрд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреЗ. рджреБрд╕рд░реНтАНрдпрд╛ рдмреЕрдХрдПрдВрдбрд╡рд░реВрди рдореА рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдХреЙрдкреА рдХреЗрд▓реА рдЖрд╣реЗ
  • рдлрдВрдХреНрд╢рди рдЬреЗ рдПрдХ рдЕрдВрддрд░реНрдЧрдд рдмрд╛рдЗрдЯрдХреЛрдб рд╕реВрдЪрдирд╛ рдШреЗрддреЗ
  • рддреБрдореНрд╣реА рдпреЗрдереЗ рд╕рд╣рд╛рдпреНрдпрдХ рдлрдВрдХреНрд╢рдиреНрд╕ рджреЗрдЦреАрд▓ рдареЗрд╡реВ рд╢рдХрддрд╛, рдЖрдгрд┐ рддреБрдореНрд╣реА рд╕реНрдЯреЕрдЯрд┐рдХ рдлрдВрдХреНрд╢рдиреНрд╕ рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛ tcg/tcg.c

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

рдЕрднрд┐рдЬрд╛рдд рд╢рдмреНрджрд╛рдВрдЪрд╛ рдЕрд░реНрде рд╕рд╛рдВрдЧрдгреНрдпрд╛рд╕рд╛рдареА, "рдХреНрд░рдЪ, рдкреНрд░реЛрдЬрд░рдЪреНрдпрд╛ рд╣реГрджрдпрд╛рд╕рд╛рдареА рдпрд╛ рдЖрд╡рд╛рдЬрд╛рдд рдХрд┐рддреА рдЧреБрдВрдлрд▓реЗрд▓реЗ рдЖрд╣реЗ..." рдорд╛рддреНрд░, рд╕реНрдореГрддреА рдХреБрдареЗрддрд░реА рдЧрд│рдд рд╣реЛрддреА. рд╢рд┐рд╡рд╛рдп, рддреА QEMU рджреНрд╡рд╛рд░реЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдореЗрдорд░реА рд╣реЛрддреА! рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рдПрдХ рдХреЛрдб рд╣реЛрддрд╛ рдХреА, рдкреБрдвреАрд▓ рд╕реВрдЪрдирд╛ рд▓рд┐рд╣рд┐рддрд╛рдирд╛ (рддрд╕реЗрдЪ, рдореНрд╣рдгрдЬреЗ рдПрдХ рдкреЙрдЗрдВрдЯрд░), рдЬреНрдпрд╛рдЪрд╛ рджреБрд╡рд╛ рдпрд╛ рдард┐рдХрд╛рдгреА рдкреВрд░реНрд╡реА рд╣реЛрддрд╛ рддреЛ рд╣рдЯрд╡рд┐рд▓рд╛, рдкрд░рдВрддреБ рдпрд╛рдЪрд╛ рдлрд╛рдпрджрд╛ рдЭрд╛рд▓рд╛ рдирд╛рд╣реА. рд╡рд╛рд╕реНрддрд╡рд┐рдХ, рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкреНрдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, QEMU рд╕реНрдЯрд╛рд░реНрдЯрдЕрдкрд╡рд░ рдореЗрдорд░реА рд╡рд╛рдЯрдк рдХрд░рддреЗ рдЖрдгрд┐ рддреЗрдереЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗрд▓рд╛ рдХреЛрдб рд▓рд┐рд╣рд┐рддреЛ. рдмрдлрд░ рд╕рдВрдкрд▓реНрдпрд╛рд╡рд░, рдХреЛрдб рдлреЗрдХреВрди рджрд┐рд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреА рдкреБрдвреАрд▓ рд▓рд┐рд╣рд┐рдгреЗ рд╕реБрд░реВ рд╣реЛрддреЗ.

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

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

Binaryen рд╡рд╛рдкрд░рдгреЗ

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

рдлрдВрдХреНрд╢рдиреНрд╕рдордзреНрдпреЗ рд╕реНрдерд╛рдирд┐рдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рджреЗрдЦреАрд▓ рдЕрд╕рддрд╛рдд, рд╢реВрдиреНрдп рдкрд╛рд╕реВрди рдХреНрд░рдорд╛рдВрдХрд┐рдд, рдкреНрд░рдХрд╛рд░: int32 / int64 / float / double. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдкреНрд░рдердо n рд▓реЛрдХрд▓ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╣реЗ рдлрдВрдХреНрд╢рдирд▓рд╛ рджрд┐рд▓реЗрд▓реЗ рд╡рд┐рддрд░реНрдХ рдЖрд╣реЗрдд. рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ рдХреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣рд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯреАрдиреЗ рдпреЗрдереЗ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдкреВрд░реНрдгрдкрдгреЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдирд╕рд▓реЗ рддрд░реА, рдкреВрд░реНрдгрд╛рдВрдХрд╛рдВрдордзреНрдпреЗ рдЕрдЬреВрдирд╣реА тАЬрд╕реНрд╡рд╛рдХреНрд╖рд░реА/рдЕрд╕реНрд╡рд╛рдХреНрд╖рд░рд┐рддтАЭ рдЧреБрдгрдзрд░реНрдо рдирд╕рддрд╛рдд: рд╕рдВрдЦреНрдпрд╛ рдХрд╢реА рд╡рд╛рдЧрддреЗ рддреЗ рдСрдкрд░реЗрд╢рди рдХреЛрдбрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ.

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

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

рддрд╕реЗ, рдбреЗрдореЛ (рд╕рдзреНрдпрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рдкрд░рд╡рд╛рдиреНрдпрд╛рд╕рд╣) рдлрдХреНрдд рдлрд╛рдпрд░рдлреЙрдХреНрд╕рдордзреНрдпреЗ рдЪрд╛рдВрдЧрд▓реЗ рдХрд╛рдо рдХрд░рддреЗ. Chrome рд╡рд┐рдХрд╛рд╕рдХ рд╣реЛрддреЗ рдХрд╕реЗ рддрд░реА рддрдпрд╛рд░ рдирд╛рд╣реА рдПрдЦрд╛рджреНрдпрд╛рд▓рд╛ WebAssembly рдореЙрдбреНрдпреБрд▓реНрд╕рдЪреА рд╣рдЬрд╛рд░рд╛рд╣реВрди рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдгреЗ рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪреА рдЖрд╣реЗрдд, рдореНрд╣рдгреВрди рддреНрдпрд╛рдВрдиреА рдкреНрд░рддреНрдпреЗрдХрд╛рд╕рд╛рдареА рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдЕреЕрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕рдЪрд╛ рдПрдХ рдЧрд┐рдЧрд╛рдмрд╛рдЗрдЯ рд╡рд╛рдЯрдк рдХреЗрд▓рд╛...

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

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

рдкреНрд░рд╢рд╛рд╕рдХрд╛рдЪреНрдпрд╛ рдорд╛рд░реНрдЧрд╛рдиреЗ

рдореА рдпрд╛рдЪреА рдЪрд╛рдЪрдгреА рдкреВрд░реНрдг рдХреЗрд▓реА рдирд╛рд╣реА, рдкрд░рдВрддреБ рдорд╛рдЭрд╛ рдкрд╣рд┐рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛрддрд╛ "рдореА 32-рдмрд┐рдЯ рд▓рд┐рдирдХреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рддрд░ рдХрд╛рдп?" рдордЧ рдЕреЕрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕рдЪрд╛ рд╡рд░рдЪрд╛ рднрд╛рдЧ рдХрд░реНрдирд▓рдиреЗ рд╡реНрдпрд╛рдкрд▓рд╛ рдЬрд╛рдИрд▓. рдлрдХреНрдд рдкреНрд░рд╢реНрди рдХрд┐рддреА рд╡реНрдпрд╛рдкрд▓рд╛ рдЬрд╛рдИрд▓: 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛