QEMU.js: ugbu a n'ụzọ siri ike yana WASM

N'otu oge, maka ịchị ọchị, ekpebiri m gosi reversibility nke usoro ma mụta ka esi ewepụta Javascript (ma ọ bụ kama, Asm.js) site na koodu igwe. A họọrọ QEMU maka nnwale ahụ, oge ụfọdụ ka e mesịrị, e dere otu akụkọ na Habr. Na nkwupụta, a dụrụ m ọdụ ka m rụgharịa ọrụ ahụ na WebAssembly, na ọbụna tụba ya n'onwe m ọ fọrọ nke nta ka ọ gwụchaa N'ụzọ ụfọdụ, ọ dịghị m ka ọrụ ahụ ... Ọrụ ahụ na-aga n'ihu, ma jiri nwayọọ nwayọọ, ma ugbu a, n'oge na-adịbeghị anya n'isiokwu ahụ pụtara. ikwu na isiokwu "Ya mere, olee otú o si kwụsị?". Maka azịza m zuru oke, anụrụ m "Nke a na-adọta akụkọ." Ọfọn, ọ bụrụ na ọ na-adọta, mgbe ahụ, a ga-enwe akụkọ. Ma eleghị anya, mmadụ ga-abịa na aka. Na ya, onye na-agụ ga-amụta ụfọdụ eziokwu banyere QEMU code generation backends, nakwa dị ka otú e si dee a Just-in-Time compiler maka ngwa webụ.

ihe aga-eme

Ebe ọ bụ na amụtala m ka m ga-esi "n'ụzọ ụfọdụ" n'ọdụ ụgbọ mmiri QEMU na Javascript, oge a, e kpebiri ime ya nke ọma na ịghara imegharị ihe ochie.

Nọmba mperi: ntọhapụ isi n'alaka

Mmehie mbụ m bụ ịpụpụ ụdị m site na ụdị 2.4.1 nke elu. Mgbe ahụ, ọ dị m ka ọ bụ ezigbo echiche: ọ bụrụ na ntọhapụ isi dị, mgbe ahụ ọ nwere ike kwụsie ike karịa 2.4 dị mfe, na ọbụna karịa alaka. master. Ma ebe ọ bụ na m mere atụmatụ ịgbakwunye ezigbo ahụhụ nke m, achọghị m nke ndị ọzọ ma ọlị. Ya mere ọ ga-abụ na o mere. Mana nke a bụ nsogbu ahụ: QEMU anaghị eguzo otu ebe, ma n'oge ụfọdụ, ha kwuputara njikarịcha koodu emepụtara site na pasent 10. "Ee, ugbu a, m ga-anwụ," ka m chere, wee kwụsị. N'ebe a, anyị kwesịrị ime ka a digression: n'ihi na otu-threaded ọdịdị nke QEMU.js na eziokwu na mbụ QEMU apụtaghị na enweghị multithreading (ya bụ, ohere nke imekotaotuugbo ọrụ nke ọtụtụ na-enweghị njikọ koodu ụzọ dị oké mkpa maka. ya, ma ọ bụghị naanị “jiri cores niile”), isi ọrụ nke eriri m ga-emerịrị “tụgharịa” ka m nwee ike ịkpọ si n'èzí. Nke a kpatara ụfọdụ nsogbu njikọta eke. Otú ọ dị, eziokwu na ụfọdụ mgbanwe si alaka ụlọ ọrụ master, nke m gbalịrị ijikọta koodu m, a na-ahọrọkwa cherry na ntọhapụ (ya mere na alaka m) kwa, eleghị anya ọ gaghị agbakwunyere mma.

N'ozuzu, m kpebiri na ọ ka bụ ihe ezi uche na-atụfu prototype, wepụ ya iche maka akụkụ ahụ mapụtara na-ewu a ọhụrụ version si ọkọ dabeere na ihe fresher na ugbu a si. master.

Nọmba ezighi ezi: usoro TLP

N'ezie, nke a abụghị mmejọ, n'ozuzu, ọ bụ naanị akụkụ nke ịmepụta ọrụ na ọnọdụ nke nghọtahie zuru oke nke ma "ebe na otu esi aga?", na n'ozuzu "anyị ga-enweta ebe ahụ?". N'ọnọdụ ndị a mmemme fluff bụ nhọrọ ziri ezi, ma, n'ezie, achọghị m ikwugharị nke a na-enweghị isi. N'oge a, achọrọ m ime ya nke ọma: atomic na-eme, mgbanwe mgbanwe koodu (ọ bụghị "ịkọkọ mkpụrụedemede na-enweghị usoro ruo mgbe ọ na-achịkọta (na ịdọ aka ná ntị)", dị ka Linus Torvalds kwuru otu oge banyere mmadụ, dị ka Wikiquote si kwuo), wdg.

Mejọrọ nọmba atọ: amaghị ford ịrị n'ime mmiri

Ọbụna ugbu a m na-adịghị kpamkpam kpochapuru nke a, ma ugbu a, m kpebiri na m na-aga adịghị n'ụzọ nke kasị nta iguzogide, na-eme ya "na okenye ụzọ", ya bụ, dee m TCG backend si ọkọ, nke mere na mgbe e mesịrị. Anaghị m ekwu, ha na-asị, "Ee, nke a, n'ezie, nwayọọ nwayọọ, ma enweghị m ike ịchịkwa ihe niile - TCI e dere dị ka ...". Ọzọkwa, nke a na mbụ dị ka ihe ngwọta doro anya, ebe ọ bụ na Ana m ewepụta koodu ọnụọgụ abụọ. Dị ka ha na-ekwu, "Gathered Ghentу, ma ọ bụghị nke ahụ ”: koodu ahụ bụ, n'ezie, ọnụọgụ abụọ, mana enweghị ike ibufe njikwa ya na ya - a ga-etinyerịrị ya n'ụzọ doro anya n'ime ihe nchọgharị maka mkpokọta, na-ebute ihe ụfọdụ sitere na ụwa JS, nke ka kwesịrị ịdị. echekwara ebe. Otú ọ dị, na ụlọ ọrụ RISC nkịtị, dị ka m ghọtara, ọnọdụ a na-ahụkarị bụ mkpa ịtọgharịa cache ntụziaka nke ọma maka koodu emegharịrị - ọ bụrụ na nke a abụghị ihe anyị chọrọ, ma ọ dịkarịa ala ọ dị nso. Na mgbakwunye, site na mbọ ikpeazụ m mere, amụtara m na njikwa adịghị ka ebufefe ya n'etiti ngọngọ ntụgharị, yabụ na anyị achọghị n'ezie bytecode tụgharịrị site na nkwụghachi ọ bụla, ma ị nwere ike mepụta ya site na ọrụ na TB. .

Bia na agba

Ọ bụ ezie na amalitere m idegharị koodu ahụ laa azụ na Julaị, pendel anwansi ahụ na-amataghị: na-abụkarị akwụkwọ ozi sitere na GitHub na-abịa dị ka ọkwa nke nzaghachi nke Okwu na Pull arịrịọ, mana ebe a, na mberede kwuru na eri Binaryen dị ka qemu azụ azụ N'okwu a, "Lee, o mere ihe dị otú ahụ, ma eleghị anya ọ ga-ekwu ihe." Ọ bụ maka iji ọbá akwụkwọ Emscripten metụtara ya ọnụọgụ abụọ iji mepụta WASM JIT. Ọfọn, ekwuru m na ị nwere ikike Apache 2.0 ebe ahụ, na QEMU n'ozuzu ya na-ekesa n'okpuru GPLv2, na ha adịghị adabara nke ukwuu. Na mberede ọ tụgharịrị na ikike nwere ike ịbụ dozie ya n'ụzọ ụfọdụ (Amaghị m: ikekwe gbanwee, ikekwe inye ikikere abụọ, ikekwe ihe ọzọ ...). N'ezie, nke a mere m obi ụtọ, n'ihi na n'oge ahụ, elere m anya nke ọma ọnụọgụ abụọ WebAssembly, na enwere m mwute na enweghị nghọta. Enwekwara ọbá akwụkwọ nke ga-eji eserese mgbanwe chịkọta ihe ndị bụ isi, wee wepụta bytecode, na ọbụna malite ya n'onwe ya na onye ntụgharị okwu, ọ bụrụ na ọ dị mkpa.

