QEMU.js: рдЕрдм рдЧрдореНрднреАрд░ рд░ WASM рд╕рдБрдЧ

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

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

рдореИрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рдХрд╕рд░реА рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯрдорд╛ QEMU рдкреЛрд░реНрдЯ рдЧрд░реНрдиреЗ рднрдиреЗрд░ рд╕рд┐рдХреЗрдХреЛ рдерд┐рдПрдБ, рдпрд╕ рдкрдЯрдХ рдпреЛ рдмреБрджреНрдзрд┐рдорд╛рдиреАрдкреВрд░реНрд╡рдХ рдЧрд░реНрдиреЗ рд░ рдкреБрд░рд╛рдирд╛ рдЧрд▓реНрддреАрд╣рд░реВ рдирджреЛрд╣реЛрд░реНрдпрд╛рдЙрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░рд┐рдпреЛред

рддреНрд░реБрдЯрд┐ рдирдореНрдмрд░ рдПрдХ: рдмрд┐рдиреНрджреБ рд░рд┐рд▓реАрдЬрдмрд╛рдЯ рд╢рд╛рдЦрд╛

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

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдореИрд▓реЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗ рдХрд┐ рдпреЛ рдЕрдЭреИ рдкрдирд┐ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрд╛рд╣рд┐рд░ рдлреНрдпрд╛рдБрдХреНрдиреБ, рдпрд╕рд▓рд╛рдИ рднрд╛рдЧрд╣рд░реБ рдХреЛ рд▓рд╛рдЧреА рдЫреБрдЯреНрдпрд╛рдЙрди рд░ рд╕реНрдХреНрд░реНрдпрд╛рдЪ рджреЗрдЦрд┐ рдирдпрд╛рдБ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдЙрди рдХреЛ рд▓рд╛рдЧреА рдХреЗрд╣рд┐ рдирдпрд╛рдБ рд░ рдЕрдм рджреЗрдЦрд┐ рдХреЛ рдЖрдзрд╛рд░ рдорд╛ рдмрдирд╛рдЗрдиреНрдЫред master.

рдЧрд▓реНрддреА рдирдореНрдмрд░ рджреБрдИ: TLP рдкрджреНрдзрддрд┐

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

рдЧрд▓реНрддреА рдирдореНрдмрд░ рддреАрди: рдлреЛрд░реНрдбрд▓рд╛рдИ рдерд╛рд╣рд╛ рдирджрд┐рдИ рдкрд╛рдиреАрдорд╛ рдкрд╕реНрдиреБ

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

рдЖрдПрд░ рд▓рд╛рдд рд╣рд╛рдиреЗ

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

рддреНрдпрд╕рдкрдЫрд┐ рддреНрдпрд╣рд╛рдБ рдердк рдерд┐рдпреЛ рдПрдХ рдкрддреНрд░ QEMU рдореЗрд▓рд┐рдЩ рд╕реВрдЪреАрдорд╛, рддрд░ рдпреЛ рдкреНрд░рд╢реНрдирдХреЛ рдмрд╛рд░реЗрдорд╛ рдмрдвреА рд╣реЛ, "рдХрд╕рд▓рд╛рдИ рдЪрд╛рд╣рд┐рдиреНрдЫ?" рд░ рдпреЛ рдЫ рдЕрдЪрд╛рдирдХ, рдпреЛ рдЖрд╡рд╢реНрдпрдХ рдерд┐рдпреЛред рдХрдореНрддрд┐рдорд╛, рддрдкрд╛рдЗрдБ рдкреНрд░рдпреЛрдЧрдХреЛ рдирд┐рдореНрди рд╕рдореНрднрд╛рд╡рдирд╛рд╣рд░реВ рд╕рдБрдЧреИ рд╕реНрдХреНрд░реНрдпрд╛рдк рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдпрджрд┐ рдпрд╕рд▓реЗ рдХрдо рд╡рд╛ рдЫрд┐рдЯреЛ рдХрд╛рдо рдЧрд░реНрджрдЫ:

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

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

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

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

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

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

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

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

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

рдЦреИрд░, рдХреЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ: QEMU рд▓реЗ рд╕рдореНрдкреВрд░реНрдг рдХрдореНрдкреНрдпреВрдЯрд░ рдорд╛рддреНрд░ рдирдХреНрдХрд▓ рдЧрд░реНрди рд╕рдХреНрдЫ, рддрд░ рд╣реЛрд╕реНрдЯ рдХрд░реНрдиреЗрд▓рдорд╛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрдирд┐ рдЕрдиреБрдХрд░рдг рдЧрд░реНрди рд╕рдХреНрдЫ, рдЬреБрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдмрд╛рдЗрдирд░реА рдЙрдкрдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ AFL fuzzer рджреНрд╡рд╛рд░рд╛ред рд╕рд╛рдпрдж рдХрд╕реИрд▓реЗ JS рдорд╛ QEMU рдХреЛ рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рдпреЛ рдореЛрдб рдкреЛрд░реНрдЯ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫ? ЁЯШЙ

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

