QEMU.js: he tino nui inaianei me te WASM

I tetahi wa ka whakatau ahau mo te ngahau whakamatauria te hurihanga o te tukanga me te ako me pehea te whakaputa JavaScript (he tino tika, Asm.js) mai i te waehere miihini. I tohua a QEMU mo te whakamatautau, a, i muri mai ka tuhia he tuhinga mo Habr. I roto i nga korero i tohutohuhia ahau ki te hanga ano i te kaupapa i roto i te WebAssembly, a ka mutu ano ahau tata oti Kaore au i pirangi ki te kaupapa... Kei te haere tonu te mahi, engari he tino puhoi, inaianei, kua puta mai i tera tuhinga. kōrero i runga i te kaupapa “Na pehea i mutu ai?” Hei whakautu mo taku whakautu taipitopito, ka rongo ahau "He ahua korero tenei." Ana, ki te taea e koe, ka puta he tuhinga. Tera pea ka kitea e tetahi he whai hua. Mai i reira ka ako te kaipanui i etahi meka mo te hoahoa o nga tuara whakangao waehere QEMU, me pehea hoki te tuhi i te kaikohikohi Just-in-Time mo te tono paetukutuku.

mahi

I te mea kua ako ahau ki te "ahua" te tauranga QEMU ki te JavaScript, i tenei wa i whakatauhia kia mahia marie kia kaua e tukurua nga hapa tawhito.

Hapa nama tuatahi: peka mai i te tuku ira

Ko taku hapa tuatahi ko te marau i taku putanga mai i te putanga whakarunga 2.4.1. Na, he pai ki ahau: mena kei te puta te tuku tohu, katahi ka pai ake i te 2.4 ngawari, me te peka atu. master. A, i te mea i whakamahere ahau ki te taapiri i te nui o aku ake pepeha, kaore au e hiahia ki tetahi atu. Koia pea te ahua. Engari koinei te mea: Kaore a QEMU e tu tonu, a i etahi wa ka panuitia e ratou te arotautanga o te waehere kua hangaia ma te 10 paiheneti. "Ae, inaianei ka whakatio ahau," ka whakaaro ahau ka pakaru. I konei me mahi he rerekee: na te ahua o te miro kotahi o QEMU.js me te mea ko te QEMU taketake kaore e kii i te kore o te miro-maha (ara, te kaha ki te whakahaere i te maha o nga huarahi waehere kore hono, me ehara i te "whakamahia nga kakano katoa") he mea tino nui mo tena, ko nga mahi matua o nga miro me "hurihia" kia taea te waea mai i waho. Na tenei i hanga etahi raruraru taiao i te wa o te whakakotahitanga. Heoi, ko etahi o nga huringa mai i te peka master, i ngana ahau ki te hanumi i taku waehere, i kohia ano he here i roto i te tukunga ira (a na reira i roto i taku peka) kaore pea e pai ake.

I te nuinga o te waa, i whakatau ahau he mea tika ki te maka atu i te tauira, wetewetehia mo nga waahanga me te hanga i tetahi waahanga hou mai i te pakaru i runga i tetahi mea hou ake, mai i tenei wa. master.

Te hapa tuarua: Tikanga TLP

Ko te tikanga, ehara tenei i te he; i te nuinga o te waa, he waahanga noa iho o te hanga kaupapa i roto i nga ahuatanga o te tino pohehe mo "kei hea me pehea te neke?" me te nuinga "ka tae ki reira?" I enei tikanga hōtaka hauwarea he whiringa tika, engari, ko te tikanga, kaore au i pai ki te whakahoki ano i te waa. I tenei wa ka hiahia ahau ki te mahi ma te whakaaro nui: te mahi ngota, te whakarereketanga o nga waehere mohio (kaore i te "whakapiri i nga tohu matapōkere kia tae noa ki te whakahiato (me nga whakatupato)", pera i ta Linus Torvalds i korero mo tetahi, e ai ki a Wikiquote), etc.

Ko te hapa tuatoru: te kuhu ki roto i te wai me te kore e mohio ki te whiti

Kare ano au i tino mawehe atu i tenei, engari inaianei kua whakatau ahau kia kaua e whai i te huarahi tino iti rawa atu, me mahi "ki te pakeke," ara, tuhia taku tuara TCG mai i te wahanga, kia kore ai ki te kii i muri mai, "Ae, ko te tikanga tenei, he puhoi, engari kaore e taea e au te whakahaere i nga mea katoa - koinei te tuhi TCI ..." I tua atu, i te tuatahi te ahua he otinga maamaa tenei, mai Ka whakaputa au i te waehere rua. I a ratou e kii ana, "Kua huihui a Ghentу, engari ehara i te mea ": ko te waehere, ko te tikanga, he rua, engari ko te mana whakahaere kaore e taea te whakawhiti noa ki a ia - me tino pana ki roto i te kaitirotiro mo te whakahiato, ka puta mai he ahanoa mai i te ao JS, e tika ana kia kia ora ki tetahi wahi. Heoi, i runga i nga hoahoanga RISC noa, ki taku mohio, he ahuatanga angamaheni ko te hiahia ki te tautuhi i te keteroki tohutohu mo te waehere kua whakahoutia - mena ehara tenei i te mea e hiahiatia ana, na, ahakoa he aha, kua tata. I tua atu, mai i taku nganatanga whakamutunga, i ako ahau ko te mana whakahaere karekau e whakawhitia ki waenganui o te poraka whakamaoritanga, no reira karekau matou e tino hiahia te bytecode kia whakamaoritia mai i tetahi waahanga, ka taea noa e matou te whakaputa mai i te mahi i runga i te TB .

Ka haere mai ka whana

Ahakoa i timata ahau ki te tuhi ano i te waehere i te marama o Hurae, ka eke te whana makutu kaore i kitea: ko te tikanga ka tae mai nga reta mai i GitHub hei whakamohiotanga mo nga whakautu ki nga Take me nga tono Pull, engari i konei, ohorere whakahua i roto i te miro Binaryen hei tuara qemu i roto i te horopaki, "I mahia e ia tetahi mea penei, tera pea ka korero ia." I korero matou mo te whakamahi i te whare pukapuka a Emscripten Binaryen ki te hanga WASM JIT. Kaati, i kii ahau he raihana Apache 2.0 koe kei reira, ka tohatohahia te QEMU katoa i raro i te GPLv2, kaore i te tino hototahi. Inamata ka puta mai he raihana ka taea whakatikahia te ahua (Kare au e mohio: tera pea ka huri, ka rua pea te raihana, tera pea tetahi atu...). Ko te tikanga, i harikoa ahau, na te mea i tera wa kua ata titiro ahau hōputu rua WebAssembly, a he ahua pouri ahau me te kore e marama. He whare pukapuka ano ka kai i nga poraka taketake me te kauwhata whakawhiti, ka whakaputa i te bytecode, me te whakahaere ano i roto i te kaiwhakamaori, mena e tika ana.

Katahi ano etahi atu he reta i runga i te rarangi mēra QEMU, engari he korero ake tenei mo te patai, "Ko wai tonu e hiahia ana?" Na ko reira ohorere, i puta mai he mea tika. I te iti rawa, ka taea e koe te tango i nga waahanga e whai ake nei mo te whakamahi, mena ka tere ake, ka iti ake ranei te mahi:

  • te whakarewa i tetahi mea matauranga kaore he whakaurunga
  • mariko i runga i te iOS, kei hea, e ai ki nga korero, ko te tono anake e whai mana ana ki te whakaputa tohu i runga i te rere he miihini JS (he pono tenei?)
  • whakaaturanga o te mini-OS - kotahi-floppy, hanga-i roto, momo katoa o te mārō, etc...

Ngā Āhuatanga Wā Whakahaere Pūtirotiro

Ka rite ki taku korero, kua herea a QEMU ki te multithreading, engari kaore i te kaitirotiro. Ae ra, kao... I te tuatahi kaore rawa i te noho, katahi ka puta mai a WebWorkers - ki taku mohio, he maha tenei i runga i te tuku karere. kahore he taurangi tiritahi. Ko te tikanga, ka puta he raru nui i te wa e kawe ana i te waehere o naianei i runga i te tauira mahara tiritiri. Na, i raro i nga pehanga a te iwi, i whakatinanahia ano i raro i te ingoa SharedArrayBuffers. I āta whakaurua mai, i whakanuia e ratou tana whakarewatanga i roto i nga momo kaitirotiro rereke, katahi ka whakanui i te Tau Hou, katahi ko Meltdown... I muri iho ka tae mai ki te whakatau he kino, he koroke ranei te inenga o te wa, engari ma te awhina o te mahara tahi me te miro piki te porotiti, he rite katoa ka tino tika te mahi. Na i monoa e matou te miro maha me te mahara tiritahi. Te ahua nei kua huri ano ratou i muri mai, engari, i te mea kua maarama mai i te whakamatautau tuatahi, kei reira te ora me te kore, a, ki te pera, ka ngana tatou ki te mahi me te kore e whakawhirinaki ki te multithreading.

Ko te waahanga tuarua ko te kore e taea te raweke taumata-iti me te puranga: e kore e taea e koe te tango noa, tiakina te horopaki o naianei me te huri ki tetahi mea hou me te puranga hou. Ko te puranga waea e whakahaerehia ana e te miihini mariko JS. Te ahua nei, he aha te raru, na te mea i whakatau tonu matou ki te whakahaere i nga rerenga o mua ma te ringaringa? Ko te meka ko te poraka I/O i QEMU ka whakatinanahia na roto i nga coroutines, a koinei te waahi ka taea te whakamahi i nga whaaweke taumata-iti. Waimarie, kei a Emscipten he tikanga mo nga mahi tukutahi, e rua: Asyncify и Emterpreter. Ko te mea tuatahi e mahi ana na roto i te pupuhi nui i roto i te waehere JavaScript kua hangaia, kaore i te tautokohia. Ko te tuarua ko te "ara tika" o naianei me te mahi i roto i te hanga bytecode mo te kaiwhakamaori maori. Ka mahi, he maamaa, engari kaore e pupuhi te waehere. Pono, me koha takitahi te tautoko mo nga coroutine mo tenei tikanga (kua tuhia kee nga coroutine mo Asyncify me te whakatinanatanga o te API rite tonu mo Emterpreter, me hono noa koe).

I tenei wa, kaore ano ahau i kaha ki te wehewehe i te waehere ki tetahi i whakaemihia i WASM me te whakamaori ma te whakamahi i te Emterpreter, na reira kaore ano kia mahi nga taputapu poraka (tirohia i roto i nga raupapa e whai ake nei, e kii ana ratou ...). Arā, i te mutunga me whiwhi koe i tetahi mea penei i tenei mea paparanga rorirori:

  • i whakamaoritia te poraka I/O. Ana, i tino tumanako koe ki te whai i te NVMe me nga mahi taketake? 🙂
  • waehere matua QEMU kua whakahiatohia (kaiwhakamaori, etahi atu taputapu kua peehia, me etahi atu)
  • kua whakahiatohia te waehere manuhiri ki WASM

Nga ahuatanga o nga punawai QEMU

I te mea kua whakaaro koe, kua wehea te waehere mo te whai i nga hoahoanga manuhiri me te waehere mo te whakaputa tohutohu miihini manaaki i roto i te QEMU. Ko te mea pono, he iti ake te uaua:

  • kei reira nga hoahoanga manuhiri
  • ko kaiwhakatere, ara, KVM mo te mariko taputapu i runga i te Linux (mo nga manuhiri me nga punaha manaaki e hototahi ana ki a raatau ano), TCG mo te hanga waehere JIT ki hea. I timata mai i te QEMU 2.9, ka puta te tautoko mo te paerewa marikotanga taputapu HAXM i Windows (nga korero)
  • Mena ka whakamahia te TCG, ehara i te mariko taputapu, katahi ka whai tautoko whakangao waehere motuhake mo ia hoahoanga manaaki, me te kaiwhakamaori mo te ao.
  • ... me te huri noa i enei mea katoa - ko nga taputapu taapiri, te atanga kaiwhakamahi, te heke, te rekoata-whakatangi, aha atu.

Ma te ara, i mohio koe: Ka taea e QEMU te whai i te rorohiko katoa, engari ano hoki te tukatuka mo te tukanga kaiwhakamahi motuhake i roto i te kernel kaihautū, e whakamahia ana, hei tauira, e te AFL fuzzer mo te taputapu rua. Tena pea kei te pirangi tetahi ki te kawe i tenei momo mahi a QEMU ki JS? 😉

Pērā i te nuinga o ngā pūmanawa kore utu kua roa nei, ka hangaia a QEMU ma te waea configure и make. Me kii ka whakatau koe ki te taapiri i tetahi mea: he tuara TCG, whakatinana miro, tetahi atu mea. Kaua e tere ki te koa/whakawehi (tararo i te mea e tika ana) mo te korero ki a Autoconf - he pono, configure Ko te ahua o te QEMU he mea tuhi-whaiaro, kaore i hangaia mai i tetahi mea.

Paetukutuku

Na he aha tenei mea e kiia nei ko WebAssembly (aka WASM)? He whakakapinga tenei mo Asm.js, kua kore e kii he waehere JavaScript whaimana. Engari, he mea ruarua noa me te arotau, me te tuhi noa i te tauoti ki roto ehara i te mea tino ngawari: mo te ngawari, ka penapena ki te whakatakotoranga. LEB128.

Kua rongo pea koe mo te relooping algorithm mo Asm.js - koinei te whakahokinga mai o nga tohutohu whakahaere rere "taumata-tiketike" (ara, mena-ka-tetahi, koropiko, me etahi atu), i hangaia ai nga miihini JS, mai i te LLVM IR taumata-iti, tata ki te waehere miihini i mahia e te tukatuka. Ko te tikanga, ko te tohu takawaenga o QEMU he tata ki te tuarua. Ko te ahua kei konei, bytecode, te mutunga o te mamae... Na tera ano etahi poraka, ki te mea-ka-atu me nga koropiko!..

A koinei tetahi atu take i whai hua ai a Binaryen: ka taea e ia te whakaae ki nga poraka taumata teitei e tata ana ki nga mea ka penapena ki WASM. Engari ka taea hoki te whakaputa waehere mai i te kauwhata o nga poraka taketake me nga whakawhitinga i waenganui ia ratou. Ana, kua kii ano ahau kei te huna i te whakatakotoranga rokiroki WebAssembly i muri i te C/C++ API watea.

TCG (Kaihanga Waehere Iti)

GCT i te tuatahi backend mo te whakahiato C. Na, ko te ahua, kaore i taea e ia te tu atu ki te whakataetae me te GCC, engari i te mutunga ka kitea e ia tona waahi i roto i te QEMU hei tikanga whakangao waehere mo te papaa manaaki. He tuara hoki TCG e whakaputa ana i etahi bytecode waitara, ka mahia tonutia e te kaiwhakamaori, engari i whakatau ahau ki te karo i te whakamahi i tenei waa. Heoi, ko te meka kei roto i te QEMU kua taea te whakawhiti ki te TB hangaia ma te mahi tcg_qemu_tb_exec, i puta he tino whai hua mo au.

Hei taapiri i tetahi tuara TCG hou ki QEMU, me hanga e koe he raarangiroto tcg/<имя архитектуры> (i tenei take, tcg/binaryen), a e rua nga konae kei roto: tcg-target.h и tcg-target.inc.c и rehita he mea katoa configure. Ka taea e koe te whakatakoto i etahi atu konae ki reira, engari, ka taea e koe te whakaaro mai i nga ingoa o enei e rua, ka whakaurua e rua ki tetahi waahi: kotahi hei konae pane i nga wa katoa (kei roto tcg/tcg.h, kei roto kē tera i etahi atu konae kei roto i nga whaiaronga tcg, accel a ehara i te mea anake), ko tetahi atu - hei waahanga waehere anake i roto tcg/tcg.c, engari e whai waahi ana ki ana mahi pateko.

