QEMU.js: ua ogaoga ma ua iai le WASM

I se tasi taimi na ou filifili ai mo le fiafia fa'amaonia le fa'afoliga o le fa'agasologa ma a'oa'o pe fa'apefea ona fa'atupu le Javascript (sili atu sa'o, Asm.js) mai le fa'ailoga masini. Na filifilia le QEMU mo le suʻega, ma i se taimi mulimuli ane na tusia ai se tala i luga o Habr. I faʻamatalaga na fautuaina aʻu e toe fai le poloketi i WebAssembly, ma e oʻo lava ina tuʻu aʻu toeitiiti uma Ou te leʻi manaʻo i le poloketi ... O loʻo faʻaauau le galuega, ae matua lemu, ma o lenei, talu ai nei i lena tusiga na aliali mai. faʻamatalaga i le autu “O lea na faapefea ona iʻu uma?” I le tali atu i laʻu tali auiliili, na ou faalogoina "E foliga mai o se tusiga." Ia, afai e te mafaia, o le ai ai se tusiga. Atonu o le a maua e se tasi e aoga. Mai lea mea o le a aʻoaʻoina ai e le tagata faitau ni mea moni e uiga i le mamanu o le QEMU code generation backends, faʻapea foʻi ma le auala e tusi ai se Just-in-Time compiler mo se upega tafaʻilagi.

Galuega

Talu ai ua uma ona ou aʻoaʻoina pe faʻafefea ona faʻaogaina le QEMU i le JavaScript, o le taimi lea na filifili ai e fai ma le poto ma aua le toe faia mea sese tuai.

Sese numera tasi: lala mai le fa'asa'olotoga

O la'u mea sese muamua lava o le tu'u lea o la'u lomiga mai le pito i luga o le 2.4.1. Ona foliga mai lea ia te aʻu o se manatu lelei: afai o loʻo i ai le faʻamatuʻuina o mataʻitusi, atonu e sili atu le mautu nai lo le faigofie 2.4, ma sili atu foi le lala. master. Ma talu ai na ou fuafua e faʻaopoopo se aofaiga talafeagai o aʻu lava bug, ou te le manaʻomia lava se isi tagata. Masalo o le mea lena na tupu. Ae o le mea lenei: QEMU e le tumau, ma i se taimi na latou faʻasalalauina le faʻaogaina o le code faʻatupuina i le pasene 10. "Ioe, o lenei o le a ou faʻamalo," na ou mafaufau ai ma malepe. O iinei e tatau ona tatou faia se digression: ona o le natura tasi-fila o QEMU.js ma le mea moni e faapea o le uluai QEMU e le o faauigaina le leai o le tele-threading (o lona uiga, le mafai ona faagaoioia i le taimi e tasi le tele o ala code e le fesootai, ma e le naʻo le "faʻaaogaina fatu uma") e taua tele mo ia, o galuega autu o filo sa tatau ona ou "liliu ese" ina ia mafai ona valaʻau mai fafo. Na tupu ai ni fa'afitauli fa'anatura i le taimi o le tu'ufa'atasiga. Ae ui i lea, o le mea moni o nisi o suiga mai le lala master, lea na ou taumafai ai e tuʻufaʻatasia laʻu code, na filifilia foʻi le cherry i le faʻamalolo o le mata (ma o le mea lea i laʻu paranesi) atonu o le a le faʻaopoopoina le faigofie.

I se tulaga lautele, na ou filifili ai e talafeagai lava le lafo i fafo o le faʻataʻitaʻiga, faʻamavae mo vaega ma fausia se faʻamatalaga fou mai le sasa e faʻavae i luga o se mea fou ma mai le taimi nei. master.

Mease numera lua: auala TLP