рд╡реЗрдм рдЕрд╕реЗрдВрдмрд▓реА

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

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

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

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

GTC рдореВрд▓ рд░реВрдкрдорд╛ рдерд┐рдпреЛ C рдХрдореНрдкрд╛рдЗрд▓рд░рдХреЛ рд▓рд╛рдЧрд┐ рдмреНрдпрд╛рдХрдПрдиреНрдбред рддреНрдпрд╕рдкрдЫрд┐, рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рдпрд╕рд▓реЗ GCC рд╕рдБрдЧ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛рд▓рд╛рдИ рд╕рд╛рдордирд╛ рдЧрд░реНрди рд╕рдХреЗрди, рддрд░ рдЕрдиреНрддрдорд╛ рдпрд╕рд▓реЗ рд╣реЛрд╕реНрдЯ рдкреНрд▓реЗрдЯрдлрд░реНрдордХреЛ рд▓рд╛рдЧрд┐ рдХреЛрдб рдЙрддреНрдкрд╛рджрди рд╕рдВрдпрдиреНрддреНрд░рдХреЛ рд░реВрдкрдорд╛ QEMU рдорд╛ рдЖрдлреНрдиреЛ рд╕реНрдерд╛рди рдлреЗрд▓рд╛ рдкрд╛рд░реНрдпреЛред рддреНрдпрд╣рд╛рдБ рдПрдХ TCG рдмреНрдпрд╛рдХрдЗрдиреНрдб рдкрдирд┐ рдЫ рдЬрд╕рд▓реЗ рдХреЗрд╣реА рдЕрдореВрд░реНрдд рдмрд╛рдЗрдЯрдХреЛрдб рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫ, рдЬреБрди рддреБрд░реБрдиреНрддреИ рдЕрдиреБрд╡рд╛рджрдХрджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реБрдиреНрдЫ, рддрд░ рдореИрд▓реЗ рдпреЛ рд╕рдордп рдкреНрд░рдпреЛрдЧ рдирдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВред рдпрджреНрдпрдкрд┐, рддрдереНрдп рдпреЛ рд╣реЛ рдХрд┐ QEMU рдорд╛ рдХрд╛рд░реНрдп рдорд╛рд░реНрдлрдд рдЙрддреНрдкрдиреНрди TB рдорд╛ рд╕рдВрдХреНрд░рдордг рд╕рдХреНрд╖рдо рдЧрд░реНрди рдкрд╣рд┐рд▓реЗ рдиреИ рд╕рдореНрднрд╡ рдЫред 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 (рдЕрдм рд╣рд╛рдореА рдХрд╣рд╛рдБ рд╣реБрдиреЗрдЫреМрдВ?) рд▓рд╛рдИ рдзреНрдпрд╛рдирдорд╛ рд░рд╛рдЦреЗрд░ рд▓реЛрдб/рд╕реНрдЯреЛрд░ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрджрдЫ, рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдЖрдлреНрдиреЛ рдЕрдиреБрд╡рд╛рдж рдХреНрдпрд╛рд╕ рд╕рдВрд░рдЪрдирд╛рдХреЛ рд░реВрдкрдорд╛ рдмрдЪрдд рдЧрд░реНрдЫрдиреН, рдЬрд╕рдХреЛ рдкреНрд░рд╢реЛрдзрди рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рд╕рд╛рд░рдг рдмреНрд▓рдХрд╣рд░реВрдорд╛ рдЗрдореНрдмреЗрдб рдЧрд░реНрди рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫред рдкреНрд░рд╢реНрди рдпреЛ рдЫ, рдпрд╕ рд╕рдВрд░рдЪрдирд╛рдорд╛ рдХреБрди рдЕрдлрд╕реЗрдЯ рд╕рдмреИрднрдиреНрджрд╛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЖрджреЗрд╢рд╣рд░реВрдХреЛ рд╕рд╛рдиреЛ рд░ рдЫрд┐рдЯреЛ рдЕрдиреБрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╢реЛрдзрди рдЧрд░рд┐рдиреНрдЫ?
  • рдпрд╣рд╛рдБ рддрдкрд╛рдЗрдБ рдПрдХ рд╡рд╛ рджреБрдИ рдЖрд░рдХреНрд╖рд┐рдд рджрд░реНрддрд╛рд╣рд░реВрдХреЛ рдЙрджреНрджреЗрд╢реНрдпрд▓рд╛рдИ рдЯреНрд╡реАрдХ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдПрдХ рдкреНрд░рдХрд╛рд░реНрдп рдорд╛рд░реНрдлрдд TB рдХрд▓ рдЧрд░реНрди рд╕рдХреНрд╖рдо рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдкрдорд╛ рдХреЗрд╣реА рд╕рд╛рдирд╛рд╣рд░реВрдХреЛ рд╡рд░реНрдгрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред inline- рдЬрд╕реНрддрд╛ рдХрд╛рд░реНрдпрд╣рд░реВ flush_icache_range (рддрд░ рдпреЛ рд╣рд╛рдореНрд░реЛ рдорд╛рдорд▓рд╛ рд╣реЛрдЗрди)