I te whakatau ka whakapaua e au he wa roa mo nga tirotirohanga mo te mahi, ka kape noa ahau i nga "skeletons" o enei konae e rua mai i tetahi atu whakatinanatanga o muri, me te whakaatu pono i tenei ki te pane raihana.

kōnae tcg-target.h kei roto te nuinga o nga tautuhinga i te ahua #define-s:

  • e hia nga rehita me te aha te whanui kei runga i te hoahoanga whaainga (he maha nga mea e hiahia ana matou, ko te maha o ta matou e hiahia ana - ko te patai he nui ake mo nga mea ka hangaia hei waehere pai ake e te kaitirotiro i runga i te hoahoanga "tino whainga" ...)
  • te whakatikatika i nga tohutohu a te kaihautu: i runga i te x86, a tae noa ki te TCI, kaore nga tohutohu e tika ana, engari ka whakauruhia e ahau ki roto i te kaapiri waehere ehara i nga tohutohu, engari he tohu ki nga hanganga whare pukapuka Binaryen, no reira ka kii ahau: 4 paita
  • he aha nga tohutohu ka taea e te tuara te whakaputa - ka whakauruhia e matou nga mea katoa ka kitea e matou i Binaryen, ma te kaiwhakatere e wawahi te toenga ki nga mea ngawari ake
  • He aha te rahi tata o te keteroki TLB i tonoa e te tuara. Ko te meka kei roto i te QEMU he tino kino nga mea katoa: ahakoa he mahi kaiawhina e mahi ana i te utaina / toa ma te whakaaro ki te manuhiri MMU (kei hea tatou kaore inaianei?), ka tiakina e ratou o raatau whakamaoritanga i te ahua o te hanganga, te he pai ki te whakauru tika ki nga poraka haapurorotanga. Ko te patai, he aha te utu i roto i tenei hanganga ka tino pai te tukatuka ma te raupapa iti me te tere o nga whakahau?
  • i konei ka taea e koe te takawiri i te kaupapa o te kotahi, e rua ranei nga rehita kua rahuitia, ka taea te waea TB ma te mahi me te whakaahua i nga mea iti e rua. inline-mahi rite flush_icache_range (engari ehara tenei i a maatau)

kōnae tcg-target.inc.cKo te tikanga, he nui ake te rahi me te maha o nga mahi mana:

  • arawhitinga, tae atu ki nga here ka taea e nga tohutohu te whakahaere i nga operan. I kape maataa e au mai i tetahi atu tuara
  • mahi e tango ana i tetahi tohutohu bytecode o roto
  • Ka taea hoki e koe te whakauru i nga mahi awhina ki konei, ka taea hoki e koe te whakamahi i nga mahi pateko mai tcg/tcg.c

Moku ake, i whiriwhiria e au te rautaki e whai ake nei: i nga kupu tuatahi o te poraka whakamaori e whai ake nei, i tuhia e au nga tohu e wha: he tohu timata (he uara kei te tata 0xFFFFFFFF, i whakatau i te ahua o te TB o naianei), te horopaki, te waahanga hanga, me te tau makutu mo te patuiro. I te tuatahi i whakauruhia te tohu ki roto 0xFFFFFFFF - nte wahi n - he tau pai iti, a ia wa ka mahia e te kaiwhakamaori ka piki ake ma te 1. Ka tae 0xFFFFFFFE, i puta te whakahiatotanga, i tiakina te kōwae ki te ripanga mahi, i kawemai ki roto i te "whakarewa" iti, i haere mai ai te mahi. tcg_qemu_tb_exec, ka tangohia te kōwae mai i te pūmahara QEMU.

Ki te whakamaarama i nga karaehe, "Crutch, pehea te nui o te tuitui i roto i tenei tangi mo te ngakau o te proger ...". Heoi ano, ka turuturu te mahara ki tetahi wahi. I tua atu, na QEMU te mahara! I ahau he waehere, i te wa e tuhi ana i nga tohutohu e whai ake nei (he pai, ara, he tohu), ka mukua te tangata nana nei te hono i tenei waahi i mua, engari kaore tenei i awhina. Inaa, i roto i te keehi ngawari, ka tohatohahia e QEMU te mahara i te tiimatanga ka tuhia te waehere i hangaia ki reira. I te paunga o te parapara, ka makahia te waehere ka timata te tuhi i muri mai ki tona waahi.

Whai muri i taku ako i te waehere, ka mohio ahau na te mahi tinihanga me te tau makutu ka taea e au te kore e taka i runga i te whakangaromanga ma te tuku i tetahi mea he i runga i te kaitao kaore i mohiohia i te waa tuatahi. Engari ko wai ka tuhi ano i te parapara ki te karo i taku mahi i muri mai? Ka rite ki te tohutohu a nga kaiwhakawhanake Emscripten, i te wa i pa mai ahau ki tetahi raru, ka tukuna e ahau te waehere hua ki te tono taketake, ka whakanohohia te Mozilla Record-Replay ki runga ... I te nuinga, i te mutunga ka mohio ahau he mea ngawari: mo ia poraka, a struct TranslationBlock me tana whakaahuatanga. Whakaarohia kei hea ... Ka tika, i mua tonu i te poraka kei roto tonu i te parepare. I te mohio ki tenei, ka whakatau ahau ki te whakamutu i te whakamahi tootoo (he iti rawa etahi), ka maka noa atu te nama makutu, ka whakawhiti i nga kupu e toe ana ki struct TranslationBlock, te hanga i tetahi rarangi hono takitahi ka taea te whakawhiti tere ina tautuhia te keteroki whakamaori, me te waatea i te mahara.

Kei te noho tonu etahi tootoo: hei tauira, he tohu tohu kei roto i te kaitarai waehere - he ngawari etahi BinaryenExpressionRef, ara, ka titiro ratou ki nga korero e tika ana kia whakauruhia ki roto i te poraka taketake kua hangaia, ko tetahi waahanga ko te tikanga mo te whakawhiti i waenga i nga BB, ko tetahi waahanga hei haere. Ana, kua rite etahi poraka mo te Relooper me hono ki runga i nga tikanga. Hei wehewehe i a raatau, ka whakamahia te whakapae he mea hono katoa ma te wha nga paita neke atu, na reira ka taea e koe te whakamahi haumaru i nga moka e rua iti rawa mo te tapanga, me mahara noa koe ki te tango mena e tika ana. Ma te ara, kua whakamahia kee nga tapanga i roto i te QEMU hei tohu i te take i puta ai i te kopae TCG.

Ma te whakamahi i te Binaryen

Ko nga waahanga kei roto i te WebAssembly kei roto nga mahi, kei ia waahanga he tinana, he korero. Ko nga korero he mahi kotahi me nga mahi rua, poraka kei roto i nga rarangi o etahi atu korero, te rere whakahaere, me era atu. Ka rite ki taku korero, ko te rere o te whakahaere i konei ka rite ki nga manga taumata teitei, nga koropiko, nga waea mahi, me era atu. Ko nga tautohetohe ki nga mahi kaore e tukuna i runga i te puranga, engari he maamaa, penei i a JS. He rereke ano te ao, engari kaore au i whakamahi, na reira kaore au e korero ki a koe.

He taurangi paetata ano nga mahi, kua tau mai i te kore, he momo: int32 / int64 / float / rua. I tenei take, ko nga taurangi n rohe tuatahi ko nga tohenga i tukuna ki te mahi. Kia mahara, ahakoa ko nga mea katoa i konei ehara i te taumata-iti rawa mo te rere whakahaere, karekau tonu nga tauoti e mau ana i te huanga "kua hainatia/kaore i haina": ko te ahua o te tau kei runga i te waehere mahi.

I te nuinga o te korero, ka whakaratohia e Binaryen C-API ngawari: ka hanga e koe he kōwae, i roto ia ia hanga kupu - unary, rua, poraka mai i etahi atu korero, whakahaere rere, aha atu. Na ka hanga e koe he mahi me tetahi korero hei tinana. Mena kei a koe he kauwhata whakawhiti taumata iti, ko te relooper wae te awhina i a koe. Ki taku mohio, ka taea te whakamahi i te mana taumata teitei o te rere o te mahi i roto i te poraka, mena karekau e eke ki tua o nga rohe o te poraka - ara, ka taea te hanga i te ara tere o roto / puhoi. ara manga i roto i te waehere tukatuka keteroki TLB hanga-i, engari kaua e pokanoa ki te rere mana "waho". Ka wetekina e koe he relooper, ka wetekina ona poraka; ina wetekina e koe he kōwae, nga whakaaturanga, nga mahi, me era atu mea kua tohaina ki a ia ka ngaro arena.

Heoi, ki te hiahia koe ki te whakamaori i te waehere i runga i te rere me te kore hanga me te whakakore i tetahi tauira kaiwhakamaori, he mea tika ki te whakauru i tenei arorau ki roto i te konae C++, mai i reira ka whakahaere tika i te C++ API katoa o te whare pukapuka, ma te kore e rite- hanga takai.

Na ki te whakaputa i te waehere e hiahia ana koe

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

... ki te wareware ahau ki tetahi mea, aroha mai, he tohu noa tenei mo te tauine, kei roto i nga tuhinga nga korero.

Na inaianei ka timata te crack-fex-pex, penei:

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

Kia taea ai te hono i nga ao o QEMU me JS me te wa ano ka uru tere ki nga mahi kua whakahiatohia, i hangaia he huinga (he ripanga mahi hei kawemai ki roto i te kaiwhakarewa), ka tuu nga mahi kua mahia ki reira. Kia tere te tatau i te taupū, i whakamahia te taupū o te poraka whakamaori kupu kore i te tuatahi, engari katahi ka timata te taupū i tatau ma te whakamahi i tenei tauira ka uru noa ki te mara i struct TranslationBlock.

I te ara, whakaaturanga (i tenei wa me te raihana pouri) he pai noa te mahi i Firefox. Ko nga kaihanga Chrome kaore ano kia rite ki te mea ka hiahia tetahi ki te hanga neke atu i te kotahi mano nga tauira o te WebAssembly modules, no reira ka tohatoha noa ratou he gigabyte mokowā wāhitau mariko mo ia...

Heoi ano mo naianei. Tera pea ka puta ano he tuhinga mena ka pirangi tetahi. Ara, kei te noho tonu anake kia mahi nga taputapu poraka. He mea tika ano te whakahiatotanga o nga waahanga WebAssembly kia rite ki nga tikanga o te ao JS, na te mea kei reira tonu tetahi kaiwhakamaori hei mahi i enei mea katoa kia rite ra ano te waahanga taketake.

Ka mutu he kai: kua whakahiatohia e koe he rua i runga i te hoahoanga moka-32, engari ko te waehere, na roto i nga mahi mahara, ka piki mai i Binaryen, i tetahi waahi i runga i te puranga, i tetahi atu waahi ranei i te 2 GB o runga o te mokowā wāhitau 32-bit. Ko te raruraru, mai i te tirohanga a Binaryen he nui rawa te urunga ki tetahi wahitau ka puta. Me pehea te huri i tenei?

I te ara a te kaiwhakahaere

Kaore au i mutu ki te whakamatau i tenei, engari ko taku whakaaro tuatahi ko "Mehemea ka whakauruhia e ahau te 32-bit Linux?" Na ko te waahanga o runga o te waahi waahi ka nohoia e te kernel. Ko te patai anake ko te nui o nga mea ka nohoia: 1, 2 Gb ranei.

I roto i te huarahi a te kaitakataka (he whiringa ma nga tohunga)

Kia pupuhihia he mirumiru ki runga o te mokowā wāhitau. Kaore au i te marama he aha te mahi - kei kona kua me noho he puranga. Engari "he tohunga matou: he pai nga mea katoa mo matou, engari kaore tetahi e mohio he aha ..."

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

... he pono karekau i te hototahi ki a Valgrind, engari, ko te waimarie, ko Valgrind tonu te tino pana i nga tangata katoa ki waho :)

Tera pea tetahi e pai ake te whakamarama mo te mahi o tenei waehere aku...

Source: will.com

Tāpiri i te kōrero