QEMU.js: ikozvino yakakomba uye neWASM

Pane imwe nguva ndakafunga zvekunakidzwa ratidza kudzoreredzwa kwemaitiro uye dzidza kugadzira JavaScript (chaizvo, Asm.js) kubva muchina kodhi. QEMU yakasarudzwa kuyedza, uye imwe nguva gare gare chinyorwa chakanyorwa paHabr. Mune zvirevo ndakarairwa kuti ndigadzirise purojekiti muWebAssembly, uye ndikatozvirega ndoda kupedza Ini neimwe nzira ndakanga ndisingadi purojekiti ... Basa rakanga richienderera mberi, asi zvishoma nezvishoma, uye zvino, munguva pfupi yapfuura munyaya iyoyo yakaonekwa commentary pamusoro unoti β€œSaka zvese zvakapera sei?” Mukupindura mhinduro yangu yakadzama, ndakanzwa "Ichi chinonzwika sechinyorwa." Zvakanaka, kana uchikwanisa, pachava nechinyorwa. Zvichida mumwe munhu achazviona zvichibatsira. Kubva pairi muverengi achadzidza zvimwe chokwadi nezve dhizaini yeQEMU kodhi yechizvarwa backends, pamwe nekunyora kweJust-in-Time compiler yewebhu application.

mabasa

Sezvo ndakanga ndatodzidza nzira ye "neimwe nzira" yekutakura QEMU kuJavaScript, nguva ino yakasarudzwa kuti iite nekuchenjera uye kusadzokorora zvikanganiso zvekare.

Kukanganisa nhamba yekutanga: bazi kubva pakuburitswa kwenzvimbo

Kukanganisa kwangu kwekutanga kwaive kuforoma vhezheni yangu kubva kumusoro vhezheni 2.4.1. Zvakabva zvaita senge zano rakanaka kwandiri: kana kuburitswa kwepoinzi kuripo, saka inogona kunge yakagadzikana pane iri nyore 2.4, uye zvakatonyanya bazi. master. Uye sezvo ndakaronga kuwedzera huwandu hwakaringana hwezvipembenene zvangu, ini ndaisada zvemumwe munhu zvachose. Zvimwe ndozvazvakaita. Asi heino chinhu: QEMU haina kumira, uye pane imwe nguva vakatozivisa optimization yekodhi yakagadzirwa ne 10. "Hongu, ikozvino ndichave nechando," ndakafunga uye ndakaputsika. Pano tinofanira kuita digression: nekuda kweiyo-threaded nature yeQEMU.js uye chokwadi chekuti QEMU yepakutanga hairevi kusavapo kwe-multi-threading (kureva, kukwanisa kushanda panguva imwe chete nzira dzinoverengeka dzisina hukama hwekodhi, uye kwete kungo "shandisa ese kernels") yakakosha pazviri, iwo makuru mabasa etambo ndaifanira "kuiburitsa" kuti ndikwanise kufona kubva kunze. Izvi zvakagadzira mamwe matambudziko echisikigo panguva yekubatanidzwa. Zvisinei, chokwadi chokuti dzimwe shanduko kubva kubazi master, iyo yandakaedza kubatanidza kodhi yangu, zvakare cherry yakatorwa mukuburitswa kwepoindi (uye nekudaro mubazi rangu) zvakare pamwe ingadai isina kuwedzera nyore.

Kazhinji, ndakafunga kuti zvichiri kuita zvine musoro kukanda kunze prototype, kuiparadzanisa kune zvikamu uye kuvaka vhezheni nyowani kubva pakatanga zvichibva pane chimwe chinhu chitsva uye ikozvino kubva. master.

Chikanganiso chechipiri: TLP nzira

Muchidimbu, ichi hachisi chikanganiso, kazhinji, chingori chimiro chekugadzira purojekiti mumamiriro ezvinhu ekusanzwisisana kwese "kupi uye sei kufamba?" uye kazhinji "tichasvika ikoko?" Mumamiriro ezvinhu aya clumsy programming yakanga iri sarudzo yakaruramiswa, asi, sezvazviri, ndakanga ndisingadi kuidzokorora zvisina kufanira. Panguva ino ndaida kuzviita nehungwaru: maatomu anoita, conscious kodhi shanduko (uye kwete "kusungirira mavara asina kujairika pamwe chete kusvikira yagadzira (neyambiro)", sezvakataurwa naLinus Torvalds nezve mumwe munhu, maererano Wikiquote), nezvimwe.