Mgbe ahụ, e nwere akwụkwọ ozi na ndepụta nzipu ozi QEMU, mana nke a bụ karịa ajụjụ a, "Ònye chọrọ ya ma ọlị?". Ya mere na mberedetụgharịrị dị mkpa. Opekempe, ị nwere ike ikpokọta ụdị ohere ndị a, ma ọ bụrụ na ọ ga-arụ ọrụ nke ọma ma ọ bụ karịa:

  • launching ihe nkuzi enweghị echichi ma ọlị
  • virtualization na iOS, ebe, dị ka asịrị, naanị ngwa nwere ikike koodu ọgbọ na ofufe bụ JS engine (ọ bụ eziokwu?)
  • ngosi nke mini-OS - otu diski, arụnyere n'ime ya, ụdị ngwa ngwa niile, wdg ...

Njirimara oge ihe nchọgharị

Dịka m kwuru, ejikọtara QEMU na multithreading, mana ọ bụghị na ihe nchọgharị ahụ. Ọfọn, ya bụ, ka ọ bụghị ... Na mbụ ọ dịghị adị ma ọlị, mgbe ahụ WebWorkers pụtara - dị ka m ghọtara, nke a bụ multithreading dabeere na ozi na-agafe. na-enweghị òkè mgbanwe. Dị ka o kwesịrị ịdị, nke a na-ebute nnukwu nsogbu mgbe ị na-ebufe koodu dị adị dabere na ụdị ebe nchekwa ekekọrịtara. Mgbe ahụ, n'okpuru nrụgide ọha na eze, e mekwara ya n'okpuru aha SharedArrayBuffers. A na-ewebata ya nke nta nke nta, ha na-eme ememe mmalite ya na ihe nchọgharị dị iche iche, mgbe ahụ, ha na-eme ememe afọ ọhụrụ, na Meltdown ... Mgbe nke ahụ gasịrị, ha bịara na nkwubi okwu na coarsening, ọ bụghị coarsening nha nke oge, ma site n'enyemaka nke òkè ebe nchekwa. na eri nke na-abawanye counter, ihe niile bụ otu mara ezigbo mma. Ya mere, ha gbanyụrụ multithreading na-ekekọrịta ebe nchekwa. O yiri ka ọ na-atụgharị azụ azụ, ma, dị ka ọ bịara doo anya site na mbụ nnwale, e nwere ndụ na-enweghị ya, ma ọ bụrụ otú ahụ, anyị ga-agbalị ime ya na-enweghị ịdabere na multithreading.

Akụkụ nke abụọ bụ enweghị ike ịmegharị ọkwa dị ala na nchịkọta: ị nweghị ike were, chekwaa ọnọdụ dị ugbu a wee gbanwee gaa na nke ọhụrụ nwere nchịkọta ọhụrụ. Igwe mebere nke JS na-ejikwa ngwugwu oku a. Ọ ga-adị ka, gịnị bụ nsogbu, ebe anyị kpebiri ijikwa mbụ eruba kpamkpam aka na agbanyeghị? Nke bụ eziokwu bụ na a na-emejuputa atumatu I / O na QEMU site na coroutines, ebe a bụ ebe nhazi ọkwa dị ala ga-aba aka. Ọ dabara nke ọma, Emscipten enweelarị usoro maka ọrụ asynchronous, abụọ n'ezie: mekọrịta и onye nkwuwa okwu. Nke gara aga na-arụ ọrụ site na nnukwu bloat na koodu Javascript emepụtara na anaghị akwado ya. Nke abụọ bụ "ụzọ ziri ezi" dị ugbu a ma na-arụ ọrụ site na ọgbọ bytecode maka onye ntụgharị okwu. Ọ na-arụ ọrụ, n'ezie, nwayọọ nwayọọ, ma ọ dịghị agbapụta koodu. N'ezie, nkwado coroutine maka usoro a kwesịrị inye aka n'onwe ya (enweelarị coroutines edere n'okpuru Asyncify na enwere mmejuputa ihe dị ka otu API maka Emterpreter, naanị ị ga-ejikọ ha).

N'oge a, enwebeghị m ike kewaa koodu ahụ n'ime WASM ma kọwaa ya site na iji Emterpreter, ya mere ngwaọrụ mgbochi anaghị arụ ọrụ (lee usoro ndị a, dịka ha na-ekwu ...). Ya bụ, n'ikpeazụ, ị ga-enweta ihe na-akpa ọchị dị otú ahụ:

  • ngọngọ I/O tụgharịrị. Ọ dị mma, ị tụrụ anya n'ezie ka NVMe ṅomiri nwere arụmọrụ ala? 🙂
  • koodu QEMU chịkọtara nke ọma (onye ntụgharị, ngwaọrụ ndị ọzọ eṅomiri, wdg)
  • chịkọtara ike na koodu ndị ọbịa WASM

Njirimara nke isi mmalite QEMU

Dịka ị cheburula, koodu maka iṅomi ụlọ ndị ọbịa na koodu maka imepụta ntuziaka igwe nnabata na QEMU kewapụrụ. N'ezie, e nwere ọbụna ntakịrị aghụghọ:

  • e nwere ndị ọbịa architectures
  • bụ accelerators, ya bụ, KVM maka ngwaike virtualization na Linux (maka ndị ọbịa dakọtara na sistemụ nnabata), TCG maka ọgbọ koodu JIT ebe ọ bụla. Malite na QEMU 2.9, nkwado maka ọkọlọtọ HAXM ngwaike virtualization na Windows (nkọwa)
  • Ọ bụrụ na eji TCG, ọ bụghị ngwaike virtualization, mgbe ahụ ọ nwere nkwado dị iche iche maka ọgbọ koodu maka ụlọ ọrụ ọ bụla, yana maka onye ntụgharị okwu zuru ụwa ọnụ.
  • ... na gburugburu ya niile - ihe nṅomi eṅomi, interface onye ọrụ, mbugharị, ndekọ-replay, wdg.

Site n'ụzọ, ị maara: QEMU nwere ike iṅomi ọ bụghị naanị kọmputa dum, kamakwa onye nrụpụta maka usoro onye ọrụ dị iche na kernel onye ọbịa, nke a na-eji, dịka ọmụmaatụ, AFL fuzzer maka ọnụọgụ abụọ. Ikekwe mmadụ chọrọ ibubata ụdị ọrụ QEMU a na JS? 😉

Dị ka ọtụtụ sọftụwia efu na-adị ogologo oge, QEMU na-ewu ya site na ịkpọ oku configure и make. Ka e were ya na ị kpebie ịgbakwunye ihe: TCG backend, mmejuputa eri, ihe ọzọ. Adịla ngwa ngwa ịṅụrị ọṅụ / ụjọ (kọwapụta dị ka o kwesịrị ekwesị) na atụmanya nke iso Autoconf na-ekwurịta okwu - n'ezie, configure QEMU, o doro anya, e ji aka ya dee na esighi n'ihe ọ bụla eme ya.

WebAssembly

Kedu ihe bụ ihe a - WebAssembly (aka WASM)? Nke a bụ nnọchi maka Asm.js, anaghịzi eme ka ọ bụ koodu Javascript bara uru. N'ụzọ megidere nke ahụ, ọ bụ naanị ọnụọgụ abụọ na kachasị mma, na ọbụnadị ide ihe integer n'ime ya adịghị mfe: n'ihi na compactness, ọ na-echekwara na usoro. LEB128.

O nwere ike ịbụ na ị nụla banyere relooping algọridim maka Asm.js - nke a bụ mweghachi nke "elu-larịị" mmezu usoro nchịkwa eruba (ya bụ, ma ọ bụrụ na-mgbe ahụ-ọzọ, loops, wdg), nke JS engines e mere maka, site na LLVM IR dị ala, dị nso na koodu igwe nke onye nrụpụta mere. Dị ka o kwesịrị ịdị, nnọchite anya etiti nke QEMU dị nso na nke abụọ. Ọ ga-adị ka ebe a bụ, bytecode, njedebe nke mmekpa ahụ ... Na mgbe ahụ blocks, ma ọ bụrụ na-mgbe ahụ-ọzọ na loops!

Ma nke a bụ ihe ọzọ mere Binaryen ji baa uru: ọ nwere ike nabata ihe mgbochi dị elu nke dị nso na ihe a ga-echekwa na WASM. Mana ọ nwekwara ike ịnye koodu site na eserese nke ihe mgbochi na ntụgharị n'etiti ha. Ọfọn, ekwuru m banyere ihe ọ na-ezo n'azụ usoro nchekwa C / C ++ API WebAssembly dị mma.

TCG (obere koodu Generator)

NGAN bụ na mbụ backend maka C compiler. Mgbe ahụ, o doro anya na ọ pụghị iguzogide asọmpi ahụ na GCC, ma n'ikpeazụ ọ chọtara ebe ya na QEMU dị ka usoro ọgbọ koodu maka ikpo okwu ndị ọbịa. Enwekwara azụ azụ TCG nke na-ewepụta ụfọdụ bytecode abstract, nke onye ntụgharị okwu na-egbu ozugbo, mana ekpebiri m ịzere iji ya oge a. Otú ọ dị, eziokwu ahụ bụ na QEMU enweelarị ikike iji mee ka mgbanwe gaa na TB na-emepụta site na ọrụ ahụ tcg_qemu_tb_exec, batara m aka.

Ka ịgbakwunye azụ azụ TCG ọhụrụ na QEMU, ịkwesịrị ịmepụta subdirectory tcg/<имя архитектуры> (n'okwu a, tcg/binaryen), na o nwere faịlụ abụọ: tcg-target.h и tcg-target.inc.c и nye iwu ọ bụ ihe niile gbasara configure. Ị nwere ike itinye faịlụ ndị ọzọ n'ebe ahụ, ma dịka ị nwere ike ịkọ site na aha abụọ a, a ga-etinye ha abụọ ebe: otu dị ka faịlụ nkụnye eji isi mee (ọ gụnyere ya na ya). tcg/tcg.h, na nke ahụ adịlarị na faịlụ ndị ọzọ na akwụkwọ ndekọ aha tcg, accel ma ọ bụghị naanị), nke ọzọ - naanị dị ka koodu snippet n'ime tcg/tcg.c, ma ọ nwere ohere na ya static ọrụ.

N'ikpebi na m ga-etinye oge dị ukwuu na usoro zuru ezu, ka o si arụ ọrụ, naanị m depụtaghachiri "skeletons" nke faịlụ abụọ a site na mmejuputa azụ azụ ọzọ, na-egosi n'eziokwu nke a na isi akwụkwọ ikike.

file tcg-target.h nwere tumadi ntọala n'ụdị #define-ov:

  • ole ndekọ na kedu obosara dị na ihe owuwu ebumnuche (anyị nwere ọtụtụ ndekọ dị ka anyị chọrọ, dị ka anyị nwere - ajụjụ ahụ karịrị ihe a ga-eme ka ọ bụrụ koodu na-arụ ọrụ nke ọma site na ihe nchọgharị na "nzube zuru ezu" architecture...)
  • nhazi nke ntuziaka ndị ọbịa: na x86, na ọbụna na TCI, ntụziaka anaghị ejikọta ma ọlị, mana m ga-etinye ya na ntinye koodu ọ bụghị ntụziaka ma ọlị, ma na-atụ aka na owuwu nke ụlọ akwụkwọ Binaryen, ya mere, m ga-eme ya. sị: 4 bytes
  • Kedu ntuziaka nhọrọ nke azụ azụ nwere ike ịmepụta - anyị na-agụnye ihe niile anyị na-ahụ na Binaryen, ka onye na-eme ngwa ngwa mebie ndị ọzọ n'ime ndị dị mfe.
  • kedu ihe nha nke cache TLB nke azụ azụ rịọrọ. Nke bụ eziokwu bụ na ihe niile dị oké njọ na QEMU: ọ bụ ezie na e nwere ndị inyeaka ọrụ na-ebu ibu / ụlọ ahịa na-eburu n'uche ọbịa MMU (na ebe ugbu a na-enweghị ya?), Ma ha na-azọpụta ha agbasa ozi n'ikuku cache n'ụdị a Ọdịdị, na nhazi nke dị mma iji tinye ozugbo na ngọngọ mgbasa ozi. Ajụjụ a bụ, kedụ nkwụghachi n'ụdị a ka a na-ahazi nke ọma site na obere usoro iwu ngwa ngwa.
  • Ebe a ị nwekwara ike tweak ọrụ nke otu ma ọ bụ abụọ echekwabara, mee ka TB kpọọ oku site na ọrụ ma kọwaa obere obere. inline-arụ ọrụ dị ka flush_icache_range (ma nke a abụghị ikpe anyị)

file tcg-target.inc.c, n'ezie, na-abụkarị ibu ma nwee njirimara ole na ole dị mkpa:

  • mmalite, na-egosi, n'etiti ihe ndị ọzọ, mgbochi nke ntụziaka nwere ike ịrụ ọrụ na nke operands. M ji obi ike depụtaghachi ya site na azụ azụ ọzọ
  • ọrụ na-ewe otu n'ime ntụziaka bytecode
  • ebe a ị nwere ike tinye ọrụ inyeaka, na ebe a ị nwere ike iji static ọrụ si tcg/tcg.c

Maka onwe m, ahọpụtara m atụmatụ a: na okwu mbụ nke ngọngọ ntụgharị na-esote, edere m akara anọ: akara mmalite (ụfọdụ uru na mpaghara. 0xFFFFFFFF, nke ejiri mara ọnọdụ TB dị ugbu a), ihe gbara ya gburugburu, modul emepụtara, na nọmba anwansi maka nbipu. Nke mbụ, etinyere akara ahụ 0xFFFFFFFF - nebe n - ọnụ ọgụgụ dị nta nke ọma, na nke ọ bụla na-egbu site na onye ntụgharị mụbara site na 1. Mgbe ọ ruru 0xFFFFFFFE, nchịkọta weere ọnọdụ, a na-echekwa modul ahụ na tebụl ọrụ nke a na-ebuba n'ime obere "na-ebubata", n'ime ya na-egbu ya. tcg_qemu_tb_exec, ma wepụrụ modul ahụ na ebe nchekwa QEMU.

Iji kọwapụta oge gboo, "Crutch, ole ka ejikọtara na ụda a maka obi onye proger...". Agbanyeghị, ebe nchekwa ahụ nọ na-agbapụta ebe. Ọ bụ ebe nchekwa QEMU jisiri ike! Enwere m koodu na, mgbe ị na-ede ntụziaka na-esote (nke ọma, ya bụ, pointer), ehichapụrụ nke a kpọtụrụ aha na ebe a na mbụ, mana nke a enyereghị aka. N'ezie, n'okwu kachasị mfe, QEMU na-ekenye ebe nchekwa na mmalite wee dee koodu emepụtara n'ebe ahụ. Mgbe nchekwa ahụ kwụsịrị, a ga-atụfu koodu ahụ, nke na-esote ga-amalite ide ya n'ọnọdụ ya.

N'ịmụta koodu ahụ, achọpụtara m na ọnụọgụ anwansi ahụ mere ka m ghara ịdaba na mbibi nke ikpo ọkụ ahụ, na-ahapụ ihe na-ezighị ezi na ebe nchekwa na-enweghị isi n'oge mbụ ngafe. Mana onye na-edegharị ihe nchekwa ahụ gburugburu ọrụ m ma emechaa? Dị ka ndị mmepe Emscripten na-adụ ọdụ, n'ịbụ ndị na-abanye n'ime nsogbu, m na-ebufe koodu ahụ na-esi na ya laghachi azụ na ngwa obodo, debe Mozilla Record-Replay na ya ... N'ozuzu, n'ikpeazụ m ghọtara ihe dị mfe: maka ngọngọ ọ bụla, a struct TranslationBlock na nkọwa ya. Chee ebe... Nke ahụ dị mma, tupu egbochie nri na nchekwa. N'ịghọta nke a, ekpebiri m ijikọ crutches (opekata mpe ụfọdụ), wee tufuo nọmba anwansi ahụ, ma nyefee okwu ndị fọdụrụ na ya. struct TranslationBlock, site na ịmepụta ndepụta ejikọtara ọnụ nke enwere ike ịgafe ngwa ngwa mgbe ị na-ehichapụ cache ntụgharị asụsụ wee hapụ ebe nchekwa.

Ụfọdụ crutches ka dị: dịka ọmụmaatụ, akara akara na koodu nchekwa - ụfọdụ n'ime ha dị mfe BinaryenExpressionRef, ya bụ, ha na-eleba anya n'okwu ndị dị mkpa ka a na-etinye n'ahịrị n'ahịrị n'ime ngọngọ nke emepụtara, akụkụ bụ ọnọdụ mgbanwe n'etiti BB, akụkụ bụ ebe aga. Ọfọn, enweelarị ngọngọ maka Relooper nke kwesịrị ijikọ dịka ọnọdụ ndị ahụ siri dị. Iji mara ọdịiche dị n'etiti ha, a na-eji echiche ahụ na ha niile kwadoro ma ọ dịkarịa ala bytes anọ, n'ihi ya ị nwere ike iji obere ihe abụọ dị ala maka akara ahụ n'enweghị nsogbu, naanị ị ga-echeta wepụ ya ma ọ bụrụ na ọ dị mkpa. Site n'ụzọ, ejirilarị akara ndị dị otú ahụ na QEMU iji gosi ihe kpatara ịpụ na loop TCG.

Iji Binaryen

Modul dị na WebAssembly nwere ọrụ, nke ọ bụla n'ime ha nwere ahụ, nke bụ okwu. Okwu bụ unary na ọnụọgụ abụọ arụmọrụ, blocks nwere ndepụta nke okwu ndị ọzọ, na-achịkwa eruba, wdg. Dịka m kwurula, a na-ahazi usoro nchịkwa ebe a kpọmkwem dị ka alaka dị elu, loops, oku ọrụ, wdg. A naghị ebufe arụmụka maka ọrụ na ngwugwu, mana n'ụzọ doro anya, dịka ọ dị na JS. Enwekwara mgbanwe mgbanwe ụwa, mana ejighị m ha, yabụ agaghị m ekwu maka ha.

Ọzọkwa, ọrụ ndị ahụ nwere mgbanwe mpaghara ọnụ site na efu, nwere ụdị: int32 / int64 / float / okpukpu abụọ. N'okwu a, nke mbụ n mgbanwe mpaghara bụ arụmụka agafere na ọrụ ahụ. Biko mara na n'agbanyeghị na ihe niile ebe a abụghị kpamkpam ala-larịị na usoro nke njikwa eruba, integers ka na-adịghị ebu "aka / unsigned" àgwà: otú nọmba ga-akpa àgwà dabere na ọrụ koodu.

N'ikwu okwu n'ozuzu, Binaryen na-enye C-API dị mfe: ị mepụtara modul, n'ime ya mepụta okwu - unary, ọnụọgụ abụọ, ngọngọ sitere na okwu ndị ọzọ, njikwa njikwa, wdg. Mgbe ahụ, ị ​​na-emepụta ọrụ nke ahụ ya kwesịrị ịbụ nkwupụta. Ọ bụrụ na gị, dị ka m, nwere eserese ngbanwe dị ala, akụrụngwa relooper ga-enyere gị aka. Dị ka m na-aghọta, ọ ga-ekwe omume na-eji elu-larịị ogbugbu eruba njikwa na a ngọngọ, ọ bụrụhaala na ọ na-adịghị gafere ngọngọ - ya bụ, ọ ga-ekwe omume ime ka esịtidem ngwa ngwa ụzọ / ngwa ngwa alaka ụlọ ọrụ n'ime. koodu nhazi cache TLB arụnyere n'ime ya, mana ọ gaghị ekwe omume igbochi njikwa njikwa "mpụta". Mgbe ị hapụrụ relooper, a na-ahapụ ihe mgbochi ya, mgbe ị wepụtara modul, okwu, ọrụ, wdg, ekenyela ya na-apụ n'anya. ogige.

Agbanyeghị, ọ bụrụ na ịchọrọ ịkọwa koodu ahụ na ofufe na-enweghị ihe okike na-enweghị isi na nhichapụ nke ihe atụ ntụgharị, ọ nwere ike bụrụ ihe ezi uche dị na ya ịkwaga mgbagha a na faịlụ C ++, wee si ebe ahụ na-ejikwa C ++ API niile. Ọbá akwụkwọ, na-agafe ihe mkpuchi emebere.

Ya mere, iji mepụta koodu, ịchọrọ

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

... ma ọ bụrụ na m chefuru ihe - ndo, nke a bụ naanị na-anọchi anya ọnụ ọgụgụ, na nkọwa dị na akwụkwọ.

Ma ugbu a crex-fex-pex malitere, ihe dị ka nke a:

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

Iji jikọọ ụwa nke QEMU na JS n'otu oge ahụ, tinyekwa ọrụ ndị a chịkọtara ngwa ngwa, a na-emepụta ihe dị iche iche (tebụl nke ọrụ maka mbubata n'ime onye na-ebupụta), ma tinye ọrụ ndị a na-emepụta n'ebe ahụ. Iji gbakọọ index ngwa ngwa, a na-eji ntụgharị okwu ngọngọ efu efu mee ihe dị ka ya na mbụ, mana ndeksi nke ejiri usoro dị otú ahụ gbakọọ wee malite ịbanye n'ọhịa. struct TranslationBlock.