рдлрд╛рдЗрд▓ tcg-target.inc.cрдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдЖрдХрд╛рд░рдорд╛ рдзреЗрд░реИ рдареВрд▓реЛ рд╣реБрдиреНрдЫ рд░ рдзреЗрд░реИ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд╛рд░реНрдпрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ:

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

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

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

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

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

Binaryen рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ

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

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

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдмреЛрд▓реНрджреИ, Binaryen рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ рд╕рд╛рдзрд╛рд░рдг C-API: рддрдкрд╛рдИрдВрд▓реЗ рдореЛрдбреНрдпреБрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрднрдпреЛ, рдЙрд╣рд╛рдБрдорд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН - рдПрдХрд▓, рдмрд╛рдЗрдирд░реА, рдЕрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рд╣рд░реВрдмрд╛рдЯ рдмреНрд▓рдХрд╣рд░реВ, рдирд┐рдпрдиреНрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣, рдЖрджрд┐ред рддреНрдпрд╕реЛрднрдП рддрдкрд╛рдИрд▓реЗ рдпрд╕рдХреЛ рд╢рд░реАрд░рдХреЛ рд░реВрдкрдорд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдХреЛ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░реНрдп рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫред рдпрджрд┐ рддрдкрд╛рдИрдВ, рдо рдЬрд╕реНрддреИ, рдХрдо-рд╕реНрддрд░ рд╕рдВрдХреНрд░рдордг рдЧреНрд░рд╛рдл рдЫ рднрдиреЗ, relooper рдШрдЯрдХ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред рдЬрд╣рд╛рдБрд╕рдореНрдо рдореИрд▓реЗ рдмреБрдЭреЗрдХреЛ рдЫреБ, рдмреНрд▓рдХрдорд╛ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣рдХреЛ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдирд┐рдпрдиреНрддреНрд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдореНрднрд╡ рдЫ, рдЬрдмрд╕рдореНрдо рдпреЛ рдмреНрд▓рдХрдХреЛ рд╕реАрдорд╛рд╣рд░реВ рднрдиреНрджрд╛ рдмрд╛рд╣рд┐рд░ рдЬрд╛рдБрджреИрди - рдЕрд░реНрдерд╛рддреН, рдЖрдиреНрддрд░рд┐рдХ рджреНрд░реБрдд рдорд╛рд░реНрдЧ / рдврд┐рд▓реЛ рдмрдирд╛рдЙрди рд╕рдореНрднрд╡ рдЫред рдмрд┐рд▓реНрдЯ-рдЗрди 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.

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

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

рдЕрдиреНрддрдорд╛ рдПрдЙрдЯрд╛ рдкрд╣реЗрд▓реА: рддрдкрд╛рдИрдВрд▓реЗ 32-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдорд╛ рдмрд╛рдЗрдирд░реА рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрдиреБрднрдПрдХреЛ рдЫ, рддрд░ рдХреЛрдб, рдореЗрдореЛрд░реА рдЕрдкрд░реЗрд╢рдирд╣рд░реВ рдорд╛рд░реНрдлрдд, рдмрд╛рдЗрдирд░реАрдирдмрд╛рдЯ, рд╕реНрдЯреНрдпрд╛рдХрдорд╛ рдХрддреИ, рд╡рд╛ 2-рдмрд┐рдЯ рдареЗрдЧрд╛рдирд╛ рд╕реНрдкреЗрд╕рдХреЛ рдорд╛рдерд┐рд▓реНрд▓реЛ 32 GB рдорд╛ рдХрддреИ рдЪрдвреНрдЫред рд╕рдорд╕реНрдпрд╛ рдпреЛ рд╣реЛ рдХрд┐ Binaryen рдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдмрд╛рдЯ рдпреЛ рдзреЗрд░реИ рдареВрд▓реЛ рдкрд░рд┐рдгрд╛рдо рдареЗрдЧрд╛рдирд╛ рдкрд╣реБрдБрдЪ рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫред рдпреЛ рд╡рд░рд┐рдкрд░рд┐ рдХрд╕рд░реА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди?

рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрдХреЛ рддрд░рд┐рдХрд╛рдорд╛

рдореИрд▓реЗ рдпреЛ рдкрд░реАрдХреНрд╖рдг рдЧрд░реЗрди, рддрд░ рдореЗрд░реЛ рдкрд╣рд┐рд▓реЛ рд╡рд┐рдЪрд╛рд░ рдерд┐рдпреЛ "рдпрджрд┐ рдореИрд▓реЗ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди