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
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
Ipapo pakanga pane zvimwe
- 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
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:
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.
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 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
ΠΈ 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 akadaiflush_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 - n
kupi 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
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,
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