Site n'ụzọ, ngosi (ka ọ dị ugbu a nwere ikikere urukpuru) Ọ na-arụ ọrụ naanị na Firefox. Ndị mmepe Chrome bụ n'ụzọ ụfọdụ adịghị njikere n'eziokwu na mmadụ chọrọ ịmepụta ihe karịrị otu puku ihe atụ nke WebAssembly modul, ya mere, ha na-ekenye otu gigabyte nke oghere adreesị mebere maka onye ọ bụla ...

Maka ugbu a, nke ahụ bụ naanị. Ikekwe a ga-enwe isiokwu ọzọ ma ọ bụrụ na ọ masịrị mmadụ. Ya bụ, ọ dịkarịa ala naanị mee ka ngwaọrụ ngọngọ rụọ ọrụ. Ikekwe ọ bụ ihe ezi uche dị na ya ime ka nchịkọta nke WebAssembly modul asynchronous, dị ka a na-emekarị na ụwa JS, ebe ọ bụ na a ka nwere onye ntụgharị okwu nwere ike ime ihe a niile ruo mgbe modul nke obodo dị njikere.

Ilu ikpeazụ: ị chịkọtara ọnụọgụ abụọ na ihe owuwu 32-bit, mana koodu ahụ na-arịgo site na Binaryen site na ọrụ ebe nchekwa, ebe n'elu nchịkọta ma ọ bụ ebe ọzọ n'ime elu 2 GB nke oghere adreesị 32-bit. Nsogbu bụ na site na echiche nke Binaryen, nke a bụ oku na-aga na nnukwu adreesị na-akpata. Kedu ka esi agafe ya?

style admin

Akwụsịghị m ịnwale ya, mana echiche mbụ m bụ "Gịnị ma ọ bụrụ na m tinye Linux 32-bit?" Mgbe ahụ, akụkụ elu nke oghere adreesị ga-eji kernel. Naanị ajụjụ bụ ego ole a ga-eji: 1 ma ọ bụ 2 Gb.

N'ụzọ nke mmemme (nhọrọ maka ndị ọkachamara)

Wunye afụ n'elu oghere adreesị. Aghọtaghị m ihe kpatara o ji arụ ọrụ - n'otu ebe ama kwesịrị ịbụ nchịkọta. Ma "anyị bụ ndị na-eme ihe: ihe niile na-arụ ọrụ maka anyị, ma ọ dịghị onye maara ihe kpatara ya..."

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

... na Valgrind, agbanyeghị, ọ dakọtara, mana, ọ dabara nke ọma, Valgrind n'onwe ya na-achụpụ onye ọ bụla n'ebe ahụ nke ọma 🙂

Ikekwe mmadụ ga-enye nkọwa nke ọma ka koodu nke m a si arụ ọrụ ...

isi: www.habr.com

Tinye a comment