O le mea moni, e le o se mea sese lea; i se tulaga lautele, ua na o se vaega o le fatuina o se poloketi i tulaga o le le malamalama atoatoa i le "mea ma le auala e alu ai?" ma i se tulaga lautele "tatou te oʻo i ai?" I nei tulaga fa'akomepiuta fa'aletonu o se filifiliga talafeagai, ae, e masani lava, ou te leʻi manaʻo e toe fai faʻafuaseʻi. O le taimi lea na ou manaʻo ai e fai ma le poto: faʻataunuʻu atomic, suiga o tulafono faʻapitoa (ae le o le "faʻapipiʻi faʻatasi faʻatasi seʻia oʻo ina faʻapipiʻi (ma lapataiga)", e pei ona fai mai ai Linus Torvalds e uiga i se tasi, e tusa ai ma Wikiquote), ma isi.

Mease numera tolu: alu i totonu o le vai e aunoa ma le iloaina o le ala

Ou te leʻi faʻaumatia atoa lenei mea, ae o lea ua ou filifili e aua le mulimuli i le ala e sili ona tetee, ma ia faia "o se tagata matua," o lona uiga, tusi laʻu pito i tua TCG mai le sasa, ina ia le e tatau ona fai atu mulimuli ane, "Ioe, o le mea moni lenei, lemu, ae e le mafai ona ou pulea mea uma - o le auala lena e tusia ai le TCI ..." E le gata i lea, o lenei mea muamua na foliga mai o se fofo manino, talu ai Ou te gaosia le code binary. E pei ona latou fai mai, "Ghent faapotopotoу, ae le o le tasi ": o le code, ioe, binary, ae e le mafai ona naʻo le faʻafeiloaʻi atu i ai - e tatau ona tuleia manino i totonu o le browser mo le tuufaatasia, e mafua ai se mea mai le lalolagi JS, lea e manaʻomia pea. ia faaolaina i se mea. Ae ui i lea, i luga o fausaga masani a le RISC, e tusa ai ma loʻu malamalama, o se tulaga masani o le manaʻoga e toe setiina le faʻatonuga o le cache mo le toe faʻafouina - pe afai e le o le mea lea tatou te manaʻomia, i soʻo se tulaga, ua latalata. E le gata i lea, mai laʻu taumafaiga mulimuli, na ou aʻoaʻoina ai o le pulea e foliga mai e le faʻafeiloaʻi i le ogatotonu o le faʻaliliuga poloka, o lea matou te le manaʻomia ai le bytecode faʻamatalaina mai soʻo se offset, ma e mafai ona matou gaosia mai le galuega i luga o le TB. .

Na latou o mai ma kiki

E ui na amata ona ou toe tusia le code i tua ia Iulai, o se togafiti faʻataulāitu na sosolo e aunoa ma se iloa: e masani lava o tusi mai GitHub e oʻo mai o faʻamatalaga e uiga i tali i Faʻamatalaga ma Toso talosaga, ae o iinei, fa'afuase'i ta'ua i le filo Binaryen o se qemu pito i tua i le talaaga, "Na ia faia se mea faapena, atonu o le a ia fai mai se mea." Sa matou talanoa e uiga i le faʻaaogaina o le faletusi a Emscripten Binaryen e fatu ai WASM JIT. Ia, na ou fai atu o loʻo i ai sau laisene Apache 2.0 iina, ma QEMU atoa o loʻo tufatufaina i lalo o le GPLv2, ma e le fetaui lelei. Na teʻi lava ua iloa e mafai ona maua se laisene toe faaleleia i se auala (Ou te le iloa: atonu e suia, atonu lua laisene, atonu o se isi mea...). O lenei, ioe, na ou fiafia ai, aua e oo mai i lena taimi ua uma ona ou tilotilo totoa i ai fa'avasegaina binary WebAssembly, ma sa ou faanoanoa ma le malamalama. Sa iai fo'i se faletusi o le a 'aina poloka fa'avae fa'atasi ai ma le kalafi fa'asolo, maua ai le bytecode, ma fa'atautaia i le fa'aliliuupu lava ia, pe a mana'omia.

Ona toe iai lea se tusi i luga o le lisi o meli QEMU, ae e sili atu lenei i le fesili, "O ai e manaʻomia?" Ma o lea lava fa'afuase'i, na iloa ai e tatau. I se tulaga maualalo, e mafai ona e vaʻaia faʻatasi avanoa nei e faʻaoga ai, pe afai e galue vave pe itiiti ifo:

  • fa'alauiloa se mea fa'aa'oa'oga e aunoa ma se fa'apipi'iina
  • virtualization i luga o iOS, lea, e tusa ai ma tala, na o le pau lava le talosaga e iai le aia tatau e faʻatupu ai le faʻasologa i luga o le lele o se afi JS (pe moni lenei mea?)
  • faʻataʻitaʻiga o le mini-OS - tasi-floppy, fausia-i totonu, ituaiga uma o firmware, ma isi ...

Fa'amatalaga Taimi Taimi su'esu'e

E pei ona ou fai atu, QEMU o loʻo nonoa i le multithreading, ae e le o maua e le browser. Ia, o lona uiga, leai ... I le taimi muamua e leʻi i ai, ona faʻaalia ai lea o WebWorkers - e tusa ai ma loʻu malamalama, o le multithreading lea e faʻavae i luga o le feʻau pasi. e aunoa ma ni fesuiaiga fa'asoa. E masani lava, o lenei mea e tupu ai faʻafitauli ogaoga pe a faʻapipiʻi le code o loʻo i ai e faʻavae i luga o le faʻataʻitaʻiga manatua faʻasoa. Ona, i lalo o le uunaiga a le lautele, sa faatinoina foi i lalo o le igoa SharedArrayBuffers. Na faasolosolo malie ona faʻafeiloaʻi, na latou faʻamanatuina lona faʻalauiloaina i suʻesuʻega eseese, ona latou faʻamanatuina lea o le Tausaga Fou, ona Meltdown ... Ina ua maeʻa ona latou oʻo mai i le faaiuga e faʻafefe pe faʻafefete le fuaina o le taimi, ae faʻatasi ai ma le fesoasoani o mafaufauga faʻasoa ma se filo fa'aopoopo le fata, e tutusa uma lava o le a galue lelei lava. O lea na matou fa'agata ai le tele o filo fa'atasi ma mafaufauga fa'asoa. E foliga mai na latou toe faʻafoʻi mulimuli ane, ae, e pei ona manino mai le faʻataʻitaʻiga muamua, o loʻo i ai le olaga e aunoa ma lea, ma afai o lea, o le a tatou taumafai e fai e aunoa ma le faʻalagolago i le tele o filo.

O le vaega lona lua o le le mafai ona faʻaogaina le faʻaogaina o le faʻaputu: e le mafai ona e ave, faʻasaoina le tala o loʻo i ai nei ma sui i se mea fou ma se faaputuga fou. O le fa'aputuga telefoni e pulea e le JS virtual machine. E foliga mai, o le a le faʻafitauli, talu ai na matou filifili pea e faʻatautaia le tafe muamua ma le lima? O le mea moni o le poloka I/O i le QEMU o lo'o fa'atinoina e ala i coroutines, ma o le mea lea o le a fa'aogaina ai le fa'aogaina o fa'aputuga maualalo. O le mea e lelei ai, o Emscipten ua uma ona iai se masini mo faʻagaioiga asynchronous, e oʻo lava i le lua: Asyncify и Emterpreter. O le mea muamua e galue e ala i le faʻatupuina o le JavaScript code ma ua le toe lagolagoina. O le lona lua o le "auala sa'o" o lo'o iai nei ma e galue i le bytecode generation mo le fa'aliliu upu. E aoga, ioe, lemu, ae e le faʻafefe ai le code. E moni, o le lagolago mo coroutines mo lenei masini e tatau ona saofagā tutoatasi (ua uma ona tusia coroutines mo Asyncify ma sa i ai se faʻatinoga o le API tutusa mo Emterpreter, naʻo lou manaʻomia e faʻafesoʻotaʻi).

I le taimi nei, ou te leʻi mafai lava ona vaeluaina le code i le tasi na tuʻufaʻatasia i le WASM ma faʻamatalaina e faʻaaoga ai le Emterpreter, o lea e leʻi galue ai masini poloka (vaai i le isi faasologa, e pei ona latou fai mai ai ...). O lona uiga, i le faaiuga e tatau ona e mauaina se mea e pei o lenei mea malie malie:

  • fa'amatalaina poloka I/O. Ia, na e faʻamoemoeina faʻataʻitaʻiina NVMe ma faʻatinoga masani? 🙂
  • fa'apipi'i fa'atutusa fa'ailoga QEMU (faaliliu, isi masini fa'atusa, ma isi)
  • tu'ufa'atasia fa'ailoga malo fa'apitoa ile WASM

Fa'amatalaga o puna'oa QEMU

E pei ona e matemateina, o le tulafono mo le faʻataʻitaʻiina o tusiata fale ma le faʻailoga mo le faʻatupuina o faʻatonuga masini talimalo e vavae ese ile QEMU. O le mea moni, e sili atu le taufaasese:

  • o lo'o i ai fa'ailoga fa'atagata asiasi
  • o fa'avave, o loʻo taʻua, KVM mo le faʻaogaina o meafaigaluega i luga o Linux (mo malo ma talimalo faʻapitoa e fetaui ma le tasi), TCG mo le JIT code generation i soʻo se mea. Amata ile QEMU 2.9, lagolago mo le HAXM hardware virtualization standard i Windows na faʻaalia (auiliiliga)
  • afai e faʻaaogaina le TCG ae le o le faʻaogaina o meafaigaluega, ona iai lea o le lagolago faʻavae faʻavae mo taʻitasi fale talimalo, faʻapea foʻi ma le faʻaliliuga lautele.
  • ... ma faʻataʻamilo i nei mea uma - faʻataʻitaʻiina peripherals, faʻaoga faʻaoga, femalagaiga, faʻamaumauga-replay, ma isi.

I le ala, na e iloa: QEMU e mafai ona faʻataʻitaʻiina e le gata i le komepiuta atoa, ae faʻapea foʻi ma le faʻaogaina mo se faʻaoga eseʻese faʻaoga i totonu o le fatu talimalo, lea e faʻaaogaina, mo se faʻataʻitaʻiga, e le AFL fuzzer mo meafaigaluega binary. Masalo e mana'o se tasi e fa'afeiloa'i lenei faiga o le QEMU i le JS? 😉

E pei o le tele o polokalama e leai se totogi, QEMU e fausia e ala i le telefoni configure и make. Fa'apea e te filifili e fa'aopoopo se mea: o se TCG tua, fa'atinoga o filo, se isi mea. Aua le faanatinati e fiafia / fefe (vase lalo pe a talafeagai) i le faʻamoemoe e fesoʻotaʻi ma Autoconf - o le mea moni, configure O le QEMU e foliga mai na tusia e le tagata lava ia ma e le maua mai se mea.

Upega tafaʻilagi

O le a la lenei mea e taʻua o WebAssembly (aka WASM)? Ole sui lea ole Asm.js, e le o toe faafoliga o se code JavaScript aoga. I se isi itu, e mama ma sili ona lelei, ma e oʻo lava i le na o le tusiaina o se integer i totonu e le faigofie tele: mo le faʻatusatusa, o loʻo teuina i le faatulagaga. LEB128.

Atonu na e faʻalogo e uiga i le toe faʻaleleia algorithm mo Asm.js - o le toe faʻafoʻisia lea o faʻatonuga o le faʻatonutonuina o le tafe "maualuga" (o lona uiga, pe afai-o le isi, matasele, ma isi), lea e mamanuina ai masini JS, mai. le maualalo-tulaga LLVM IR, latalata i le masini code faʻatinoina e le processor. E masani lava, o le sui o le QEMU e latalata i le lona lua. E foliga mai o iinei, bytecode, o le iuga o le tiga ... Ona i ai lea o poloka, afai-o le isi ma faʻamau!..

Ma o le isi lea mafuaʻaga e aoga ai Binaryen: e mafai ona talia masani poloka tulaga maualuga latalata i mea o le a teuina i WASM. Ae e mafai foi ona maua mai le code mai se kalafi o poloka faavae ma suiga i le va o latou. Ia, ua uma ona ou fai atu e natia le WebAssembly storage format i tua o le C / C ++ API faigofie.

TCG (Tiny Code Generator)

GTC sa muamua backend mo le C compiler. Ona, e foliga mai, e le mafai ona tetee atu i le tauvaga ma le GCC, ae i le faaiuga na maua lona nofoaga i le QEMU o se faiga faʻavae code mo le tulaga talimalo. O loʻo i ai foʻi le TCG backend e faʻatupuina ai ni bytecode abstract, lea e vave faʻatinoina e le faʻamatala, ae na ou filifili e aloese mai le faʻaaogaina i lenei taimi. Ae ui i lea, o le mea moni e faapea i QEMU ua uma ona mafai ona faʻatagaina le suiga i le TB gaosia e ala i le galuega tcg_qemu_tb_exec, na iu ina aoga tele mo au.

Ina ia fa'aopoopo se TCG pito i tua i le QEMU, e tatau ona e faia se subdirectory tcg/<имя архитектуры> (i lenei tulaga, tcg/binaryen), ma o loʻo i ai faila e lua: tcg-target.h и tcg-target.inc.c и faatonuina e uiga i mea uma configure. E mafai ona e tuʻuina isi faila iina, ae, e pei ona mafai ona e mateina mai igoa o nei mea e lua, o le a aofia uma i latou i se mea: tasi e fai ma faila faila masani (o loʻo aofia i totonu. tcg/tcg.h, ma o lena ua uma ona i totonu o isi faila i totonu o faʻamaumauga tcg, accel ma e le gata), o le isi - na o se snippet code in tcg/tcg.c, ae o loʻo avanoa i ana galuega faʻapitoa.

O le filifili o le a ou faʻaaluina le tele o le taimi i suʻesuʻega auiliili o le auala e galue ai, na ou kopiina le "skeletons" o nei faila e lua mai se isi faʻatinoga pito i tua, faʻaalia ma le faamaoni lenei mea i le ulutala laisene.

faila tcg-target.h 'olo'o iai fa'atonuga ile fomu #define-s:

  • e fia tusi resitala ma pe o le a le lautele o loʻo i ai i luga o le fausaga faʻatulagaina (e tele a matou mea matou te mananaʻo ai, i le tele matou te mananaʻo ai - o le fesili e sili atu e uiga i le mea o le a faʻatupuina i le code sili atu ona lelei e le browser i luga o le fausaga "matua taulaʻi" ...)
  • alignment of host instructions: on x86, ma e oo lava i TCI, faatonuga e le ogatusa uma, ae o le a ou tuu i totonu o le code buffer e le o faatonuga, ae faasino i Binaryen faletusi fausaga, o lea ou te fai atu: 4 paita
  • o a faatonuga e filifili ai e mafai ona gaosia e le pito i tua - matou te aofia ai mea uma matou te maua i Binaryen, tuʻu le faʻavavevave e talepe le isi vaega i ni mea faigofie lava.
  • O le a le tele o le TLB cache e talosagaina e le pito i tua. O le mea moni o le QEMU e ogaoga mea uma: e ui lava o loʻo i ai galuega fesoasoani e faʻatino ai uta / faleoloa e faʻatatau i le MMU malo (o fea o le a tatou i ai e aunoa ma le taimi nei?), latou te faʻasaoina a latou faʻaliliuga faʻaliliuga i foliga o se fausaga, le e faigofie ona fa'apipi'i sa'o i poloka fa'asalalauga. O le fesili, o le a le offset i totonu o lenei fausaga e sili ona lelei le faʻatinoina e se faʻasologa laʻititi ma vave o poloaiga?
  • O iinei e mafai ona e faʻaogaina le faʻamoemoega o se tasi pe lua tusi resitala faʻaagaga, faʻatagaina le valaʻau TB e ala i se galuega ma faʻamatala faʻamatala se ulugalii laiti. inline-galuega e pei o flush_icache_range (ae le o le matou tulaga lea)

faila tcg-target.inc.c, ioe, e masani lava e sili atu le lapopoa ma e aofia ai le tele o galuega faʻatulafonoina:

  • amataga, e aofia ai tapula'a e mafai ona fa'agaioi ai fa'atonuga po'o fea ooperands. Na ou kopiina manino mai le isi pito i tua
  • galuega e mana'omia ai le fa'atonuga o le bytecode totonu
  • E mafai fo'i ona e tu'u galuega fa'aausilali iinei, ma e mafai fo'i ona e fa'aogaina galuega fa'apitoa mai tcg/tcg.c

Mo aʻu lava, na ou filifilia le taʻiala lenei: i upu muamua o le isi faʻaliliuga poloka, na ou tusia i lalo ni faʻailoga se fa: o se faailoga amata (o se tulaga taua i le lata ane. 0xFFFFFFFF, lea na fa'amauina ai le tulaga o lo'o i ai nei o le TB), fa'amatalaga, fa'avae fa'atupu, ma numera fa'ataulāitu mo le fa'apipi'iina. I le taimi muamua na tuu ai le faailoga i totonu 0xFFFFFFFF - nfea n - o se numera lelei laʻititi, ma o taimi uma na faʻatinoina e ala i le faʻaliliuina na faʻateleina i le 1. 0xFFFFFFFE, tu'ufa'atasiga na tupu, na fa'asaoina le module i le laulau fa'atino, fa'aulufale mai i totonu o se tama'i "launcher", lea na alu atu ai le fa'atinoga. tcg_qemu_tb_exec, ma na aveese le module mai le QEMU memory.

Ina ia toe faaupuina le masani, "Crutch, o le a le tele o loʻo fesoʻotaʻi i lenei leo mo le fatu o le proger ...". Ae ui i lea, o le manatua na tafe i se mea. E le gata i lea, o le manatua na pulea e QEMU! Sa ia te aʻu se code lea, pe a tusia le isi faatonuga (lelei, o lona uiga, o se faʻailoga), tape le tasi o loʻo i ai lona sootaga i lenei nofoaga muamua, ae e leʻi fesoasoani. O le mea moni, i le tulaga sili ona faigofie, QEMU tuʻufaʻatasia manatua i le amataga ma tusi ai le code na faia iina. A uma le paʻu, e lafoina le code ma amata ona tusia le isi i lona tulaga.

Ina ua uma ona suʻesuʻeina le tulafono, na ou iloa ai o le togafiti ma le numera faʻataulāitu na mafai ai ona ou le toilalo i le faʻaumatiaga faʻaputuga e ala i le faʻasaʻolotoina o se mea sese i luga o se paʻu e leʻi faʻamaonia i luga o le pasi muamua. Ae o ai na te toe tusia le paʻu e pasi ai laʻu galuega mulimuli ane? E pei ona fautuaina e le au atinaʻe Emscripten, pe a ou feagai ma se faʻafitauli, na ou faʻafeiloaʻi le code na maua i tua i le talosaga faʻapitoa, seti Mozilla Record-Replay i luga ... I se tulaga lautele, i le faaiuga na ou iloa ai se mea faigofie: mo poloka taʻitasi, a struct TranslationBlock ma lona fa'amatalaga. Va'ai po o fea... E sa'o, i luma tonu o le poloka i totonu o le pa. I le iloaina o lenei mea, na ou filifili ai e tuu le faʻaaogaina o tootoo (a itiiti ifo o nisi), ma na o le tiaʻi ese o le numera faʻailoga, ma faʻafeiloaʻi isi upu i struct TranslationBlock, fatuina o se lisi feso'ota'i ta'ito'atasi e mafai ona vave fa'asolo pe a toe seti le fa'aliliuga cache, ma fa'asa'oloto le manatua.

O lo'o tumau pea nisi tootoo: mo se fa'ata'ita'iga, fa'ailoga fa'ailoga i totonu o le fa'ailoga fa'ailoga - o nisi o latou e faigofie BinaryenExpressionRef, o lona uiga, latou te vaʻavaʻai i faʻamatalaga e manaʻomia ona tuʻuina laina i totonu o le poloka faavae gaosia, vaega o le tulaga mo le suiga i le va o BBs, vaega o le mea e alu i ai. Ia, ua uma ona saunia poloka mo Relooper e manaʻomia ona fesoʻotaʻi e tusa ai ma tulaga. Ina ia iloa le eseesega, o le manatu o loʻo faʻaogaina uma e le itiiti ifo ma le fa bytes, o lea e mafai ai ona e faʻaogaina ma le saogalemu le lua pito sili ona taua mo le igoa, e tatau ona e manatua e aveese pe a manaʻomia. I le auala, o ia igoa ua uma ona faʻaaogaina i le QEMU e faʻaalia ai le mafuaʻaga o le alu ese mai le TCG loop.

Faʻaaogaina Binaryen

Modules i WebAssembly o loʻo i ai galuega, o ia mea taʻitasi e iai se tino, o se faʻaaliga. O faʻamatalaga o le unary ma le binary operations, poloka e aofia ai lisi o isi faʻaaliga, pulea le tafe, ma isi. E pei ona uma ona ou fai atu, o le pulea o le tafe iinei o loʻo faʻatulagaina tonu e pei o lala maualuga, faʻamau, valaʻau galuega, ma isi. O finauga i galuega e le pasia i luga o le faaputuga, ae manino, pei o le JS. E iai foʻi suiga o le lalolagi, ae ou te leʻi faʻaaogaina, o lea ou te le taʻuina atu ia te oe.

O galuega e iai fo'i suiga fa'apitonu'u, faanumera mai le zero, o le ituaiga: int32 / int64 / float / double. I lenei tulaga, o le muamua n suiga i le lotoifale o finauga na pasia i le galuega. Faamolemole ia matau e ui lava o mea uma iinei e le o se tulaga maualalo atoa i tulaga o le pulea o le tafe, e le o tauaveina pea e le numera le uiga "saini / le saini": pe faʻafefea le numera e faʻalagolago i le faʻasologa o le faʻaogaina.

I se tulaga lautele, e saunia e Binaryen faigofie C-API: e te faia se module, i totonu ia te ia fatu fa'aaliga - unary, binary, poloka mai isi fa'aaliga, pulea le tafe, ma isi. Ona e faia lea o se galuega ma se faʻaaliga o lona tino. Afai o oe, pei o aʻu, e iai se kalafi faʻasolosolo maualalo, o le vaega toe faʻaleleia o le a fesoasoani ia te oe. E tusa ai ma loʻu malamalama, e mafai ona faʻaaogaina le maualuga maualuga o le faʻatinoina o le tafe i totonu o se poloka, pe afai e le alu i tua atu o tuaoi o le poloka - o lona uiga, e mafai ona faia i totonu ole auala vave / faʻagesegese. ala lala i totonu o le fausia-i TLB code processing cache, ae le o le faalavelave i le "fafo" pulea tafe . A e fa'asa'olotoina se relooper, e fa'asa'olotoina ana poloka; a e fa'asa'olotoina se module, o fa'amatalaga, galuega, ma isi mea fa'atatau i ai e mou atu. malae.

Ae peitaʻi, afai e te manaʻo e faʻamatalaina le code i luga o le lele e aunoa ma le fatuina ma le tapeina o se faʻamatalaga faʻamatalaga, atonu e talafeagai le tuʻuina o lenei manatu i totonu o se faila C ++, ma mai iina e pulea saʻo le C ++ API o le faletusi, faʻafefea saunia- faia afifi.

O lea e faʻatupu ai le code e te manaʻomia

// настроить глобальные параметры (можно поменять потом)
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);

... afai na galo ia te aʻu se mea, faʻamalie atu, e naʻo le faʻatusaina o le fua, ma o faʻamatalaga o loʻo i totonu o faʻamaumauga.

Ma o lea ua amata le crack-fex-pex, e pei o lenei:

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

Ina ia mafai ona faʻafesoʻotaʻi lalolagi o QEMU ma JS ma i le taimi lava e tasi e vave maua ai galuega tuʻufaʻatasia, na faia ai se faʻasologa (se laulau o galuega mo le faʻaulufaleina i totonu o le faʻamalo), ma tuʻu ai iina galuega faʻavae. Ina ia vave fa'atatau le fa'asinomaga, sa fa'aaoga muamua le fa'asino ole poloka fa'aliliu upu leai, ae o le fa'asino ole fa'atatau ile fa'aaogaina o lenei fua na amata ona fa'afetaui ile fanua i totonu. struct TranslationBlock.

I le ala, fa'aaliga (i le taimi nei o lo'o i ai se laisene lemu) e galue lelei i Firefox. Chrome atia'e sa e le o sauni i le mea moni e manaʻo se tasi e fatuina le sili atu ma le afe faʻataʻitaʻiga o WebAssembly modules, o lea na latou tuʻuina atu ai se gigabyte o avanoa tuatusi tuatusi mo taʻitasi ...

Na'o le pau lena mo le taimi nei. Atonu o le a iai se isi tala pe afai e fia maua se tasi. O lona uiga, o lo'o totoe a itiiti mai naʻo fa'aoga masini poloka. Atonu e talafeagai foi le faia o le tuufaatasia o WebAssembly modules asynchronous, e pei ona masani ai i le lalolagi JS, talu ai o loʻo i ai pea se faʻaliliuga e mafai ona faia uma nei mea seʻia oʻo ina saunia le module masani.

Mulimuli ane se tupua: ua e tuufaatasia se binary i luga o se fausaga 32-bit, ae o le code, e ala i gaoioiga manatua, aʻe mai Binaryen, i se mea i luga o le faaputuga, po o se isi mea i le pito i luga 2 GB o le 32-bit avanoa tuatusi. O le fa'afitauli e fa'apea mai le manatu o Binaryen o lo'o fa'aogaina tele se tuatusi fa'ai'uga. E fa'afefea ona fa'ata'amilo i lenei mea?

I le auala admin

Ou te leʻi faʻauʻuina lenei mea, ae o loʻu manatu muamua o le "Ae a pe a ou faʻapipiʻi le 32-bit Linux?" Ona nofoia lea o le vaega pito i luga o le avanoa tuatusi e le fatu. Pau lava le fesili o le a le tele o le a nofoia: 1 poʻo le 2 Gb.

I se faiga a le polokalame (filifiliga mo lōia)

Se'i o tatou feula se pulumu i le pito i luga ole avanoa ole tuatusi. Ou te le malamalama pe aisea e aoga ai - iina uma e tatau ona i ai se faaputuga. Ae "o matou o fomaʻi: e aoga mea uma mo i matou, ae leai se tasi na te iloa pe aisea ..."

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

... e moni e le fetaui ma Valgrind, ae, o le mea e lelei ai, o Valgrind lava ia e matua tuleia tagata uma i fafo :)

Masalo o le a tuʻuina atu e se tasi se faʻamatalaga sili atu pe faʻafefea ona galue lenei code o aʻu ...

puna: www.habr.com

Faaopoopo i ai se faamatalaga