Mistake nhamba yetatu: kupinda mumvura usingazive ford

Ini handisati ndabvisa zvachose izvi, asi ikozvino ndafunga kusatevera nzira yekushomeka kushoma, uye kuti ndiite iyo "yakura nzira", kureva, nyora yangu TCG backend kubva kutanga, kuti urege. kuzoti gare gare, "Hongu, izvi ndizvo, zvishoma nezvishoma, asi ini handikwanise kudzora zvese - ndomanyorerwo eTCI ..." Uyezve, izvi pakutanga zvaiita semhinduro iri pachena, kubvira Ini ndinogadzira binary kodhi. Sezvavanotaura, β€œGhent yakaunganaΡƒ, asi kwete iyo ": iyo kodhi, hongu, bhinary, asi kutonga hakugone kungotamiswa kwairi - inofanirwa kusundirwa zvakajeka mubrowser kuti iunganidzwe, zvichikonzera chimwe chinhu kubva kuJS world, iyo ichiri kuda ugoponeswa pane imwe nzvimbo. Nekudaro, pane zvakajairwa RISC zvivakwa, sekunzwisisa kwandinoita, mamiriro akajairwa kudiwa kwekunyatso gadzirisa cache yekuraira yekodhi yakagadziridzwa - kana izvi zvisiri izvo zvatinoda, saka, chero zvakadaro, padyo. Mukuwedzera, kubva pakuedza kwangu kwekupedzisira, ndakadzidza kuti kutonga hakuiti kuendeswa pakati pechivharo chekushandura, saka hatidi chaizvo bytecode kududzirwa kubva kune chero ipi zvayo, uye tinogona kungoigadzira kubva pakushanda paTB. .

Vakasvika ndokukava

Kunyangwe ini ndakatanga kunyora kodhi kumashure muna Chikunguru, kurova kwemashiripiti kwakakwira kusingaonekwe: kazhinji mabhii kubva kuGitHub anosvika sezviziviso nezve mhinduro kune Nyaya uye Dhonza zvikumbiro, asi pano, pakarepo taura mu thread Binaryen as a qemu backend muchirevo chechinyorwa, "Akaita chinhu chakadaro, pamwe achataura chimwe chinhu." Taitaura nezve kushandisa raibhurari yaEmscripten ine hukama Binaryen kugadzira WASM JIT. Zvakanaka, ndati une rezinesi reApache 2.0 ipapo, uye QEMU yese yakagoverwa pasi peGPLv2, uye haienderane. Pakarepo zvakazoitika kuti rezinesi rinogona kuva gadzirisa neimwe nzira (Ini handizive: pamwe chinja, pamwe marezinesi maviri, pamwe chimwe chinhu ...). Chokwadi izvi zvakandifadza nekuti panguva iyi ndainge ndatonyatsotarisa binary format WebAssembly, uye ndakanga neimwe nzira ndakasuruvara uye ndisinganzwisisi. Paive zvakare neraibhurari yaizomedza mabhuroko ekutanga negirafu yekuchinja, kuburitsa bytecode, uye kutoimhanyisa mumuturikiri pachayo, kana zvichidikanwa.

Ipapo pakanga pane zvimwe tsamba parondedzero yetsamba yeQEMU, asi izvi zvakanyanya nezvemubvunzo, "Ndiani anoida zvakadaro?" Uye ndizvo pakarepo, zvakabva zvaita. Pazvishoma, iwe unogona kukwenya pamwechete zvinotevera mikana yekushandisa, kana ikashanda zvakanyanya kana zvishoma nekukurumidza:

  • kutanga chimwe chinhu chinodzidzisa pasina kuiswa zvachose
  • virtualization paIOS, uko, maererano nerunyerekupe, iyo chete application ine kodzero yekugadzira kodhi pane nhunzi injini yeJS (ichi ichokwadi?)
  • kuratidzwa kwemini-OS - single-floppy, yakavakirwa-mukati, ese marudzi e firmware, nezvimwe ...

Browser Runtime Features

Sezvandambotaura, QEMU yakasungirirwa kumultithreading, asi browser haina. Zvakanaka, ndiko kuti, kwete ... Pakutanga yakanga isipo zvachose, ipapo WebWorkers yakaonekwa - semanzwisisiro andinoita, uku ndiko kuverenga kwakawanda zvichienderana nekupfuura kwemeseji. pasina kugoverana zvinoshanduka. Sezvingatarisirwa, izvi zvinogadzira matambudziko akakosha kana uchiisa kodhi iripo zvichibva pane yakagovaniswa memory modhi. Zvadaro, pasi pekumanikidzwa kwevanhu, yakashandiswawo pasi pezita SharedArrayBuffers. Yakatangwa zvishoma nezvishoma, vakapemberera kutangwa kwayo mumabhurawuza akasiyana, ndokuzopemberera Gore Idzva, uyezve Meltdown... Mushure mezvo vakasvika pakugumisa kuti kukora kana kuomarara kuyerwa kwenguva, asi nerubatsiro rwekurangarira pamwe chete uye a. thread incrementing counter, zvese zvakafanana ichaita zvakanaka chaizvo. Saka isu takadzima multithreading neyakagovaniswa ndangariro. Zvinoita sekuti vakazoidzorera zvakare, asi, sezvazvakava pachena kubva pakuedza kwekutanga, kune hupenyu husina iyo, uye kana zvakadaro, tichaedza kuzviita tisingavimbi nemultithreading.

Chechipiri chimiro kusagoneka kweakaderera-level manipulations ane stack: haugone kungotora, chengetedza mamiriro azvino uye chinja kune imwe nyowani ine stack nyowani. Iyo yekufona stack inotungamirwa neJS virtual muchina. Zvingaite senge, dambudziko nderei, sezvo isu tichiri kufunga kubata ekutanga kuyerera zvachose nemaoko? Icho chokwadi ndechekuti block I / O muQEMU inoshandiswa kuburikidza nemakoratini, uye apa ndipo paizosvika yakaderera-level stack manipulations. Neraki, Emscipten yatove neyakagadziridzwa yeasynchronous mashandiro, kunyangwe maviri: Asyncify ΠΈ Emterpreter. Yekutanga inoshanda kuburikidza neyakakura bloat mune inogadzirwa JavaScript kodhi uye haichatsigirwi. Yechipiri ndiyo yazvino "nzira chaiyo" uye inoshanda kuburikidza nebytecode chizvarwa chemuturikiri wekuzvarwa. Inoshanda, hongu, zvishoma nezvishoma, asi haina bloat kodhi. Chokwadi, tsigiro yemakorasi emuchina uyu yaifanira kupihwa yakazvimiririra (paive patove nemakorati akanyorerwa Asyncify uye pakave nekuitwa kweinoda kufanana API yeEmterpreter, waingoda kuzvibatanidza).

Parizvino, ini handisati ndakwanisa kupatsanura kodhi mune imwe yakanyorwa muWASM uye yakadudzirwa uchishandisa Emterpreter, saka block zvishandiso hazvisati zvashanda (ona mune inotevera nhevedzano, sezvavanotaura ...). Ndokunge, mukupedzisira iwe unofanirwa kuwana chimwe chinhu senge ichi chinosekesa chakaiswa chinhu:

  • bhuroko rakadudzirwa I/O. Zvakanaka, iwe wakanyatso kutarisira kutevedzerwa NVMe nekuita kwekuzvarwa? πŸ™‚
  • yakanyatso kuunganidzwa hombe QEMU kodhi (muturikiri, mamwe emulated zvishandiso, nezvimwewo)
  • akabatanidza zvine simba kodhi yevaenzi muWASM

Zvimiro zveQEMU zvinyorwa

Sezvaungadaro iwe watofungidzira, iyo kodhi yekutevedzera mavakirwo evaenzi uye kodhi yekugadzira mirairo yemuchina wekugamuchira yakaparadzaniswa muQEMU. Muchokwadi, zvakatonyanya trickier:

  • kune mavakirwo evaenzi
  • pane accelerators, kureva, KVM yehardware virtualization paLinux (yevaenzi uye anotambira masisitimu anoenderana nemumwe), TCG yeJIT kodhi chizvarwa chero kupi. Kutanga neQEMU 2.9, tsigiro yeHAXM hardware virtualization standard paWindows yakaonekwa (zvinyorwa)
  • kana TCG ichishandiswa uye kwete hardware virtualization, saka ine yakaparadzana kodhi chizvarwa tsigiro kune yega yega dhizaini yekuvakisa, pamwe neyepasirese muturikiri.
  • ... uye zvakatenderedza zvese izvi - zvakateedzerwa maperipherals, mushandisi interface, kutama, kurekodha-replay, nezvimwe.

Nenzira, waiziva here: QEMU inogona kutevedzera kwete komputa yese chete, asiwo processor yeyakasiyana mushandisi maitiro mune inotambira kernel, iyo inoshandiswa, semuenzaniso, neAFL fuzzer yebhinari chiridzwa. Zvichida mumwe munhu angade kutakura iyi modhi yekushanda kweQEMU kuenda kuJS? πŸ˜‰

Senge yakawanda-yakareba-yakamira software yemahara, QEMU inovakwa kuburikidza nekufona configure ΠΈ make. Ngatiti iwe wafunga kuwedzera chimwe chinhu: TCG backend, tambo kuita, chimwe chinhu. Usamhanye kufara/kuvhundutswa (nyora pasi pazvinenge zvakakodzera) uchitarisira kutaurirana neAutoconf - kutaura zvazviri, configure QEMU's sezviri pachena yakanyorwa-yega uye haina kugadzirwa kubva kune chero chinhu.

web assembly

Saka chii chinonzi WebAssembly (aka WASM)? Iyi itsiva yeAsm.js, isingachanyepedzeri kuva JavaScript code inoshanda. Mukupesana, inongori bhinari uye yakagadziridzwa, uye kunyangwe kungonyora nhamba mukati mayo hakusi nyore: kune compactness, inochengetwa mufomati. LEB128.

Iwe unogona kunge wakanzwa nezve relooping algorithm yeAsm.js - uku ndiko kudzoreredzwa kwe "yepamusoro-nhanho" yekudzora kuyerera mirairo (kureva, kana-zvino-zvimwe, zvishwe, nezvimwewo), iyo JS injini dzakagadzirirwa, kubva. iyo yakaderera-level LLVM IR, padhuze nekodhi yemushini inoitwa ne processor. Nomuzvarirwo, mumiriri wepakati weQEMU ari pedyo nechechipiri. Zvingaita sekuti hezvino, bytecode, kuguma kwekutambudzwa ... Uyezve kune mabhuroko, kana-zve-zvimwe uye zvishwe!..

Uye ichi ndicho chimwe chikonzero nei Binaryen inobatsira: inogona kugashira mabhuroki epamusoro-soro padyo neaizochengetwa muWASM. Asi inogonawo kuburitsa kodhi kubva pagirafu yezvivharo zvekutanga uye shanduko pakati pavo. Zvakanaka, ini ndakatotaura kuti inovanza iyo WebAssembly yekuchengetedza fomati kuseri kweyakanakira C/C ++ API.

TCG (Tiny Code Generator)

GTC pakutanga backend for the compiler C. Zvadaro, sezviri pachena, yaisakwanisa kumira kukwikwidzana neGCC, asi pakupedzisira yakawana nzvimbo yayo muQEMU senzira yekugadzira code yenzvimbo yekutambira. Kune zvakare TCG backend iyo inogadzira imwe abstract bytecode, iyo inokurumidza kuurayiwa nemuturikiri, asi ndakasarudza kusaishandisa panguva ino. Nekudaro, chokwadi chekuti muQEMU zvatove kugona kugonesa shanduko kune yakagadzirwa TB kuburikidza nebasa. tcg_qemu_tb_exec, zvakabva zvandibatsira chaizvo.

Kuti uwedzere TCG itsva backend kuQEMU, unofanirwa kugadzira subdirectory tcg/<имя Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹> (munyaya iyi, tcg/binaryen), uye ine mafaera maviri: tcg-target.h ΠΈ tcg-target.inc.c ΠΈ kuraira zviri pamusoro configure. Iwe unogona kuisa mamwe mafaera ipapo, asi, sezvaunogona kufungidzira kubva kumazita eava maviri, iwo ese achaverengerwa kumwe kunhu: imwe seyakajairwa musoro faira (inosanganisirwa mukati. tcg/tcg.h, uye iyo yatove mune mamwe mafaera mumadhairekitori tcg, accel uye kwete chete), imwe yacho - chete sekodhi snippet mukati tcg/tcg.c, asi inokwanisa kuwana maitiro ayo akamira.

Ndichifunga kuti ndaizopedza nguva yakawandisa pakuferefeta kwakadzama kwemashandiro azvinoita, ndakangokopa "skeletons" emafaira maviri aya kubva kune imwe backend kuitiswa, nekutendeka kuratidza izvi mumusoro werezinesi.

faira tcg-target.h ine kunyanya marongero mufomu #define-s:

  • mangani marejista uye nehupamhi hupi huripo pachinangwa chekuvaka (isu tine akawanda sezvatinoda, akawanda sezvatinoda - mubvunzo uri pamusoro pezvichagadzirwa mukodhi inoshanda zvakanyanya nebrowser pane "chaizvo chinangwa" architecture. ...)
  • kurongeka kwemirairo yekugamuchira: pa x86, uye kunyangwe muTCI, mirairo haina kurongeka zvachose, asi ini ndichaisa mukodhi buffer kwete mirairo zvachose, asi zvinongedzo kune Binaryen raibhurari zvimiro, saka ndichati: 4 bytes
  • Ndeipi mirairo yesarudzo iyo backend inogona kuburitsa - isu tinosanganisira zvese zvatinowana muBinaryen, rega inomhanyisa ipwanye zvimwe kuita zviri nyore pachazvo.
  • Ndeipi chiyero chehukuru hweTLB cache yakakumbirwa nebackend. Ichokwadi ndechokuti muQEMU zvinhu zvose zvakakomba: kunyange kune mabasa emubatsiri anoita mutoro / chitoro achifunga nezvemuenzi MMU (taizovepi pasina iyo ikozvino?), Vanochengetedza cache yavo yekushandura muchimiro chechimiro, the kugadzirisa kwayo kuri nyore kubatika zvakananga mumabhuroki ekutepfenyura. Mubvunzo ndewokuti, chii chinogadziriswa muchimiro ichi chinonyanya kugadziridzwa nediki uye nekukurumidza kutevedzana kwemirairo?
  • pano unogona kugadzirisa chinangwa cherejisita rimwe kana maviri akachengeterwa, gonesa kufonera TB kuburikidza nebasa uye nekusarudza kutsanangura akati wandei madiki. inline-mabasa akadai flush_icache_range (asi iyi haisi nyaya yedu)

faira tcg-target.inc.c, hongu, kazhinji yakakura muhukuru uye ine akati wandei anosungirwa mabasa:

  • kutanga, kusanganisira zvirambidzo pane izvo mirairo inogona kushanda pane iyo operands. Blatantly yakakopwa neni kubva kune imwe backend
  • basa rinotora imwe yemukati bytecode rairo
  • Iwe unogona zvakare kuisa ebetsero mabasa pano, uye iwe unogona zvakare kushandisa static mabasa kubva tcg/tcg.c

Ini pachangu, ndakasarudza zano rinotevera: mumashoko ekutanga echivharo cheshanduro chinotevera, ndakanyora pasi mapoinzi mana: mucherechedzo wekutanga (humwe kukosha munharaunda. 0xFFFFFFFF, iyo yakasarudza mamiriro azvino eTB), mamiriro, akagadzirwa module, uye mashiripiti nhamba yekubvisa. Pakutanga chiratidzo chakaiswa mukati 0xFFFFFFFF - nkupi n - nhamba diki yakanaka, uye pese payaiitwa kuburikidza nemuturikiri yaiwedzera ne 1. Payakasvika 0xFFFFFFFE, kuunganidzwa kwakaitika, module yakachengetwa mutafura yebasa, yakaunzwa mudiki "launcher", umo kuurayiwa kwakabva. tcg_qemu_tb_exec, uye module yakabviswa kubva kuQEMU ndangariro.

Kuti utsanangure zvinyorwa zvekare, "Crutch, yakawanda sei inopindirana mumutsindo uyu wemwoyo weproger ...". Zvisinei, ndangariro yakanga ichideuka pane imwe nzvimbo. Uyezve, yaive ndangariro inotungamirwa neQEMU! Ndakanga ndine kodhi iyo, pakunyora murairo unotevera (zvakanaka, kureva, pointer), yakabvisa uyo ane link yaive munzvimbo ino kare, asi izvi hazvina kubatsira. Chaizvoizvo, mune yakapusa kesi, QEMU inogovera ndangariro pakutanga uye inonyora iyo yakagadzirwa kodhi ipapo. Kana buffer yapera, kodhi inokandwa kunze uye inotevera inotanga kunyorwa panzvimbo yayo.

Mushure mekudzidza kodhi, ndakaona kuti hunyengeri nenhamba yemashiripiti yakandibvumira kuti ndirege kukundikana pakuparadzwa kwemurwi nekusunungura chimwe chinhu chakaipa pane uninitialized buffer pane yekutanga pass. Asi ndiani anonyorazve buffer kuti ipfuure basa rangu gare gare? Sekupa mazano evagadziri veEmscripten, pandakasangana nedambudziko, ndakaisa kodhi yakaguma kumashure kwechishandiso chekuzvarwa, ndakaisa Mozilla Record-Replay pairi ... Kazhinji, pakupedzisira ndakaona chinhu chiri nyore: kune rimwe nerimwe block, a struct TranslationBlock nerondedzero yayo. Fungidzira kuti papi…Ndizvozvo, pamberi pebhuroko imo mubhafa. Ndichiona izvi, ndakafunga kusiya kushandisa madondoro (zvimwewo), ndikangokanda nhamba yemashiripiti, ndikaendesa mazwi akasara ku. struct TranslationBlock, kugadzira runyoro rwakabatana runogona kufambiswa nekukurumidza kana cache yeshanduro yaiswa patsva, uye kusunungura ndangariro.

Mamwe madondoro anoramba aripo: semuenzaniso, akamisikidzwa anonongedzera mukodhi buffer - mamwe acho ari nyore BinaryenExpressionRef, ndiko kuti, ivo vanotarisa mataurirwo anofanirwa kuiswa mumutsara muyakagadzirwa basic block, chikamu ndiyo mamiriro ekuchinja pakati peBBs, chikamu ndiko kuenda. Zvakanaka, kune mabhuroki akagadzirirwa eRelooper anoda kubatanidzwa zvinoenderana nemamiriro ezvinhu. Kuti uzvisiyanise, fungidziro inoshandiswa kuti ese anoenderana neanosvika mana mabhayiti, saka unogona kushandisa zvakachengeteka mabheti maviri akakosha kune iyo label, iwe unongoda kurangarira kuibvisa kana zvichidikanwa. Nenzira, mavara akadaro atoshandiswa muQEMU kuratidza chikonzero chekubuda muTCG loop.

Kushandisa Binaryen

Mamodule muWebAssembly ane mabasa, rimwe nerimwe rine muviri, riri kutaura. Matauriro ndeasina kuita uye mabhinari mashandiro, zvivharo zvine rondedzero yemamwe mataurirwo, kudzora kuyerera, nezvimwe. Sezvandambotaura, kudzora kuyerera pano kwakarongwa chaizvo sematavi epamusoro-soro, zvishwe, basa rekufona, nezvimwe. Nharo kumabasa hadzina kupfuudzwa pachitunha, asi zvakajeka, sezvakangoita muJS. Kune zvakare akasiyana epasirese, asi ini handina kuashandisa, saka ini handikuudze nezvawo.

Mabasa anewo zvimiro zvepanzvimbo, zvakaverengerwa kubva ku zero, zverudzi: int32 / int64 / float / kaviri. Muchiitiko ichi, yekutanga n nzvimbo dzakasiyana-siyana ndeye nharo dzakapfuudzwa kune basa. Ndapota cherechedza kuti kunyange zvazvo zvinhu zvose zviri pano zvisiri zvachose zvakaderera-pamwero wekutonga kuyerera, nhamba dzinoverengeka hadzisi kutakura "yakasainwa / isina kusaina" hunhu: maitiro anoita nhamba zvinoenderana nekodhi yekushanda.

Kazhinji kutaura, Binaryen inopa nyore C-API: iwe unogadzira module, maari gadzira mataurirwo - unary, binary, blocks kubva kune mamwe mataurirwo, control flow, nezvimwe. Wobva wagadzira basa rine chiratidziro semuviri waro. Kana iwe, seni, uine yakaderera-level shanduko girafu, iyo relooper chikamu ichakubatsira iwe. Sekunzwisisa kwandinoita, zvinokwanisika kushandisa yakakwira-level kutonga kwekuyerera kuyerera muvharovha, chero isingapfuuri miganhu yeblock - ndiko kuti, zvinokwanisika kuita yemukati nekukurumidza nzira / inononoka. nzira yekubatanidza mukati meiyo yakavakirwa-mukati TLB cache yekugadzirisa kodhi, asi kwete kukanganisa iyo "yekunze" yekudzora kuyerera. Paunosunungura relooper, zvidhinha zvayo zvinosunungurwa; paunosunungura module, mazwi, mabasa, nezvimwe zvakagoverwa kwairi zvinopera. arena.

Nekudaro, kana iwe uchida kududzira kodhi pane nhunzi pasina kusikwa kusiri madikanwa uye kudzima muenzaniso wemuturikiri, zvingave zvine musoro kuisa pfungwa iyi muC ++ faira, uye kubva ipapo gadzirisa zvakananga C++ API yeraibhurari, uchipfuura wakagadzirira- yakagadzirwa wrappers.

Saka kugadzira kodhi yaunoda

// Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ (ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΌ)
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);

... kana ndakanganwa chero chinhu, urombo, uku kungomiririra chiyero, uye ruzivo rwuri muzvinyorwa.

Uye zvino crack-fex-pex inotanga, chimwe chinhu chakadai:

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

Kuti neimwe nzira ibatanidze nyika dzeQEMU neJS uye panguva imwe chete kuwana mabasa akaunganidzwa nekukurumidza, hurongwa hwakagadzirwa (tafura yemabasa ekupinza mukati mekutanga), uye mabasa akagadzirwa akaiswa ipapo. Kukurumidza kuverenga iyo index, indekisi ye zero izwi rekushandura block yakatanga kushandiswa sezvairi, asi ipapo indekisi yakaverengerwa uchishandisa iyi formula yakatanga kungokwana mumunda mu. struct TranslationBlock.

Nenzira, demo (parizvino ane rezinesi rakasviba) inoshanda chete muFirefox. Vagadziri veChrome vaive neimwe nzira haana kugadzirira kune chokwadi chekuti mumwe munhu angada kugadzira zvinopfuura chiuru zviitiko zveWebAssembly modules, saka vakangogovera gigabyte yenzvimbo yekero yega yega ...

Ndizvo zvose ikozvino. Zvichida pachava nechimwe chinyorwa kana chero munhu anofarira. Zvichireva, pane zvakasara chete ita kuti zvigadziriso zvishande. Zvinogona zvakare kuve zvine musoro kuita kuti kuunganidzwa kweWebAssembly modules kuenderane, setsika munyika yeJS, sezvo kuchine muturikiri anogona kuita zvese izvi kusvika iyo yemuno module yagadzirira.

Pakupedzisira chirahwe: iwe wakanyora bhinari pane 32-bit architecture, asi kodhi, kuburikidza nekushanda kwendangariro, inokwira kubva kuBinaryen, pane imwe nzvimbo pane stack, kana kumwewo kumwe kumusoro 2 GB ye32-bit kero nzvimbo. Dambudziko nderekuti kubva pakuona kwaBinaryen uku kuri kuwana yakakura kwazvo kero inoguma. Nzira yekutenderera sei iyi?

Munzira admin

Handina kuzopedzisa kuyedza izvi, asi pfungwa yangu yekutanga yaive "Ko kana ndikaisa 32-bit Linux?" Ipapo chikamu chepamusoro chekero nzvimbo ichagarwa ne kernel. Mubvunzo chete ndewekuti ingani ichagarwa: 1 kana 2 Gb.

Nenzira yemugadziri (sarudzo yevashandi)

Ngatifuridzei bubble kumusoro kwenzvimbo yekero. Ini pachangu handisi kunzwisisa kuti sei inoshanda - ipapo kare panofanira kunge paine murwi. Asi "tiri varapi: zvese zvinotiitira, asi hapana anoziva kuti nei ..."

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

... ichokwadi kuti haienderane naValgrind, asi, nerombo rakanaka, Valgrind pachayo inosundira munhu wese kunze uko :)

Pamwe mumwe munhu achapa tsananguro iri nani yekuti kodhi iyi yangu inoshanda sei...

Source: www.habr.com

Voeg