áá
áºáá»áááºá á¡áá»á±á¬áºáá¯ááºááá¯á· áá¯á¶ážááŒááºáá²á·áááºá áá¯ááºáááºážá
ááºá áá±á¬ááºááŒááºááŸáá·áºááŸá¯ááᯠáááºáá±ááŒáá«á á
ááºáá¯ááºá០JavaScript (ááá¯ááá¯áááá»á
áœá¬á Asm.js) ááᯠáááºááá¯á·áá¯ááºáá¯ááºááááºááᯠáá±á·áá¬áá«á á
ááºážáááºááŸá¯á¡ááœáẠQEMU ááᯠááœá±ážáá»ááºáá²á·ááŒá®áž á¡áá»áááºá¡áááºážáááºááŒá¬ááŒá®ážáá±á¬áẠHabr ááœáẠáá±á¬ááºážáá«ážáá
áºáá¯áẠáá±ážáá¬ážáá²á·áááºá ááŸááºáá»ááºáá»á¬ážááœáẠáá»áœááºá¯ááºááẠWebAssembly ááœáẠááá±á¬áá»ááºááᯠááŒááºáááºááŒá¯áá¯ááºááẠá¡ááŒá¶ááŒá¯áá²á·ááŒá®áž ááá¯áá·áºááá¯ááºááá¯ááẠááŸá¯ááºááœááºáá²á·áááºá ááŒá®ážáá«áá®ážááŒá® ááá±á¬áá»ááºááᯠáá
áºáááºážáááºážáá²á· áááá¯áá»ááºáá°áž... á¡áá¯ááºá áááºáá¯ááºáá±áá±ááá·áº á¡áááºážááŸá±ážááœá±ážááŒá®áž á¡áᯠáááŒá¬áááºá á¡á²áá®áá±á¬ááºážáá«ážááŸá¬ áá±á«áºáá¬áááºá
áá¬áááºáá»á¬ážááá¯
QEMU ááᯠJavaScript ááá¯á· "áá áºáááºážáá áºáá¯á¶" áá»áááºáááºáááºážááᯠáá«áá±á·áá¬áá²á·ááŒá®ážááŒá®ááŒá áºáá±á¬ááŒá±á¬áá·áºá á€áá áºááŒáááºááœáẠáááºážááᯠááá¬ááŸáááŸááá¯ááºáá±á¬ááºááŒá®áž á¡ááŸá¬ážáá±á¬ááºážáá»á¬ážááᯠáááºááá¯ááºááẠáá¯á¶ážááŒááºáá²á·áááºá
áá¶áá«ááºáá Ạá¡ááŸá¬áž- á¡ááŸááºáá¯ááºááœáŸááºááŸá¯á០áá¬áááœá²
áá»áœááºá¯ááºáááááá¯á¶ážá¡ááŸá¬ážááŸá¬ áá»áœááºá¯ááºááá¬ážááŸááºážááᯠupstream áá¬ážááŸááºáž 2.4.1 á០áááºážááœá²ááŒááºážááŒá
áºáááºá á¡á²áá«á áá»áœááºáá±á¬á·áºá¡ááœáẠáá±á¬ááºážááœááºáá²á· á¡ááŒá¶á¥á¬ááºáá
áºáá¯ááá¯á· áááºááááº- á¡áááºá point release ááŸááááºááá¯áááºá á¡á²áá«á ááá¯ážááá¯áž 2.4 ááẠááá¯áááºááŒáááºááá¯ááºáááºá áá«ááŒá±á¬áá·áº branch á ááá¯ááá¯á·áá±á¬áẠáá±á¬ááºážáá«áááºá master
. áá»áœááºá¯ááºááẠáá»áœááºá¯ááºáááá¯ááºááá¯áẠáá»áá¯á·ááœááºážáá»ááºáá»á¬ážá
áœá¬ááᯠááá·áºáááºá
á®á
ááºáá¬ážáá±á¬ááŒá±á¬áá·áºá á¡ááŒá¬ážáááºáá°á·ááá¯áá»áŸ áááá¯á¡ááºáá±á¬á·áá«á áá®ááá¯ááŒá
áºáá¬áᬠááŒá
áºááá¯ááºáááºá ááá¯á·áá±á¬áº á€á¡áá¬ááŸá¬- QEMU ááẠááŒáááºááá±áá²á áá
áºáá»áááºáá»áááºááœáẠáááºážááá¯á·ááẠáá¯ááºáá¯ááºáá¬ážáá±á¬áá¯ááºááᯠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááẠ10 áá¬ááá¯ááºááŸá¯ááºážáá±á¬áẠááŒá±áá¬áá²á·áááºá "á¡ááºážá á¡áᯠá¡á±ážáá²áá±á¬á·áááº" ááá¯á· ááœá±ážááŒá®áž ááŒá±ááœá²ááœá¬ážáá«áááºá á€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááẠááœá²ááŒááºážá
áááºááŒá¬ááẠááá¯á¡ááºáááº- QEMU.js á single-threaded ááá±á¬ááá¬áááŒá±á¬áá·áº ááŸáá·áº áá°áááºáž QEMU ááẠmulti-threading áááŸáááŒááºážááᯠááá¯ááá¯ááŒááºážááá¯ááºááŒá±á¬ááºáž (ááá¯ááá¯áááºááŸá¬á ááááºááá¯ááºáá±á¬ áá¯ááºáááºážááŒá±á¬ááºážáá»á¬ážá
áœá¬ááᯠáááŒáá¯ááºáááºáááºáž áá¯ááºáá±á¬ááºááá¯ááºááŸá¯á " kernels á¡á¬ážáá¯á¶ážááá¯áá¯á¶ážáá«" ) áááºáááºážá¡ááœááºá¡áá±ážáá«áááºá áá»áœááºá¯ááºáááºááŒááºáááŸáá±á«áºááá¯ááá¯ááºááẠ"ááœáá·áºáá¯ááºáááº" ááá¯á¡ááºáá±á¬ threads áá»á¬ážáá¡ááááá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááŒá
áºáááºá áááºážááẠáá±á«ááºážá
ááºážá
ááºá¡ááœááºáž ááá¬áááŒá¿áá¬á¡áá»áá¯á·ááᯠáááºáá®ážáá²á·áááºá ááá¯á·áá±á¬áº á¡áá»áá¯á·áá±á¬á¡áá»ááºááŸá¬ á¡áááºá០á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááŸááááºá master
áá»áœááºá¯ááºááá¯ááºááᯠáá±á«ááºážá
ááºážááẠááŒáá¯ážá
á¬ážáá²á·áá±á¬á á¡ááŸááºáá¯ááºáá±ááŸá¯ááœáẠáá»ááºáá®ááá¯áááºáž áá±á¬ááºáá°áá²á·ááẠ(ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¬áááœá²ááœááº) áááºáááºáž áááºáá±á¬ááºážá¡áááºááŒá±áááºááá¯ááºáá±á
áá±áá°áá»á¡á¬ážááŒáá·áºá ááŸá±á·ááŒá±ážáá¯á¶á
á¶ááᯠáá¯ááºáá
áºáááºá á¡á
áááºá¡ááá¯ááºážáá»á¬ážá¡ááœáẠá¡á
áááºá¡ááá¯ááºážáá»á¬ážááᯠááŒá¯ááºáá¯ááºáᬠá¡áá
áºááŸáá·áº ááá¯ááŸá
á á¡áá
áºá¡áááºážáá
áºáá¯áá¯ááᯠá¡ááŒá±áá¶á áá¬ážááŸááºážá¡áá
áºááᯠá¡á
ááŸááŒááºáááºáá±á¬ááºááẠá¡áááá¹áá¬ááºááŸááá±áá²ááŒá
áºááŒá±á¬ááºáž áá»áœááºá¯ááºáá¯á¶ážááŒááºáá²á·áááºá master
.
áá¶áá«ááºááŸá áºá¡ááŸá¬áž- TLP áááºážá áá áº
á¡ááŸá áºáá¬áá¡á¬ážááŒáá·áºá á€áááºááŸá¬ á¡ááŸá¬ážááá¯ááºáá«á áá±áá¯áá»á¡á¬ážááŒáá·áºá áááºážááẠ"áááºááŸá¬ááŸáá·áº áááºááá¯á·ááœáŸá±á·ááááº" ááŸáá·áº áá±áá¯áá»á¡á¬ážááŒáá·áº "áá«ááá¯á·á¡á²áá®ááá¯áá±á¬ááºááŸá¬áá¬ážá" á€á¡ááŒá±á¡áá±áá»á¬ážááœáẠááá¯ááºáá²áá±á¬ áááá¯ááááºážáááºáž áá»áŸááá±á¬ááœá±ážáá»ááºááŸá¯áá áºáá¯ááŒá áºáá±á¬áºáááºážá ááá¬áá¡á¬ážááŒáá·áºá áááá¯á¡ááºáá² áááºážááᯠáááºáááŒá±á¬áá»ááºáá«á á€áá áºááŒáááºááœáẠáá»áœááºá¯ááºááẠáááºážááᯠááá¬ááŸáá áœá¬ ááŒá¯áá¯ááºááá¯áááº- á¡ááºááẠáá»á°ážááœááºááŸá¯áá»á¬ážá á¡ááá áááºáá¯áẠá¡ááŒá±á¬ááºážá¡áá²áá»á¬áž (áááºážááẠáá áºá á¯á¶áá áºáŠážá¡ááŒá±á¬ááºáž Linus Torvalds áá áºáá»áááºá ááŒá±á¬ááŒá¬ážáá²á·ááá·áºá¡ááá¯ááºáž Linus Torvalds á Wikiquote á¡ááá¯á¡á) á áááºááŒáá·áº "áá»áááºážá á¬áá¯á¶ážáá»á¬ážááᯠá á¯á ááºážááŒááºáž (ááááá±ážáá»ááºáá»á¬ážááŸáá·áºá¡áá°) áááŒá®ážááá»ááºáž "áá»áááºážá á¬áá¯á¶ážáá»á¬ážááᯠáá±á«ááºážá ááºážááŒááºážáááŒá¯áá«"á
áá¶áá«áẠá á¡ááŸá¬áž- ááá¯áá«ááᯠááááá² áá±áá²áááºážááŒááºážá
áá« áá«ááᯠáá¯á¶ážáá¯á¶ážáá»á¬ážáá»á¬áž áááŸááºážááá¯ááºáá±ážáá°ážá áá«áá±ááá·áº á¡áᯠáá« áá¶ááá¯ááºááẠá¡áááºážáá¯á¶áž áááºážááŒá±á¬ááºážááᯠáá¯á¶ážá áááá¯ááºááá¯á· áá¯á¶ážááŒááºááŒá®áž âáá°ááŒá®ážáá áºáá±á¬áẠá¡áá±áá²á·â áá¯ááºááá¯á· áá¯á¶ážááŒááºáá¬ážááŒá®áž ááŒá áºáá²á· á¡ááœááºá áááŸááºážááááºážááá¯ááºá¡á±á¬áẠáá«á· TCG áá±á¬ááºáá¶ááᯠá¡á ááá± áá±ážáá«á áá±á¬ááºááŸááŒá±á¬ááááºá "áá¯ááºáá«áááºá áá«á ááŒááºážááŒááºážáá²á áá«áá±ááá·áº á¡áá¬á¡á¬ážáá¯á¶ážááᯠáá«áááááºážáá»á¯ááºááá¯ááºáá°áž - TCI á áá®ááá¯áá±ážáá¬ážáááº..." ááá¯á·á¡ááŒááºá á€á¡áá¬ááẠá¡á ááá¯ááºážááœáẠáááá¬áááºááŸá¬ážáá±á¬ ááŒá±ááŸááºážáá»ááºáá áºáá¯áá²á·ááá¯á· áááºááŸááºáááŒá®ážá áá« binary áá¯ááºáá¯ááºáá±ážáááºá. áá°ááá¯á·ááŒá±á¬ááá·áºá¡ááá¯ááºáž âGhent á á á¯áá¯á¶ážáááºáÑáá«áá±ááá·áº á¡á²áá®áá áºáá¯áá±á¬á· ááá¯ááºáá°áž"- áá¯ááºááẠá¡ááŸááºáá±á¬á· ááœáá á¯á¶ááŒá áºáááºá ááá¯á·áá±á¬áº ááááºážáá»á¯ááºááŸá¯ááᯠáááºážáá¶ááá¯á· ááá¯ážááŸááºážá áœá¬ ááœáŸá²ááŒá±á¬ááºážááááá« - áááºážááᯠá á¯á ááºážáááºá¡ááœáẠááá±á¬ááºáá¬áá²ááá¯á· ááŒááºáá¬ážá áœá¬ ááœááºážááá¯á·áá±ážááááºááŒá áºááŒá®ážá ááá¯á¡ááºáá±áá±ážááá·áº JS ááá¹áá¬á០á¡áá¬ááá¹áá¯áá áºáá¯ááᯠááŒá áºáá±á«áºá á±áááºáá áá áºáá±áá¬áá¬ááŸá¬ áááºáááºááŒááºážáá¶ááááºá ááá¯á·áá±á¬áºáááºážá áá¯á¶ááŸáẠRISC áááá¯áá¬áá»á¬ážáá±á«áºááœáẠáá»áœááºá¯ááºáá¬ážáááºááá±á¬ááºá áá¯á¶ááŸááºá¡ááŒá±á¡áá±ááẠááŒááºáááºáá¯ááºáá±ážáá¬ážáá±á¬ áá¯ááºá¡ááœáẠááœáŸááºááŒá¬ážáá»áẠcache ááᯠááŒááºáá¬ážá áœá¬ ááŒááºáááºáááºááŸááºááẠááá¯á¡ááºááẠ- áááºážááẠáá»áœááºá¯ááºááá¯á· ááá¯á¡ááºáááºááá¯ááºáá«áá áááºááá¯á·áááºááá¯á á±á áááºážááẠáá®ážáááºáá«áááºá ááá¯á·á¡ááŒááºá áá»áœááºá¯ááºááá±á¬ááºáá¯á¶ážááŒáá¯ážá á¬ážááŸá¯ááŸá ááááºážáá»á¯ááºááŸá¯ááẠáá¬áá¬ááŒááºááá±á¬ááºáá¡áááºááá¯á· ááœáŸá²ááŒá±á¬ááºážáá¯á¶ááá±á«áºááŒá±á¬ááºáž ááááŸááá²á·ááááºá ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠáááºááá·áº offset á០áá¬áá¬ááŒááºáá¬ážáá±á¬ bytecode áááá¯á¡ááºáá«á ááŸáá·áº TB ááŸá áá¯ááºáá±á¬ááºáá»ááºá០áááºážááᯠááá¯ážááá¯ážááŸááºážááŸááºážáá¯ááºáá±ážááá¯ááºáá«áááºá .
áá¬ááŒá®áž áááºáááºá
áá¯ááºááᯠáá°ááá¯ááºáááœáẠááŒááºáááºáá±ážáá¬ážáá²á·áá±á¬áºáááºážá ááááááŒá¯áááá² ááŸá±á¬áºáááºááŸá¯áá
áºáᯠááœááºáá±á«áºáá¬áááº- áá»á¬ážáá±á¬á¡á¬ážááŒáá·áº GitHub á០áá¯ááºáá±ážááŸá¯áá»á¬ážááŸáá·áº Pull áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáá¯á¶á·ááŒááºááŸá¯áá»á¬ážááá¯ááºáᬠá¡ááŒá±á¬ááºážááŒá¬ážá
á¬áá»á¬ážá¡ááŒá
Ạáá±á¬ááºááŸááá¬áá±á¬áºáááºáž á€áá±áá¬ááœááºá áá¯ááºáááẠthread ááœááºáá±á¬áºááŒáá¬ážááŒááºážá
áá±á¬ááºáá
áºáá« ááá¯áá»á¬ážáááºá
- áááºáááºááŸá¯áá¯á¶ážáááá¯ááºáá² ááá¬áá±ážá¡áá¬áá áºáá¯áá¯ááᯠá áááºááá¯ááºáá«á
- áá±á¬áá¬ááááœá±á¡á iOS ááŸá¬ áá¯ááºáááºáá®ážááœáá·áºááŸááá²á· áá áºáá¯áááºážáá±á¬ á¡ááá®áá±ážááŸááºážá JS á¡ááºáá»áẠ(áá«á ááŸááºááá¬ážá)
- mini-OS áááá¯ááºááŒááŒááºáž - single-floppyá built-iná firmware á¡áá»áá¯ážáá»áá¯ážá á áááºááŒáá·áº...
Browser Runtime á¡ááºá¹áá«áááºáá»á¬áž
áá»áœááºáá±á¬áºááŒá±á¬áá²á·áááá¯áá² QEMU áᬠmultithreading áá²á· áá»áááºáááºáá¬ážáá±ááá·áº browser ááŸá¬áá±á¬á· áááŸááá«áá°ážá áá¯ááºáááºá ááá¯ááºáá°áž... á¡á
ááá¯ááºážááŸá¬áá±á¬á· áá¯á¶ážááááŸááá²á·áá°ážá ááá¯á·áá±á¬áẠWebWorkers áá±á«áºáá¬ááẠ- áá«áá¬ážáááºááá±á¬ááºá áá«á áááºáá±á·áá»áºáá±ážááá¯á·ááŒááºážá¡áá±á«áº á¡ááŒá±áá¶áá¬ážáá²á· multithreading ááŒá
áºáá«áááºá áá»áŸáá±áá¬ážáá±á¬ááááºážááŸááºáá»á¬ážááá«áá². áá¯á¶ááŸááºá¡á¬ážááŒáá·áºá áááºážááẠáá»áŸáá±áá¬ážáá±á¬ ááŸááºáá¬ááºáá¯á¶á
á¶á¡áá±á«áº á¡ááŒá±áá¶áá¬ážáá±á¬ ááŸáááŒá®ážáá¬ážáá¯ááºááᯠááá¯á·ááá·áºá¡áá«ááœáẠáááá¬áááºááŸá¬ážáá±á¬ ááŒá¿áá¬áá»á¬ážááᯠáááºáá®ážáá±ážáá«áááºá ááá¯á·áá±á¬áẠáá°áá¯áááá¡á¬ážáá±ážááŸá¯á¡á±á¬ááºááœáẠáááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá²á·áááºá SharedArrayBuffers
. áááºážááᯠáááŒááºážááŒááºáž ááááºáááºáá²á·ááŒá®ážá ááá°áá®áá±á¬ ááá±á¬ááºáá¬áá»á¬ážááœáẠááœáŸáá·áºáááºááŒááºážááᯠáááºááœáŸá²áá²á·ááŒááŒá®ážá ááá¯á·áá±á¬áẠááŸá
áºáá
áºáá°ážááᯠáá¯ááºááŒá¯ááŒááŒá®áž Meltdown... ááá¯á·áá±á¬áẠá¡áá»áááºááá¯ááºážáá¬ááŸá¯ ááŒááºážááẠááá¯á·ááá¯áẠááŒááºážáááºáᯠáááá¯á¶ážáá»á¯ááºááœá¬ážáá±á¬áºáááºáž áá»áŸáá±áá¬ážáá±á¬ memory ááŸáá·áº a á¡áá°á¡áá®ááŒáá·áºá thread incrementing áá±á¬ááºáá¬á á¡á¬ážáá¯á¶ážá¡áá°áá°áá«áá²á
áá¯ááá á¡ááºá¹áá«áááºááŸá¬ stack ááŒáá·áº á¡ááá·áºáááá·áº ááŒááºááŸááºááŸá¯áá»á¬ážááᯠáááŒá
áºááá¯ááºáá±á¬á·ááŒááºážááŒá
áºáááº- áááºááẠááá¯ážááá¯ážááŸááºážááŸááºáž ááá°ááá¯ááºá áááºááŸá á¡ááŒá±á¬ááºážá¡áá¬ááᯠááááºážáááºážááŒá®áž á¡áá
áºáá
áºáᯠá¡áá
áºáá
áºáá¯ááá¯á· ááŒá±á¬ááºážááá¯ááºáááºá áá±á«áºááá¯ááŸá¯á¡á
á¯ááᯠJS virtual machine á០á
á®áá¶ááá·áºááœá²áááºá áá»áœááºá¯ááºááá¯á·ááẠááááºá
á®ážáááºážááŸá¯áá»á¬ážááᯠáá¯á¶ážáá¯á¶ážáá»á¬ážáá»á¬áž ááá¯ááºááá¯ááºá
á®áá¶ááá·áºááœá²ááẠáá¯á¶ážááŒááºáá¬ážáá²ááŒá
áºáá±á¬ááŒá±á¬áá·áº ááŒá¿áá¬áá¬áž á¡áááºáááºážá á¡ááŸááºááŸá¬ QEMU ááŸá ááááºááá¯á·ááŒááºáž I/O ááᯠáá±á¬áºááá¯ážáááºáá»á¬ážááŸáá
áºááá·áº á¡áá±á¬ááºá¡áááºáá±á¬áºááŒá®áž áááºážááẠá¡ááá·áºáááá·áº stack manipulations áá»á¬áž á¡áááºááŒá±áá¬ááá·áºáá±áá¬ááŒá
áºáááºá áá¶áá±á¬ááºážáá±á¬ááºáá
áœá¬á Emscipten ááẠá¡ááŒáá¯ááºá¡ááá¯ááºáá¯ááºáá±á¬ááºááŸá¯áá»á¬ážá¡ááœáẠááá¹ááá¬ážááŸá
áºáá¯áá«ááŸáááŒá®ážá
áá±á¬áá±á¬áááºááœááºá áá»áœááºá¯ááºááẠáá¯ááºááᯠWASM ááœáẠá á¯á ááºážááŒá®áž Emterpreter áá¯á¶ážááŒá®áž áá¬áá¬ááŒááºááá¯ááŒááºážáá áºáá¯á¡ááŒá áºááá¯á· ááœá²ááá¯ááºááá¯ááºáá±ážáá±á¬ááŒá±á¬áá·áº ááááºááá¯á·áááááá¬áá»á¬áž á¡áá¯ááºááá¯ááºáá±ážáá« (áá°ááá¯á·ááŒá±á¬ááá·áºá¡ááá¯ááºáž áá±á¬ááºá á®ážáá®ážáá»á¬ážááœáẠááŒáá·áºáá«)á ááá¯ááá¯áááºááŸá¬á á¡áá¯á¶ážááœáẠáááºááẠá€áááºá áá¬á¡ááœáŸá¬áá²á·ááá¯á·áá±á¬ á¡áá¬áá áºáá¯ááᯠáááŸáááá·áºáááº-
- block I/O ááᯠáá¬áá¬ááŒááºááá¯áááºá áá±á¬ááºážááŒá®á áá°áááºážá áœááºážáá±á¬ááºáááºááŒáá·áº á¡áá¯áá°áá¬ážáá±á¬ NVMe ááᯠááẠá¡ááŸááºáááẠáá»áŸá±á¬áºááá·áºáááá«ááá¬ážá ð
- áááºááŒáááºá áœá¬ááŒá¯á á¯áá¬ážáá±á¬ áááºá QEMU áá¯áẠ(áá¬áá¬ááŒááºáá°á á¡ááŒá¬áž á¡áá¯áá°áá¬ážáá±á¬ á ááºáá»á¬áž á áááºááŒáá·áº)
- á§áá·áºáááºáá¯ááºááᯠWASM ááœáẠááá¯ááºážááá áºááŒáá·áº ááŒá¯á á¯áá¬ážáááºá
QEMU á¡áááºážá¡ááŒá áºáá»á¬ážáá¡ááºá¹áá«áááºáá»á¬áž
áááºááá·áºááŸááºážááŒá®ážáá¬ážá¡ááá¯ááºážá á§áá·áºáááºáááá¯áá¬áá»á¬ážááá¯á¡áá¯áá°áááºá¡ááœááºáá¯ááºááŸáá·áº host machine ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááá¯áá¯ááºáá±ážááŒááºážá¡ááœááºáá¯ááºááᯠQEMU ááœáẠááœá²ááŒá¬ážáá¬ážáááºá ááááºáá±á¬á·á áá«á áááºážáááºážáá±ážáá±á¬áẠááá¯áááºáááº-
- á§áá·áºáááºáááá¯áá¬ááœá±ááŸááááºá
- ááŒá
Ạá¡ááŸáááºááŒáŸáá·áºá
ááºáá»á¬ážááŒá±á¬ááááºá Linux áá±á«áºááŸá áá¬á·ááºáá² virtualization á¡ááœáẠKVM (á§áá·áºáááºááŸáá·áº áááºáá¶áá±á¬ááºááœááºáá±ážááá·áº á
áá
áºáá»á¬ážá¡ááœááº)á JIT áá¯ááºáá¯ááºáá¯ááºááŒááºážá¡ááœáẠTCG QEMU 2.9 ááŒáá·áº á
áááºá Windows ááŸá HAXM áá¬á·ááºáá² virtualization á
á¶ááŸá¯ááºážá¡ááœáẠáá¶á·ááá¯ážááŸá¯ áá±á«áºáá¬ááẠ(
á¡áá±ážá ááá» ) - TCG ááá¯á¡áá¯á¶ážááŒá¯ááŒá®áž hardware virtualization ááá¯ááºáá²á áááºážááœáẠhost architecture áá áºáá¯á á®á¡ááœáẠáá®ážááŒá¬áž code generation support á¡ááŒáẠuniversal interpreter á¡ááœááºáá«ááŸááááºá
- ... á€á¡áá¬á¡á¬ážáá¯á¶ážááœáẠ- á¡áá¯áá°áá¬ážáá±á¬ á¡áá¶á¡áá¬ážáá»á¬ážá á¡áá¯á¶ážááŒá¯áá° á¡ááºáá¬áá±á·á áºá ááœáŸá±á·ááŒá±á¬ááºážááŒááºážá ááŸááºáááºážááŒááºááœáá·áºááŒááºáž á áááºááŒáá·áºá
á áá¬ážáá ááºá áááºáááá«ááá¬ážá QEMU ááẠááœááºááŒá°áá¬áá áºáá¯áá¯á¶ážáá¬áááá² binary instrumentation á¡ááœáẠAFL fuzzer ááŸá¡áá¯á¶ážááŒá¯ááá·áº host kernel ááŸá áá®ážááŒá¬ážá¡áá¯á¶ážááŒá¯áá°áá¯ááºáááºážá ááºá¡ááœáẠáááá¯áááºáá¬ááá¯áááºáž á¡áá¯áá°ááá¯ááºáá«áááºá áá áºá á¯á¶áá áºáá±á¬ááºááẠQEMU á á€áá¯ááºáá±á¬ááºáá»ááºáá¯ááºááᯠJS ááá¯á· ááá¯á·ááá¯áá«ááá¬ážá ð
áá¬áááŸááºááŒá¬ á¡ááá²á·áá±á¬á·ááºáá²ááºáá»á¬ážáá²á·ááá¯á· QEMU ááẠáá±á«áºááá¯ááŸá¯ááŸáá
áºááá·áº áááºáá±á¬ááºáá¬ážáááºá configure
О make
. áá
áºáá¯áá¯ááᯠááá·áºááẠáááºáá¯á¶ážááŒááºáááº- TCG áá±á¬ááºááœááºááœááºá thread á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á á¡ááŒá¬ážáá
áºáá¯áá¯á Autoconf ááŸáá·áº áááºááœááºáááá·áº á¡áá¬ážá¡áá¬ááœáẠáá»á±á¬áºááœáŸááºááŒááºáž/ááááºááá·áºááŒááºáž (á¡áá»ááºážááá·áºáááᯠáá»ááºážáá¬ážáá«) ááᯠá¡áá»ááºá
ááá¯ááá¯ááºáá«ááŸáá·áºá configure
QEMU ááẠááá¯ááºááá¯ááºáá±ážáá¬ážáá¯á¶áááŒá®áž áááºááá·áºá¡áá¬á០áá¯ááºáá¯ááºáá¬ážááŒááºážááá¯ááºáá«á
áááºáááºáááºááŸá¯
áá«ááᯠáá®á¡áá¬ááᯠWebAssembly (aka WASM) á áá¬áá±á«áºáá²á áááºážááẠAsm.js á¡ááœáẠá¡á
á¬ážááá¯ážááŒááºážá ááá¬ážááẠJavaScript áá¯ááºá¡ááŒá
Ạáááºáá±á¬ááºááŒááºáž áááŸááá±á¬á·áá«á ááá·áºáá»ááºáááºá¡áá±ááŸáá·áºá áááºážááẠbinary áááºáááºááŒá
áºááŒá®áž optimized ááŒá
áºááŒá®ážá áááºážáá²ááá¯á· ááááºážááŒáá·áºáá
áºáá¯áá±ážáá¯á¶áá»áŸááẠáááœááºáá°áá«- áá»á
áºáá
áºááááºáááºážááŸá¯á¡ááœááºá áááºážááᯠáá±á¬áºáááºááŒáá·áº ááááºážáááºážáá¬ážáááºá
Asm.js á¡ááœáẠrelooping algorithm á¡ááŒá±á¬ááºáž áááºááŒá¬ážáá°ážáá±ááẠ- á€áááºááŸá¬ JS á¡ááºáá»ááºáá»á¬ážááᯠáá®ááá¯ááºážáá¯ááºáá¬ážááá·áº "á¡ááá·áºááŒáá·áº" áááºáááºá á®ážáááºážááŸá¯ ááááºážáá»á¯ááºááŸá¯ááá¯ááºáᬠááœáŸááºááŒá¬ážáá»ááºáá»á¬áž (á¥ááá¬-ááá¯á¡áá«-á¡ááŒá¬ážá ááœááºážáááºá á áááº) ááᯠááŒááºáááºááá°ááŒááºážááŒá áºáááºá á¡ááá·áºáááá·áº LLVM IR ááŸá áááá¯áááºáá¬á០áá¯ááºáá±á¬ááºáá±á¬ á ááºáá¯ááºááŸáá·áº ááá¯ááá¯áá®ážá ááºáááºá áá¯á¶ááŸááºá¡á¬ážááŒáá·áºá QEMU áá¡áááºá¡áááºááá¯ááºá á¬ážááŒá¯ááŸá¯áááºáá¯áááááŸáá·áºááá¯ááá¯áá®ážáááºáááºá áá«áá bytecodeá ááŸáááºá ááºááŸá¯áá²á·á¡áá¯á¶ážááá¯á·áááºááááá·áºáááº... ááŒá®ážáá±á¬á· ááá±á¬ááºááœá±á if-then-else áá²á· loops ááœá±ááŸááááº..
Binaryen ááẠá¡áá¯á¶ážáááºááá·áº á¡ááŒá±á¬ááºážáááºážááŒá áºáááºá áááºážááẠWASM ááœáẠááááºážáááºážááá·áºá¡áá¬ááŸáá·áº áá®ážá ááºááá·áº á¡ááá·áºááŒáá·áºáá¯ááºááœááºáá»á¬ážááᯠááá¬áá¡ááá¯ááºáž áááºáá¶ááá¯ááºáááºá ááá¯á·áá±á¬áº áááºážááẠá¡ááŒá±áá¶áá¯ááºááœááºáá»á¬ážááŸáá·áº áááºážááá¯á·ááŒá¬ážááŸá áá°ážááŒá±á¬ááºážááŸá¯áá»á¬ážááᯠááááºáá áºáá¯á០áá¯ááºááá¯áááºáž áá¯ááºáá¯ááºááá¯ááºáááºá áá±á¬ááºážááŒá®á á¡áááºááŒá±áá²á· C/C++ API áá±á¬ááºááœááºááŸá¬ WebAssembly ááá¯ááŸá±á¬ááºááŸá¯áá±á¬áºáááºááᯠááŸááºáá¬ážáááºááá¯á· áá»áœááºáá±á¬áºááŒá±á¬áá¬ážááŒá®ážáá¬ážáá«á
TCG (Tiny Code Generator)
GTC tcg_qemu_tb_exec
á á¡á²áá«á áá«á·á¡ááœáẠá¡áááºážá¡áá¯á¶ážáááºáá¬áá²á·áááºá
QEMU ááá¯á· TCG backend á¡áá
áºáá
áºáá¯ááá·áºáááºá áááºááẠáááºážááŒá±á¬ááºážááœá²áá
áºáá¯ááᯠáááºáá®ážááẠááá¯á¡ááºáááºá tcg/<ÐžÐŒÑ Ð°ÑÑ
ОÑекÑÑÑÑ>
(áá«ááá¯áááº, tcg/binaryen
) ááŸáá·áº áááºážááœáẠááá¯ááºááŸá
áºáá¯áá«ááŸááááºá tcg-target.h
О tcg-target.inc.c
О configure
. á¡ááŒá¬ážááá¯ááºáá»á¬ážááᯠááá¯áá±áá¬ááœáẠáááºáá¬ážááá¯ááºáá±á¬áºáááºážá á€ááŸá
áºáá¯áá¡áááºáá»á¬ážááᯠáááºááá·áºááŸááºážááá¯ááºááá²á·ááá¯á· áááºážááá¯á·ááŸá
áºáŠážá
áá¯á¶ážááẠáá
áºáá±áá¬áá¬ááœáẠáá«áááºáááá·áºáááº- áá
áºáá¯ááẠáá¯á¶ááŸááºáá±á«ááºážá
á®ážááá¯ááºáá
áºáá¯á¡ááŒá
Ạ(áááºážááœááºáá«áááºááẠtcg/tcg.h
á áááºážááẠáááºážááŒá±á¬ááºážááŸá á¡ááŒá¬ážááá¯ááºáá»á¬ážááœáẠááŸáááŸáá·áºááŒá®ážááŒá
áºáááºá tcg
, accel
ááŸáá·áºááá¬) á¡ááŒá¬áž - áá¯ááºá¡ááá¯á¡ááœá¬á¡ááŒá
áºáᬠtcg/tcg.c
ááá¯á·áá±á¬áº áááºážááẠáááºážááááºááŒáááºáá±á¬áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááœáá·áºááŸááááºá
áááºážáááºááá¯á·á¡áá¯ááºáá¯ááºááŒá±á¬ááºážá¡áá±ážá áááºá á¯á¶á ááºážá á áºáá±ážááŸá¯áá»á¬ážá¡ááœáẠáá»áœááºá¯ááºá¡áá»áááºáá»á¬ážá áœá¬áá¯ááºáá¯á¶ážáááºáᯠáá¯á¶ážááŒááºááá¯ááºááŒááºážááŒáá·áºá á€ááá¯ááºááŸá áºáá¯á "á¡ááá¯ážá á¯áá»á¬áž" ááᯠá¡ááŒá¬ážáá±á¬ááºáá¶á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á០áá°ážáá°áá¬ážááŒá®áž ááá¯ááºá ááºáá±á«ááºážá á®ážááœáẠáááºážááᯠááá¯ážáá¬ážá áœá¬áá±á¬áºááŒáá«áááºá
ááá¯áẠtcg-target.h
áá±á¬ááºááœáẠá¡áááá¡á¬ážááŒáá·áº áááºáááºáá»á¬ážáá«ááŸááááºá #define
-s:
- áá áºááŸááºáááá¯áá¬ááœáẠááŸááºáá¯á¶áááºáááºáá»áŸááŸáá·áº á¡áá»ááºáááºáá»áŸááŸáááááºáž (áá»áœááºá¯ááºááá¯á· ááá¯áá»ááºááá±á¬ááºá áá»áœááºá¯ááºááá¯á· ááá¯áá»ááºááá±á¬áẠá¡áá»á¬ážá¡ááŒá¬ážááŸáááẠ- áá±ážááœááºážááŸá¬ âáá¯á¶ážááá áºááŸááºâ áááá¯áá¬ááœáẠááá±á¬ááºáá¬á០ááá¯ááá¯áááá±á¬ááºáá±á¬ áá¯ááºá¡ááŒá áºááá¯á· áá¯ááºáá±ážááá·áºá¡áá¬ááŸáá·áº áááºáááºáá±á¬ áá±ážááœááºážááŒá áºáááºá ...)
- host ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠáá»áááºááŸáááŒááºáž- x86 ááŸáá·áº TCI ááœááºááẠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááẠáá¯á¶ážáááá®áá«á ááá¯á·áá±á¬áº áá»áœááºá¯ááºááẠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠáá¯ááºááŒá¬ážáá¶ááœáẠááá·áºááœááºážáááºááá¯ááºáá² Binaryen á á¬ááŒáá·áºááá¯ááºáááºáá±á¬ááºáá¯á¶áá»á¬ážááᯠááœáŸááºááŒáá±ážáááºááŒá áºáá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááŒá±á¬ááá«áááº- 4 ááá¯ááº
- Backend á០á áááºááŒáá¯ááºááœá±ážáá»ááºááá¯ááºáá±á¬ ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠáá¯ááºáá±ážááá¯ááºááẠ- Binaryen ááœáẠáá»áœááºá¯ááºááá¯á·ááœá±á·ááá»áŸ á¡áá¬á¡á¬ážáá¯á¶ážááᯠáá±á«ááºážá ááºááá·áºááœááºážááŒá®áž áá»ááºá¡áá¬áá»á¬ážááᯠááá¯ááá¯ááá¯ážááŸááºážááá·áºá¡áá¬áá»á¬ážá¡ááŒá Ạááœá²áá¯ááºááá¯ááºáá«
- áá±á¬ááºááœááºááŸáá±á¬ááºážááá¯áá¬ážááá·áº TLB cache á ááá·áºááŸááºážááŒá±á¡ááœááºá¡á á¬ážááŸá¬ á¡áááºáááºážá á¡ááŸááºááŸá¬ QEMU ááœáẠá¡áá¬á¡á¬ážáá¯á¶ážááẠáá±ážáááºáááº- á§áá·áºááẠMMU ááᯠááá·áºááœááºážá ááºážá á¬ážááá·áº load/store áá¯ááºáá±á¬ááºááá·áº helper functions áá»á¬ážááŸááá±á¬áºáááºážá áá¯ááºááœáŸáá·áºááá·áº ááá±á¬ááºáá»á¬ážááœáẠááá¯ááºááá¯ááºááá·áºááœááºážááẠá¡áááºááŒá±ááá·áº áá¯ááºáááºážá ááºá áá±ážááœááºážááŸá¬á á€ááœá²á·á ááºážáá¯á¶ááœáẠá¡áááºá¡áá¬ááẠáá±ážáááºááŒá®áž áá»ááºááŒááºáá±á¬ ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááŒáá·áº á¡áááá±á¬ááºáá¯á¶áž áá¯ááºáá±á¬ááºááá¯ááºááááºážá
- á€áá±áá¬ááœáẠáááºááẠáá®ážááá·áºá
á¬áááºážááœááºážááŸá¯áá
áºáᯠááá¯á·ááá¯áẠááŸá
áºáá¯á áááºááœááºáá»ááºááᯠááŒá¯ááŒááºááŒá±á¬ááºážáá²ááá¯ááºááŒá®áž áá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯ááŸáá
áºááá·áº áá®áá®áá±á¬áá«áá±á«áºááá¯ááŒááºážááᯠááœáá·áºááá¯ááºááŒá®áž á¡áá±ážá¡ááœáŸá¬ážá¡áá»áá¯á·ááᯠááœá±ážáá»ááºáá±á¬áºááŒááá¯ááºáááº
inline
- áá²á·ááá¯á·áá±á¬áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážflush_icache_range
(áá«áá±ááá·áº áá«á áá«ááá¯á·ááá á¹á ááá¯ááºáá°áž)
ááá¯áẠtcg-target.inc.c
áá¯ááºáá«áááºá áá»á¬ážáá±á¬á¡á¬ážááŒáá·áº á¡ááœááºá¡á
á¬ážá á¡áá»á¬ážááŒá®ážááá¯ááŒá®ážááŒá®áž áááŒá
áºááá±áá¯ááºáá±á¬ááºá
áá¬ááœá± á¡áá»á¬ážááŒá®ážáá«ááŸááá«áááº-
- áááºááá·áº operands áá»á¬ážáá±á«áºááœáẠáá¯ááºáá±á¬ááºááá¯ááºááá·áº ááœáŸááºááŒá¬ážáá»ááºáá»á¬áž ááá·áºáááºáá»ááºáá»á¬áž á¡áá«á¡ááẠá¡á ááŒá¯ááŒááºáž á¡ááŒá¬ážáá±á¬ááºááœááºá០áá»áœááºá¯ááºá ááŒá±á¬ááºááŒá±á¬ááºáááºážáááºáž áá°ážáá°áá¬ážáááºá
- á¡ááœááºážááá¯ááºáž bytecode ááœáŸááºááŒá¬ážáá»ááºáá áºáá¯áá°ááá·áº áá¯ááºáá±á¬ááºáá»ááº
- á€áá±áá¬ááœáẠauxiliary functions áá»á¬ážááá¯áááºáž ááá·áºááá¯ááºááŒá®áž static functions áá»á¬ážááá¯áááºáž á¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá
tcg/tcg.c
áá»áœááºá¯ááºááá¯ááºááá¯ááºá¡ááœááºá áá»áœááºá¯ááºááẠá¡á±á¬ááºáá«áááºážáá»á°áá¬ááᯠááœá±ážáá»ááºáá²á·áááº- áá±á¬ááºáá¬áá¬ááŒááºááá±á¬ááºá áááá
áá¬ážáá¯á¶ážáá»á¬ážááœááºá áá»áœááºá¯ááºááẠá¡ááŸááºá¡áá¬ážáá±ážáá¯ááᯠáá»áá±ážáá²á·áááº- á
áááºá¡ááŸááºá¡áá¬áž (á¡áá®ážáá
áºááá¯ááºááŸá á¡áá»áá¯á·áá±á¬áááºááá¯ážáá
áºáá¯á 0xFFFFFFFF
áá®áá®ááááºááŸáá¡ááŒá±á¡áá±á¡á¬áž áá¯á¶ážááŒááºáá±ážáá±á¬) á¡ááŒá±á¬ááºážá¡áá¬á áá¯ááºáá±ážáá¬ážáá±á¬ áá±á¬áºáá»á°ážááŸáá·áº á¡ááŸá¬ážááŸá¬ááŒááºááŒááºážá¡ááœáẠááŸá±á¬áºáá¶áá«ááºá ááááá±á¬á· á¡ááŸááºá¡áá¬áž áá»áá¬ážáááºá 0xFFFFFFFF - n
áááºááŸá¬ n
- á¡ááŒá¯ááá±á¬áá±á¬ááºáá±á¬ á¡áá±á¡ááœáẠá¡áááºážáááºááŸáááŒá®áž áááºážááᯠá
áá¬ážááŒááºááŸáá
áºááá·áº áá¯ááºáá±á¬ááºááá·áºá¡áá«ááá¯ááºáž áááºážááẠ1 ááá¯ážáá¬áááºá áááºážááá¯á·áá±á¬ááºááŸáááá·áºá¡áá«á 0xFFFFFFFE
á
á¯á
ááºážááŸá¯ááŒá¯áá¯ááºáá²á·áááºá áá±á¬áºáá»á°ážááᯠáá¯ááºáá±á¬ááºáá»ááºááá¬ážááœáẠááááºážáááºážáá¬ážááŒá®ážá áá±ážáááºáá±á¬ "áá±á¬ááºáá»á¬" áá²ááá¯á· ááá·áºááœááºážáá¬á áá¯ááºáá±á¬ááºááŸá¯á០áá¯ááºáá±á¬ááºááœá¬ážáá²á·áááºá tcg_qemu_tb_exec
ááŸáá·áº module ááᯠQEMU áááºááá¯áá®á០áááºááŸá¬ážáá²á·áááºá
"Crutchá ááá±á¬áá»ááºáááŸáá¯á¶ážáá¬ážá¡ááœáẠá€á¡áá¶ááœáẠáááºáá»áŸáá±á¬ááŸááºáá±áááº" áᯠááá¹ááááºáá»á¬ážááᯠá¡áááá¹áá«ááºáá±á¬áºáááºá ááá¯á·áá±á¬áº ááŸááºáá¬ááºááẠáá áºáá±áá¬áá¬ááá¯á· áá±á«ááºááŒá¬ážááœá¬ážáááºá ááá¯á·á¡ááŒááºá áááºážááᯠQEMU á០á á®áá¶ááá·áºááœá²áá±á¬ ááŸááºáá¬ááºááŒá áºáááºá áá±á¬ááºááœáŸááºááŒá¬ážáá»áẠ(ááœáŸááºááŒáá»ááºáá áºáá¯) ááá¯áá±ážáá±á¬á¡áá«ááœááºá á€áá±áá¬ááœááºá¡á á±á¬ááá¯ááºážááŸáááá·áºááºááá¯áá»ááºáá áºáá±á¬áá¯ááºáá áºáá¯ááŸááá±á¬áºáááºážá áááºážáááºááá°áá®áá«á á¡ááŸááºááááºááœááºá á¡ááá¯ážááŸááºážáá¯á¶ážá¡ááŒá±á¡áá±ááœááºá QEMU ááẠstartup ááœáẠmemory ááá¯ááœá²áá±áá±ážááŒá®áž ááá¯áá±áá¬ááœááºáá¯ááºáá±ážáá±á¬áá¯ááºááá¯áá±ážáááºá ááŒá¬ážáá¶áá¯ááºááœá¬ážáá±á¬á¡áá«á áá¯ááºááá¯ááœáŸáá·áºáá áºááŒá®áž áá±á¬ááºáá áºáá¯ááẠáááºážááá±áá¬ááœáẠá áááºáá±ážáá¬ážáááºá
áá¯ááºááá¯áá±á·áá¬ááŒá®ážáá±á¬ááºá ááŸá±á¬áºáá¶áá«ááºáá«áá±á¬ááŸáá·áºááœááºááẠáááá¡ááŒáááºááœáẠááá¯ááºáá±á¬ááºááá±ážáá±á¬ ááŒá¬ážáá¶áá
áºáá¯ááœáẠááŸá¬ážááœááºážááŸá¯áá
áºáá¯áá¯ááᯠááœáŸááºáá±ážááŒááºážááŒáá·áº á¡ááŸáá¯ááºáá¯á¶áá»ááºá
á®ážááŒááºážááœáẠáá»áœááºá¯ááºá¡á¬áž áá¡á±á¬ááºááŒááºá
á±ááŒá±á¬ááºáž áá»áœááºá¯ááºááá±á¬áá±á«ááºááá¯ááºáá«áááºá ááá¯á·áá±á¬áº áá±á¬ááºááá¯ááºážááœáẠáá»áœááºá¯ááºááá¯ááºáá±á¬ááºáá»ááºááᯠáá»á±á¬áºááŒááºááẠááŒá¬ážáá¶ááᯠáááºáá°á ááŒááºáááºáá±ážáá¬ážááááºážá Emscripten developer áá»á¬ážá០á¡ááŒá¶áá±ážááá·áºá¡ááá¯ááºáž ááŒá¿áá¬áá
áºáá¯ááŒá¯á¶áá¬áá±á¬á¡áá«ááœáẠáá°áááºážá¡ááºááºááá¯á· ááŒááºááá¯á·áᬠMozilla Record-Replay ááᯠáááºááŸááºááá¯ááºáááº... áá±áá¯áá»á¡á¬ážááŒáá·áºá áá±á¬ááºáá¯á¶ážááœááºá ááá¯ážááŸááºážáá±á¬á¡áá¬áá
áºáá¯ááᯠáá»áœááºáá±á¬áº ááá±á¬áá±á«ááºááá¯ááºáááº- ááá±á¬ááºáá
áºáá¯á
á®á¡ááœááºá a struct TranslationBlock
áááºážááá±á¬áºááŒáá»ááºááŸáá·áºá¡áá°á áááºááŸá¬áá²ááá¯áᬠááá·áºááŸááºážááŒáá·áºáá«... áá«áá²á ááŒá¬ážáá¶ááŸá¬ááŸááá²á· ááááºááá¯á·ááŒááºáž áááá¯ááºáááºáá±ážááŸá¬ ááŸááºáá«áááºá áá«ááᯠááá±á¬áá±á«ááºáá±á¬á· áá»áá¯ááºážáá±á¬áẠ(á¡áááºážáá¯á¶áž ááá»áá¯á·) áá»áá¯ááºážáá±á¬ááºááᯠááŒááºááá¯á· áá¯á¶ážááŒááºááŒá®áž ááŸá±á¬áºáá¶áá«ááºááᯠááá¯ážááá¯ážááŸááºážááŸááºáž áá¯ááºáá
áºááá¯ááºááŒá®áž áá»ááºá
áá¬ážáá¯á¶ážááœá±ááᯠááœáŸá²áá±ážááá¯ááºá struct TranslationBlock
áá¬áá¬ááŒááºáá»áẠáááºááŸáºááᯠááŒááºáááºáááºááŸááºáá±á¬á¡áá«ááœáẠáá»ááºááŒááºá
áœá¬ ááŒááºáá»á±á¬áºááá¯ááºáá±á¬ áá
áºáá¯áááºážáá±á¬ ááá·áºááºáá»áááºáá¬ážáá±á¬ á
á¬áááºážááᯠáááºáá®ážááŒááºážááŸáá·áº ááŸááºáá¬ááºááᯠááœááºá
á±áááºá
á¡áá»áá¯á·áá±á¬ áá»áá¯ááºážáá±á¬ááºáá»á¬ážááẠáá»ááºááŸááá±áááº- á¥ááá¬á áá¯ááºááŒá¬ážáá¶áá»á¬ážááœáẠá¡ááŸááºá¡áá¬ážááŒá¯áá¬ážáá±á¬ á¡ááŸááºá¡áá¬ážáá»á¬áž - á¡áá»áá¯á·ááŸá¬ ááá¯ážááá¯ážááŸááºážááŸááºážááŒá
áºáááºá BinaryenExpressionRef
ááá¯ááá¯áááºááŸá¬á áááºážááá¯á·ááẠáá¯ááºáá¯ááºááá¯ááºáá±á¬ á¡ááŒá±áᶠááá±á¬ááºááœáẠáá»ááºážááŒá±á¬áá·áºááŒáá·áº ááá·áºáááá·áº á¡áá¯á¶ážá¡ááŸá¯ááºážáá»á¬ážááᯠááŒáá·áºáááºá á¡ááá¯ááºážááẠBBs áá»á¬ážááŒá¬áž á¡ááœááºáá°ážááŒá±á¬ááºážáá±áž á¡ááŒá±á¡áá±á á¡ááá¯ááºážááẠááœá¬ážáááá·áºáá±áᬠááŒá
áºáááºá á¡ááŒá±á¡áá±á¡á áá»áááºáááºáááºááá¯á¡ááºááá·áº Relooper á¡ááœáẠááŒááºáááºáá¬ážááŒá®ážáá¬áž áá¯ááºááœááºáá»á¬ážááŸááá«áááºá áááºážááá¯á·ááᯠááœá²ááŒá¬ážááááŒááºáááºá áááºážááá¯á·á¡á¬ážáá¯á¶ážááᯠá¡áááºážáá¯á¶áž áá±ážááá¯ááºááŒáá·áº áá»áááºááŸááá¬ážááŒá±á¬ááºáž áá°ááá»ááºááᯠá¡áá¯á¶ážááŒá¯áá¬ážáá±á¬ááŒá±á¬áá·áº á¡ááœáŸááºážá¡ááœáẠáááá¬áááºááŸá¬ážáá±á¬ áá
áºááŸá
áºáá»á±á¬ááºážááᯠáá±ážáááºážá
áœá¬ á¡áá¯á¶ážááŒá¯ááá¯ááºááŒá®áž ááá¯á¡ááºáá«á áááºážááᯠáááºááŸá¬ážááẠááŸááºáá¬ážáá¬ážááẠááá¯á¡ááºáá«áááºá á
áá¬ážáá
ááºá TCG á
ááºááá¯ááºážá០ááœááºáááá·áº á¡ááŒá±á¬ááºážáááºážááᯠááœáŸááºááŒáááºá¡ááœáẠááá¯áá²á·ááá¯á·áá±á¬ á¡ááœáŸááºážáá»á¬ážááᯠQEMU ááœáẠá¡áá¯á¶ážááŒá¯áá¬ážááŒá®ážááŒá
áºáááºá
Binaryen ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážá
WebAssembly ááŸá áá±á¬áºáá»á°ážáá»á¬ážááœáẠáá¯ááºáá±á¬ááºáá»ááºáá áºáá¯á á®ááœáẠááá¯ááºááá¹áá¬áá áºáá¯á á®áá«áááºáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž áá«áááºáá«áááºá á¡áá¯á¶ážá¡ááŸá¯ááºážáá»á¬ážááẠunary ááŸáá·áº binary áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá á¡ááŒá¬ážáá±á¬áºááŒáá»ááºáá»á¬ážá á¬áááºážáá»á¬ážá ááááºážáá»á¯ááºá á®ážáááºážááŸá¯ á áááºááá¯á·áá«áááºááá·áº ááááºááá¯á·ááŸá¯áá»á¬ážááŒá áºáááºá áá«ááŒá±á¬ááŒá®ážáá¬ážá¡ááá¯ááºážá á€áá±áá¬ááœáẠááááºážáá»á¯ááºááŸá¯á á®ážáááºážááŸá¯ááᯠá¡ááá·áºááŒáá·áºá¡ááá¯ááºážá¡áááºáá»á¬ážá ááœááºážáááºáá»á¬ážá áá¯ááºáá±á¬ááºáá»ááºáá±á«áºááá¯ááŸá¯áá»á¬áž á áááºááŒáá·áº á¡ááá¡áá»ááœá²á·á ááºážáá¬ážáááºá áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá¡ááœáẠá¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážááᯠstack ááœáẠááá±ážááá¯á·áá±á¬áºáááºáž JS ááœááºáá²á·ááá¯á· ááŒááºáá¬ážá áœá¬ áá¯ááºáá±á¬ááºáá«áááºá ááá¹áá¬áá¯á¶ážááá¯ááºáᬠááááºážááŸááºáá»á¬ážáááºáž ááŸááá«áááºá ááá¯á·áá±á¬áº áááºážááá¯á·ááᯠáá»áœááºá¯áẠááá¯á¶ážááá±ážáá±á¬ááŒá±á¬áá·áº áááºážááá¯á·á¡ááŒá±á¬ááºáž ááá·áºá¡á¬áž ááŒá±á¬ááŒáááºááá¯ááºáá«á
áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááœáẠáá¯áááŸáá±ááœááºáá¬ážáá±á¬á á¡áá»áá¯ážá¡á á¬áž- int32 / int64 / float / double ááá¯á·áá«ááŸááááºá á€ááá á¹á ááœááºá ááá n local variable áá»á¬ážááẠfunction ááá¯á·áá±ážááá¯á·áá±á¬ arguments áá»á¬ážááŒá áºáááºá á€áá±áá¬ááŸá á¡áá¬á¡á¬ážáá¯á¶ážááẠááááºážáá»á¯ááºá á®ážáááºážááŸá¯ááá¯ááºáᬠáááºááŸááºáá»ááºáá»á¬ážááœáẠáá¯á¶ážáá¡ááá·áºáááá·áºááá¯ááºáá±á¬áºáááºážá ááááºážááŒáá·áºáá»á¬ážááẠ"áááºááŸááºáááá¯ážáá¬ážáá±á¬/áááºááŸááºáááá¯ážáá¬ážáá±á¬" áááºááœáŸááºážáá»ááºááᯠááááºáá±á¬ááºááá¯ááºáá±ážááŒá±á¬ááºáž áá»á±ážáá°ážááŒá¯á áááááŒá¯áá«- áá¶áá«ááºááẠáááºáááºáá¯ááºáá±á«áºááœááºáá°áááºáá«áááºá
áá±áá¯áá»á¡á¬ážááŒáá·áºááŒá±á¬ááá»áŸáẠBinaryen áááºáá±á¬ááºáá¶á·áá±ážáááºá
ááá¯á·áá±á¬áºá áááºááẠáááá¯á¡ááºáá² á áá¬ážááŒááºáááºáá®ážááŒááºážááŸáá·áº áá»ááºááŒááºážáááŸááá² áá¯ááºááᯠáá»á¶áááºážááŒááºážááœáẠá¡áááá¹áá¬ááºááŒááºááá¯ááá¯áá«áá á€áá¯áá¹áááá±áááᯠC++ ááá¯ááºáá áºáá¯áá²ááá¯á· ááá·áºááœááºážááŒááºážááẠá¡áááá¹áá¬ááºááŸáááŒá®áž ááá¯ááŸáá±á á á¬ááŒáá·áºááá¯ááºá C++ API áá áºáá¯áá¯á¶ážááᯠááá¯ááºááá¯ááºá á®áá¶ááá·áºááœá²áá«á á¡áááºááá·áºááᯠáá»á±á¬áºááŒááºáá«á áá¯ááºááá¯ážááŒááºážáá»á¬áž ááŒá¯áá¯ááºáá²á·áááºá
áá«ááŒá±á¬áá·áº áá¯ááºááᯠáá¯ááºáá±ážááá¯á· ááá¯áá«áááºá
// МаÑÑÑПОÑÑ Ð³Ð»ÐŸÐ±Ð°Ð»ÑÐœÑе паÑаЌеÑÑÑ (ЌПжМП пПЌеМÑÑÑ Ð¿ÐŸÑПЌ)
BinaryenSetAPITracing(0);
BinaryenSetOptimizeLevel(3);
BinaryenSetShrinkLevel(2);
// ÑПзЎаÑÑ ÐŒÐŸÐŽÑлÑ
BinaryenModuleRef MODULE = BinaryenModuleCreate();
// ПпОÑаÑÑ ÑÐžÐ¿Ñ ÑÑМкÑОй (как ÑПзЎаваеЌÑÑ
, Ñак О вÑзÑваеЌÑÑ
)
helper_type BinaryenAddFunctionType(MODULE, "helper-func", BinaryenTypeInt32(), int32_helper_args, ARRAY_SIZE(int32_helper_args));
// (int23_helper_args пÑОПб^WÑПзЎаÑÑÑÑ ÐŸÑЎелÑМП)
// ÑкПМÑÑÑÑОÑПваÑÑ ÑÑпеÑ-Ќега вÑÑажеМОе
// ... ÐœÑ ÑÑÑ Ñж Ð²Ñ ÐºÐ°Ðº-МОбÑÐŽÑ ÑаЌО :)
// пПÑПЌ ÑПзЎаÑÑ ÑÑМкÑОÑ
BinaryenAddFunction(MODULE, "tb_fun", tb_func_type, func_locals, FUNC_LOCALS_COUNT, expr);
BinaryenAddFunctionExport(MODULE, "tb_fun", "tb_fun");
...
BinaryenSetMemory(MODULE, (1 << 15) - 1, -1, NULL, NULL, NULL, NULL, NULL, 0, 0);
BinaryenAddMemoryImport(MODULE, NULL, "env", "memory", 0);
BinaryenAddTableImport(MODULE, NULL, "env", "tb_funcs");
// запÑПÑОÑÑ Ð²Ð°Ð»ÐžÐŽÐ°ÑÐžÑ Ðž ПпÑОЌОзаÑÐžÑ Ð¿ÑО желаМОО
assert (BinaryenModuleValidate(MODULE));
BinaryenModuleOptimize(MODULE);
... áá áºáá¯áᯠáá±á·ááœá¬ážáá²á·ááẠáá±á¬ááºážáááºáá«áááºá áá«á á¡ááá¯ááºážá¡áá¬ááᯠááá¯ááºá á¬ážááŒá¯ááá¯á· áááºáááºááŒá áºááŒá®áž á¡áá±ážá ááẠá¡áá»ááºá¡áááºááœá±ááᯠá á¬ááœááºá á¬áááºážáá²ááŸá¬ áá«áá«áááºá
ááá¯ááœáẠcrack-fex-pex ááẠá€áá²á·ááá¯á·áá±á¬ á¡áá¬áá áºáᯠá áááºáá±ááŒá®ááŒá áºáááºá
static char buf[1 << 20];
BinaryenModuleOptimize(MODULE);
BinaryenSetMemory(MODULE, 0, -1, NULL, NULL, NULL, NULL, NULL, 0, 0);
int sz = BinaryenModuleWrite(MODULE, buf, sizeof(buf));
BinaryenModuleDispose(MODULE);
EM_ASM({
var module = new WebAssembly.Module(new Uint8Array(wasmMemory.buffer, $0, $1));
var fptr = $2;
var instance = new WebAssembly.Instance(module, {
'env': {
'memory': wasmMemory,
// ...
}
);
// О Ð²ÐŸÑ Ñже Ñ Ð²Ð°Ñ ÐµÑÑÑ instance!
}, buf, sz);
QEMU ááŸáá·áº JS á ââááá¹áá¬áá»á¬ážááᯠáá
áºáááºážáááºážááŒáá·áº áá»áááºáááºááŒá®áž áá
áºáá»áááºáááºážááœáẠá
á¯á
ááºážáá¬ážáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá»ááºááŒááºá
áœá¬ áááºáá±á¬ááºááá¯ááºáááºá array áá
áºáᯠ( launcher á¡ááœááºážááá¯á· áááºááœááºážááẠáá¯ááºáá±á¬ááºáá»ááºááá¬ážáá
áºáá¯) ááᯠáááºáá®ážáá²á·ááŒá®áž áá¯ááºáá¯ááºáá¬ážáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠááá¯áá±áá¬ááœáẠáá¬ážááŸááá²á·áááºá á¡ááœáŸááºážááááºážááᯠáá»ááºááŒááºá
áœá¬ááœááºáá»ááºáááºá áá¯áá
áá¬ážáá¯á¶ážáá¬áá¬ááŒááºááœááºá á¡ááœáŸááºážááááºážááᯠá¡á
ááá¯ááºážááœáẠáááºážá¡ááŒá
áºá¡áá¯á¶ážááŒá¯áá²á·áá±á¬áºáááºážá ááá¯á·áá±á¬ááºááœáẠá€áá±á¬áºááŒá°áá¬ááá¯á¡áá¯á¶ážááŒá¯á ááœááºáá»ááºáá¬ážáá±á¬ á¡ááœáŸááºážááẠá¡ááœááºáá²ááœáẠááá¯ážááŸááºážá
áœá¬ á¡á¶áááºááœá¬ážáá²á·áááºá struct TranslationBlock
.
á
áá¬ážáá
ááº,
áá±á¬áá±á¬áááºáá±á¬á· áá®áá±á¬ááºáá«áá²á á áááºáá«áááºá á¬ážáá²á·áá°ááŸáááẠáá±á¬ááºáá±á¬ááºážáá«ážáá áºáá¯áẠááŸááá±á¬ááºážááŸááá«áááá·áºáááºá ááŒá±á¬áááẠá¡áááºážáá¯á¶ážáá±á¬á· áá»ááºáá±ážáááºá áᬠááááºááá¯á·áááááá¬áá»á¬ážááᯠá¡áá¯ááºáá¯ááºá á±áá«á áá°áááºáž module á¡áááºááá·áºáááŒá áºáá®á¡áá á€á¡áá¬á¡á¬ážáá¯á¶ážááᯠáá¯ááºáá±á¬ááºááá¯ááºáá±á¬ á áá¬ážááŒááºáá áºáŠážááŸááá±áá²ááŒá áºáá±á¬ááŒá±á¬áá·áº JS ááá¹áá¬ááœáẠáá¯á¶ážá á¶á¡ááá¯ááºáž WebAssembly modules áá»á¬ážááᯠá¡áá®á¡áá»áŸ á á¯á ááºážáá¬ážááŒááºážáááºáááºáž á¡áááá¹áá¬ááºááŸááá±áááºá
áá±á¬ááºáá¯á¶ážá¡áá±áá²á· ááá±á ááá áºáᯠáááºááẠ32-bit áááá¯áá¬áá áºáá¯ááœáẠbinary áá áºáá¯ááᯠááŒá¯á á¯áá¬ážáá±á¬áºáááºáž áá¯ááºááẠáááºááá¯áá®áá¯ááºáá±á¬ááºááŸá¯áá»á¬ážááŸáá áºááá·áº Binaryená stack áá±á«áºááŸááá áºáá±áᬠááá¯á·ááá¯áẠ2-bit address space á á¡ááẠ32 GB ááŸá á¡ááŒá¬ážáá áºáá±áá¬ááœáẠáááºáá¬áá«áááºá ááŒá¿áá¬ááŸá¬ Binaryen áá¡ááŒááºá¡á áááºážááẠááŒá®ážáá¬ážááœááºážáá±á¬ ááááºááááºá á¬ááᯠááá°áá±ááŒááºážáááºááŒá áºáááºá áá®áá¬ážááᯠáááºááá¯ááœá¬ážáááá²á
Admin áá²á·áá¯á¶á á¶áá²á·
áá« áá«ááᯠáá ááºážáááºáá² á¡áá¯á¶ážááááºáá²á·áá±ááá·áº áá«á·áá²á· ááááá¯á¶áž á¡ááœá±ážá "áá« 32-bit Linux ááᯠinstall áá¯ááºáá¬ážááẠáá¬ááŒá áºááá²" ááá¯á·áá±á¬áẠaddress space á á¡áá±á«áºááá¯ááºážááᯠkernel á ááááºážááá¯ááºáááá·áºáááºá áá áºáá¯áááºážáá±á¬áá±ážááœááºážááŸá¬ 1 ááá¯á·ááá¯áẠ2 Gb áááºáá»áŸááááºážááá¯ááºáááºáááºážá
áááá¯ááááºáá¬áááºážáááºážááŒáá·áº (áá±á·áá»áá·áºáá°áá»á¬ážá¡ááœáẠááœá±ážáá»ááºááŸá¯)
ááááºá á¬áá±áá¬á ááááºááœáẠáá°áá±á¬ááºážáá áºáᯠááŸá¯ááºáá¯ááºááŒáá«á áá¯á·á á¡á²áá«áá¬ááŒá±á¬áá·áº á¡áá¯ááºááŒá áºáááºááá¯áᬠáá»áœááºáá±á¬áºááá¯ááºááá¯áẠáá¬ážááááºáá°ážá ááŒá®ážááŒá® stack áá áºáá¯ááŸáááááºá áá«áá±ááá·áº "áá«ááá¯á·á áá±á·áá»áá·áºáá°ááœá±á á¡áá¬á¡á¬ážáá¯á¶áž áá«ááá¯á·á¡ááœáẠá¡áááºááŒá±áááºá ââáá«áá±ááá·áº áá¬ááŒá±á¬áá·áºáá²ááá¯áᬠáááºáá°á០áááááŒáá°áž..."
// 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 ááá¯ááºááá¯ááºá áá°ááá¯ááºážááᯠááá¯áá±áá¬á០ááœááºážáá¯ááºááá¯ááºááẠá :)
á€áá¯ááºá á¡áá¯ááºáá¯ááºáá¯á¶ááᯠáá áºá á¯á¶áá áºáá±á¬ááºá ááá¯ááá¯áá±á¬ááºážááœááºá áœá¬ ááŸááºážááŒáá±ážáááá·áºáááº...
source: www.habr.com