QEMU.js: tsopano kwambiri komanso ndi WASM

Nthawi ina ndinaganiza zosangalatsa kutsimikizira kusinthika kwa ndondomekoyi ndikuphunzira kupanga JavaScript (molondola, Asm.js) kuchokera pamakina. QEMU idasankhidwa kuti ayesedwe, ndipo patapita nthawi nkhani inalembedwa pa Habr. M'mawu omwe ndidalangizidwa kuti ndikonzenso ntchitoyi ku WebAssembly, komanso kusiya ndekha pafupifupi kumaliza Ine mwanjira ina sindinkafuna pulojekitiyi ... Ntchitoyo inali kuchitika, koma pang'onopang'ono, ndipo tsopano, posachedwapa m'nkhaniyo inawonekera. ndemanga pamutu wakuti β€œNdiye kuti zonsezi zinatha bwanji?” Poyankha yankho langa latsatanetsatane, ndinamva "Izi zikumveka ngati nkhani." Chabwino, ngati mungathe, padzakhala nkhani. Mwina wina adzapeza zothandiza. Kuchokera pamenepo owerenga aphunzira zambiri za mapangidwe a QEMU code generation backends, komanso momwe angalembere compiler ya Just-in-Time pa intaneti.

ntchito

Popeza ndinali nditaphunzira kale "mwanjira ina" doko la QEMU ku JavaScript, nthawi ino idasankhidwa kuchita mwanzeru ndikusabwereza zolakwa zakale.

Cholakwika nambala wani: nthambi yochokera ku mfundo

Kulakwitsa kwanga koyamba kunali kufooketsa mtundu wanga kuchokera kumtundu wakumtunda wa 2.4.1. Ndiye izo zinkawoneka kwa ine lingaliro labwino: ngati mfundo yomasulidwa ilipo, ndiye kuti imakhala yokhazikika kuposa yosavuta 2.4, ndipo makamaka nthambi. master. Ndipo popeza ndidakonza zoonjezera kuchuluka kwa nsikidzi zanga, sindimafunikira za wina aliyense. Mwina ndi mmene zinakhalira. Koma apa pali chinthu: QEMU sichiyima, ndipo nthawi ina adalengeza kukhathamiritsa kwa code yopangidwa ndi peresenti ya 10. "Eya, tsopano ndikuundana," ndinaganiza ndikusweka. Apa tifunika kusokoneza: chifukwa cha mtundu umodzi wa QEMU.js komanso kuti QEMU yoyambirira sikutanthauza kusakhalapo kwa ulusi wambiri (ndiko kuti, kutha kugwiritsa ntchito nthawi imodzi njira zingapo zosagwirizana, ndi osati "kugwiritsa ntchito ma maso onse") ndikofunikira kwa izo, ntchito zazikulu za ulusi zomwe ndimayenera "kuzimitsa" kuti ndizitha kuyimba kuchokera kunja. Izi zinayambitsa mavuto achilengedwe panthawi yophatikizana. Komabe, mfundo yakuti zina zosintha kuchokera ku nthambi master, yomwe ndidayesa kuphatikiza nambala yanga, idasankhidwanso chitumbuwa pakumasulidwa (ndipo chifukwa chake munthambi yanga) mwina sizikanawonjezera mwayi.

Nthawi zambiri, ndidaganiza kuti ndizomveka kutaya chithunzicho, kugawaniza magawo ndikupanga mtundu watsopano kuchokera poyambira kutengera china chatsopano komanso chatsopano. master.

Cholakwika chachiwiri: Njira ya TLP

M'malo mwake, uku sikulakwa, makamaka, ndi gawo lopanga pulojekiti mumikhalidwe yosamvetsetseka ya "kuti ndi momwe tingasunthire?" komanso "kodi tidzafika kumeneko?" M'mikhalidwe imeneyi mapulogalamu ovuta inali njira yolondola, koma, mwachibadwa, sindinkafuna kubwereza mosafunikira. Nthawi ino ndimafuna kuti ndichite mwanzeru: ma atomiki achita, kusintha kwa code (osati "kumanga zilembo mwachisawawa mpaka atapanga (ndi machenjezo)", monga Linus Torvalds adanenapo za wina, malinga ndi Wikiquote), ndi zina zotero.

Cholakwika chachitatu: kulowa m'madzi osadziwa ford

Sindinathetseretu izi, koma tsopano ndaganiza kuti ndisatsatire njira yokanira pang'ono, ndikuchita "monga munthu wamkulu," kutanthauza, lembani TCG yanga yakumbuyo kuyambira poyambira, kuti ndisatero. kunena pambuyo pake, "Inde, izi ndi zoona, pang'onopang'ono, koma sindingathe kulamulira chirichonse - ndimomwe TCI imalembedwera ..." Komanso, izi poyamba zinkawoneka ngati yankho lodziwikiratu, kuyambira Ndimapanga binary code. Monga amati, β€œGhent anasonkhanaΡƒ, koma osati iyo ": codeyo ndi, ndithudi, ya binary, koma kulamulira sikungangosamutsidwira kwa izo - ziyenera kukankhidwa momveka bwino mu msakatuli kuti apangidwe, zomwe zimapangitsa chinthu china kuchokera ku dziko la JS, chomwe chikufunikabe. kupulumutsidwa kwinakwake. Komabe, pamapangidwe anthawi zonse a RISC, momwe ndikumvera, momwe zinthu ziliri ndikufunika kukonzanso kachidindo kachidziwitso ka code yosinthidwanso - ngati sizomwe timafunikira, ndiye, mulimonse, zili pafupi. Kuonjezera apo, kuchokera pakuyesera kwanga komaliza, ndinaphunzira kuti kulamulira sikukuwoneka kuti kumasamutsidwa pakati pa chipika chomasulira, kotero sitifunikira bytecode kutanthauziridwa kuchokera kumtundu uliwonse, ndipo tikhoza kungopanga kuchokera ku ntchito pa TB. .

Iwo anabwera nakankha

Ngakhale ndidayambanso kulembanso kachidindo mu Julayi, kumenya kwamatsenga kudakwera mosadziwika: nthawi zambiri makalata ochokera ku GitHub amafika ngati zidziwitso za mayankho ku Zopempha ndi Kokani, koma apa, mwadzidzidzi tchulani mu ulusi Binaryen ngati qemu backend m'mawu ake, "Iye anachita chinachake chonga icho, mwinamwake iye anena chinachake." Tinkakambirana za kugwiritsa ntchito laibulale yokhudzana ndi Emscripten Binaryen kupanga WASM JIT. Chabwino, ndinanena kuti muli ndi chilolezo cha Apache 2.0 kumeneko, ndipo QEMU yonse imagawidwa pansi pa GPLv2, ndipo sizigwirizana kwambiri. Mwadzidzidzi kunapezeka kuti chilolezo chingakhale konza mwanjira ina (Sindikudziwa: mwina kusintha, mwina awiri layisensi, mwina chinachake ...). Izi, ndithudi, zinandisangalatsa, chifukwa panthawiyi ndinali nditayang'anitsitsa mtundu wa binary WebAssembly, ndipo ndinali mwanjira ina wachisoni komanso wosamvetsetseka. Panalinso laibulale yomwe ingameze midadada yoyambira ndi graph yosinthira, kupanga bytecode, komanso kuiyendetsa mwa womasulirayo, ngati kuli kofunikira.

Ndiye panalinso zina kalata pamndandanda wamakalata a QEMU, koma izi ndi zambiri za funso, "Ndani akuzifunabe?" Ndipo izo ziri mwadzidzidzi, kunapezeka kuti kunali kofunikira. Pang'ono ndi pang'ono, mutha kuphatikizira mwayi wotsatirawu, ngati ukugwira ntchito mwachangu kapena mocheperako:

  • kuyambitsa china chake chamaphunziro popanda kukhazikitsa konse
  • virtualization pa iOS, pomwe, malinga ndi mphekesera, ntchito yokhayo yomwe ili ndi ufulu wopanga ma code pa ntchentche ndi injini ya JS (kodi izi ndi zoona?)
  • chiwonetsero cha mini-OS - single-floppy, yomangidwa mkati, mitundu yonse ya firmware, etc ...

Browser Runtime Features

Monga ndanenera kale, QEMU imamangiriridwa ku multithreading, koma osatsegula alibe. Chabwino, ndiye, ayi ... Poyamba sizinalipo konse, ndiye WebWorkers adawonekera - monga momwe ndikumvera, izi ndikuwerengera zambiri kutengera uthenga wodutsa. popanda zosinthika zogawana. Mwachilengedwe, izi zimabweretsa zovuta zazikulu mukayika ma code omwe alipo kutengera mtundu wa kukumbukira komwe mudagawana. Kenako, mokakamizidwa ndi anthu, idakhazikitsidwanso pansi pa dzina SharedArrayBuffers. Izo zinayambitsidwa pang'onopang'ono, iwo anakondwerera kukhazikitsidwa kwake m'masakatuli osiyanasiyana, kenaka amakondwerera Chaka Chatsopano, ndiyeno Meltdown ... Pambuyo pake adafika pamaganizo kuti nthawi yochuluka kapena yovuta, koma mothandizidwa ndi kukumbukira komweko komanso kukumbukira. ulusi ukuwonjezera kauntala, zonse ndi zofanana idzachita bwino kwambiri. Chifukwa chake tidaletsa ma multithreading ndi kukumbukira kogawana. Zikuwoneka kuti pambuyo pake adazibwezeretsanso, koma, monga momwe zinawonekera kuchokera kukuyesera koyamba, pali moyo wopanda izo, ndipo ngati ndi choncho, tidzayesetsa kuchita popanda kudalira multithreading.

Chinthu chachiwiri ndikusatheka kwa kusintha kwapang'onopang'ono ndi stack: simungathe kungotenga, kusunga zomwe zikuchitika panopa ndikusintha kwatsopano ndi stack yatsopano. Kuyimbira foni kumayendetsedwa ndi makina a JS. Zingatanthauze, vuto ndi chiyani, popeza tidaganizabe zowongolera zomwe zidachitika kale pamanja? Chowonadi ndi chakuti block I/O mu QEMU imayendetsedwa kudzera m'ma coroutines, ndipo apa ndipamene kusintha kwapang'onopang'ono kungathandizire. Mwamwayi, Emscipten ili kale ndi makina opangira ma asynchronous, ngakhale awiri: Asyncify ΠΈ Emterpreter. Yoyamba imagwira ntchito movutikira kwambiri pamakina opangidwa ndi JavaScript ndipo sakuthandizidwanso. Yachiwiri ndi "njira yolondola" yomwe ilipo ndipo imagwira ntchito kudzera mum'badwo wa bytecode kwa womasulira wamba. Zimagwira, ndithudi, pang'onopang'ono, koma sizimasokoneza code. Zowona, kuthandizira ma coroutines pamakinawa kunayenera kuperekedwa mwaokha (panali kale ma coroutines olembedwa kwa Asyncify ndipo panali kukhazikitsidwa kwa pafupifupi API yofanana ya Emterpreter, mumangofunika kuwalumikiza).

Pakalipano, sindinathe kugawanitsa kachidindoyo kukhala imodzi yolembedwa mu WASM ndikutanthauziridwa pogwiritsa ntchito Emterpreter, kotero kuti zipangizo zotchinga sizikugwira ntchito (onani mndandanda wotsatira, monga akunena ...). Ndiko kuti, pamapeto pake muyenera kupeza chinthu chonga chodabwitsa ichi:

  • kutanthauzira kwa block I/O. Chabwino, kodi mumayembekezera kuti NVMe yotsanziridwa ndi machitidwe achilengedwe? πŸ™‚
  • khodi yayikulu ya QEMU yopangidwa mokhazikika (omasulira, zida zina zotsanzira, ndi zina)
  • adaphatikiza ma code alendo ku WASM

Zithunzi za QEMU

Monga momwe mumaganizira kale, nambala yotsatsira mamangidwe a alendo ndi kachidindo kakupanga malangizo pamakina olandila amasiyanitsidwa ku QEMU. M'malo mwake, ndizovuta kwambiri:

  • pali zomanga alendo
  • pali ma accelerator, yomwe ndi, KVM ya hardware virtualization pa Linux (kwa alendo ndi ochereza machitidwe ogwirizana wina ndi mzake), TCG kwa JIT code m'badwo kulikonse. Kuyambira ndi QEMU 2.9, chithandizo cha HAXM hardware virtualization standard pa Windows chinawonekera (mfundo)
  • ngati TCG ikugwiritsidwa ntchito osati hardware virtualization, ndiye ali osiyana code m'badwo thandizo kwa aliyense khamu kamangidwe, komanso kwa womasulira chilengedwe.
  • ... ndipo mozungulira zonsezi - zotumphukira zotsatiridwa, mawonekedwe a ogwiritsa ntchito, kusamuka, kujambulanso, ndi zina zambiri.

Mwa njira, kodi mumadziwa: QEMU ikhoza kutsanzira osati kompyuta yonse, komanso purosesa ya njira yosiyana yogwiritsira ntchito kernel, yomwe imagwiritsidwa ntchito, mwachitsanzo, ndi AFL fuzzer pazida za binary. Mwina wina angafune kuwonetsa momwe QEMU imagwirira ntchito ku JS? πŸ˜‰

Monga mapulogalamu ambiri aulere omwe akhalapo kwanthawi yayitali, QEMU imapangidwa kudzera pakuitana configure ΠΈ make. Tiyerekeze kuti mwasankha kuwonjezera china: kumbuyo kwa TCG, kukhazikitsa ulusi, china. Osathamangira kukhala osangalala/oopsya (pansi pansi ngati kuli koyenera) poyembekezera kulankhulana ndi Autoconf - kwenikweni, configure Ma QEMU akuwoneka kuti adalemba okha ndipo samapangidwa kuchokera ku chilichonse.

MaSamba

Ndiye chinthu ichi chotchedwa WebAssembly (aka WASM) ndi chiyani? Uku ndikulowa m'malo mwa Asm.js, sikunamiziranso kukhala JavaScript khodi yolondola. M'malo mwake, ndizochita zachiphamaso komanso zokongoletsedwa, ndipo ngakhale kungolemba chiwerengero chonsecho sikophweka: chifukwa chophatikizika, chimasungidwa mumtundu. Mtengo wa LEB128.

Mwinamwake mudamvapo za relooping aligorivimu ya Asm.js - uku ndikubwezeretsanso kwa malangizo owongolera "okwera" (ndiko kuti, ngati-ndipo-mwina, malupu, ndi zina zotero), zomwe injini za JS zimapangidwira, kuchokera. LLVM IR yotsika, pafupi ndi makina opangira makina opangidwa ndi purosesa. Mwachilengedwe, chiwonetsero chapakati cha QEMU chili pafupi ndi chachiwiri. Zingawoneke kuti apa ndi, bytecode, kutha kwa chizunzo...

Ndipo ichi ndi chifukwa china chomwe Binaryen ndiwothandiza: mwachibadwa amatha kuvomereza midadada yapamwamba pafupi ndi zomwe zingasungidwe mu WASM. Koma imathanso kutulutsa kachidindo kuchokera pa graph ya midadada yoyambira ndikusintha pakati pawo. Chabwino, ndanena kale kuti imabisa mawonekedwe a WebAssembly kuseri kwa C/C ++ API yabwino.

TCG (Tiny Code Generator)

GTC anali poyambirira backend kwa compiler C. Kenaka, mwachiwonekere, sichikanatha kulimbana ndi mpikisano ndi GCC, koma pamapeto pake idapeza malo ake ku QEMU monga njira yopangira ma code pa nsanja yolandira alendo. Palinso TCG backend yomwe imapanga bytecode yosadziwika, yomwe imachitidwa nthawi yomweyo ndi womasulira, koma ndinaganiza zopewa kugwiritsa ntchito nthawi ino. Komabe, mfundo yakuti mu QEMU ndizotheka kale kuti muthe kusintha kwa TB yopangidwa kudzera mu ntchitoyi. tcg_qemu_tb_exec, zinakhala zothandiza kwambiri kwa ine.

Kuti muwonjezere TCG yatsopano ku QEMU, muyenera kupanga subdirectory tcg/<имя Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹> (pamenepa, tcg/binaryen), ndipo ili ndi mafayilo awiri: tcg-target.h ΠΈ tcg-target.inc.c ΠΈ kulembetsa zonse ndi za configure. Mutha kuyika mafayilo ena pamenepo, koma, monga momwe mungaganizire kuchokera ku mayina a awiriwa, onsewo adzaphatikizidwa kwinakwake: imodzi ngati fayilo yamutu wanthawi zonse (ikuphatikizidwa tcg/tcg.h, ndipo imodziyo ili kale m'mafayilo ena mumakanema tcg, accel osati kokha), chinacho - kokha ngati kachidutswa kakang'ono mkati tcg/tcg.c, koma ili ndi mwayi wogwiritsa ntchito ma static.

Poganiza kuti ndithera nthawi yochuluka pakufufuza mwatsatanetsatane momwe zimagwirira ntchito, ndinangotengera "mafupa" a mafayilo awiriwa kuchokera ku kukhazikitsa kwina kwa backend, ndikuwonetsa izi pamutu wa layisensi.

file tcg-target.h imakhala ndi zokonda mu mawonekedwe #define-s:

  • Ma registry angati komanso m'lifupi mwake pakupanga zomwe tikufuna (tili ndi ochuluka momwe timafunira, ochuluka momwe timafunira - funso ndilokhudza zomwe zidzapangidwe mu code yogwira mtima kwambiri ndi osatsegula pa "zomangamanga zonse" ...)
  • kuyanjanitsa kwa malangizo omvera: pa x86, ndipo ngakhale mu TCI, malangizo sali ogwirizana konse, koma ndikuyika mu code buffer osati malangizo konse, koma zolozera ku Binaryen library library, kotero ine ndinena: 4 mabayiti
  • ndi malangizo ati omwe angapangidwe ndi backend - timaphatikiza chilichonse chomwe timapeza ku Binaryen, lolani chowonjezeracho chiphwanye zina zonse kukhala zosavuta zokha.
  • Kodi ndi kukula kwake kotani kwa cache ya TLB yofunsidwa ndi backend. Chowonadi ndi chakuti mu QEMU chirichonse chiri chovuta: ngakhale pali ntchito zothandizira zomwe zimagwira katundu / sitolo poganizira za mlendo MMU (tikanakhala kuti popanda izo tsopano?), Amasunga cache yawo yomasulira mu mawonekedwe a dongosolo, the processing yake ndi yabwino kuyika mwachindunji mu block blocks. Funso ndilakuti, ndi njira ziti zomwe zili mumpangidwewu zomwe zimakonzedwa bwino ndi malamulo ochepa komanso ofulumira?
  • apa mutha kusinthanso cholinga cha kaundula mmodzi kapena awiri osungidwa, yambitsani kuyimbira TB kudzera muntchito ndikulongosola pang'ono pang'ono. inline-ntchito ngati flush_icache_range (koma iyi si nkhani yathu)

file tcg-target.inc.c, ndithudi, nthawi zambiri imakhala yokulirapo ndipo imakhala ndi ntchito zingapo zofunika:

  • kuyambitsa, kuphatikizapo zoletsa zomwe malangizo angagwire ntchito zomwe zimagwira ntchito. Ndinakopedwa mwachisawawa kuchokera ku backend ina
  • ntchito yomwe imatenga malangizo amkati a bytecode
  • Mutha kuyikanso ntchito zothandizira apa, ndipo mutha kugwiritsanso ntchito ma static function kuchokera tcg/tcg.c

Kwa ine ndekha, ndidasankha njira iyi: m'mawu oyamba a chipika chomasulira chotsatira, ndidalemba zolozera zinayi: chizindikiro choyambira (mtengo wina wapafupi. 0xFFFFFFFF, zomwe zinatsimikizira momwe TB ilipo tsopano), nkhani, gawo lopangidwa, ndi nambala yamatsenga kuti athetse vutoli. Poyamba chizindikirocho chinayikidwa mkati 0xFFFFFFFF - nkumene n - nambala yaing'ono yabwino, ndipo nthawi iliyonse yomwe idaphedwa kudzera mwa womasulira idawonjezeka ndi 1. Ikafika 0xFFFFFFFE, kuphatikiza kunachitika, gawoli linasungidwa mu tebulo la ntchito, kutumizidwa mu "launcher" yaying'ono, momwe kuphedwa kunachokera. tcg_qemu_tb_exec, ndipo gawolo linachotsedwa pamtima wa QEMU.

Kufotokozera mwachidule zachikale, "Crutch, ndi zochuluka bwanji zomwe zimagwirizana ndi phokoso ili kwa mtima wa proger ...". Komabe, kukumbukira kunali kutayikira kwinakwake. Kuphatikiza apo, inali kukumbukira komwe kumayendetsedwa ndi QEMU! Ndinali ndi code yomwe, polemba malangizo otsatirawa (chabwino, ndiko kuti, pointer), inachotsa yemwe ulalo wake unali pamalo ano kale, koma izi sizinathandize. Kwenikweni, munjira yosavuta, QEMU imagawa kukumbukira poyambira ndikulemba nambala yomwe idapangidwa pamenepo. Buffer ikatha, codeyo imatayidwa ndipo yotsatira imayamba kulembedwa m'malo mwake.

Nditaphunzira kachidindo, ndinazindikira kuti chinyengo chokhala ndi nambala yamatsenga chinandilola kuti ndisalephere pa chiwonongeko cha mulu mwa kumasula chinachake cholakwika pa buffer yosadziwika pa pass yoyamba. Koma ndani amalembanso buffer kuti idutse ntchito yanga pambuyo pake? Monga momwe olemba Emscripten amalangizira, pamene ndinakumana ndi vuto, ndinawonetsa kachidindo kameneka ndikubwerera ku pulogalamu yachibadwidwe, ndikuyika Mozilla Record-Replay pa izo ... a struct TranslationBlock ndi kufotokoza kwake. Tangoganizani pamene^Ndiko kulondola, pasanafike mdadada momwemo pomwe musungidwiramo. Nditazindikira izi, ndidaganiza zosiya kugwiritsa ntchito ndodo (ena), ndikungotaya nambala yamatsenga, ndikusamutsira mawu otsalawo. struct TranslationBlock, kupanga mndandanda wolumikizidwa womwe ungadulidwe mwachangu pomwe posungira yomasulira yakhazikitsidwanso, ndikumasula kukumbukira.

Ndodo zina zimakhalabe: mwachitsanzo, zolozera zolembedwa mu code buffer - zina ndizosavuta BinaryenExpressionRef, ndiye kuti, amayang'ana mawu omwe amayenera kuyikidwa molunjika mu block yoyambira, gawo ndi momwe kusintha pakati pa BBs, gawo ndi komwe mungapite. Chabwino, pali midadada yokonzedwa kale ya Relooper yomwe imayenera kulumikizidwa molingana ndi mikhalidwe. Kuti muwasiyanitse, lingaliro limagwiritsidwa ntchito kuti onse amagwirizana ndi ma byte osachepera anayi, kotero mutha kugwiritsa ntchito mosamala ma bits awiri ofunikira pa chizindikirocho, muyenera kukumbukira kuti muchotse ngati kuli kofunikira. Mwa njira, zilembo zotere zimagwiritsidwa ntchito kale ku QEMU kusonyeza chifukwa chotuluka mu TCG loop.

Kugwiritsa ntchito Binaryen

Ma modules mu WebAssembly ali ndi ntchito, iliyonse yomwe ili ndi thupi, lomwe ndi mawu. Mawu ndi machitidwe osazolowereka komanso a binary, midadada yokhala ndi mindandanda ya mawu ena, kuwongolera kuyenda, ndi zina. Monga ndanenera kale, kuyenda kowongolera pano kumakonzedwa ndendende ngati nthambi zapamwamba, malupu, kuyimba ntchito, ndi zina. Zotsutsana za ntchito sizimaperekedwa pamtengo, koma momveka bwino, monga mu JS. Palinso zosintha zapadziko lonse lapansi, koma sindinazigwiritse ntchito, kotero sindikuwuzani za izo.

Ntchito zilinso ndi zosintha zam'deralo, zowerengedwa kuchokera ku ziro, zamtundu: int32 / int64 / float / double. Pachifukwa ichi, zosintha zoyamba za n m'deralo ndizo mfundo zomwe zimaperekedwa ku ntchitoyo. Chonde dziwani kuti ngakhale chilichonse pano sichili chotsika kwambiri potsata kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka zachumabungwajangwajangwajangwajajajaja kwojangali zinthunganangananganabanangana payeka pabale payeka payeka payu pa intaneti ku Kaya wotsatira kukhalebe ndi "zosayinidwa / zosasainidwa": momwe chiwerengerocho chimakhalira chimadalira nambala ya opareshoni.

Nthawi zambiri, Binaryen amapereka yosavuta C-API: mumapanga module, mwa iye pangani mawu - unary, binary, blocks from other expressions, control flow, etc. Ndiye mumapanga ntchito ndi mawu monga thupi lake. Ngati inu, monga ine, muli ndi graph yotsika yosinthira, gawo la relooper lidzakuthandizani. Monga momwe ndikumvera, ndizotheka kugwiritsa ntchito kuwongolera kwapamwamba kwa kayendedwe ka kuphedwa mu chipika, bola ngati sichidutsa malire a chipika - ndiko kuti, n'zotheka kupanga njira yofulumira mkati / pang'onopang'ono. njira yolumikizira mkati mwa kachidindo kachipangizo ka TLB kamene kamamangidwa, koma kuti musasokoneze kayendedwe ka "kunja". Mukamasula relooper, midadada yake imamasulidwa; mukamasula gawo, mawu, ntchito, ndi zina zomwe zaperekedwa kwa izo zimasowa. bwalo.

Komabe, ngati mukufuna kutanthauzira kachidindo pa ntchentche popanda kulenga kosafunikira ndikuchotsa womasulira, zingakhale zomveka kuyika malingalirowa mu fayilo ya C ++, ndipo kuchokera pamenepo yendetsani mwachindunji C ++ API yonse ya laibulale, kudutsa okonzeka- zopangidwa wrappers.

Ndiye kuti mupange code yomwe mukufuna

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

... ngati ndinayiwala kalikonse, pepani, uku ndikungoyimira sikelo, ndipo tsatanetsatane ali muzolemba.

Ndipo tsopano crack-fex-pex akuyamba, motere:

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

Pofuna kugwirizanitsa maiko a QEMU ndi JS ndipo panthawi imodzimodziyo kupeza ntchito zomwe zapangidwa mwamsanga, gulu linapangidwa (tebulo la ntchito zomwe zimalowa muzoyambitsa), ndipo ntchito zomwe zinapangidwa zinayikidwa pamenepo. Kuti muwerenge mwachangu index, index ya zero mawu block block idagwiritsidwa ntchito ngati izo, koma ndiye index yowerengedwa pogwiritsa ntchito fomulayi idayamba kukwanira m'mundamo. struct TranslationBlock.

Mwa njira, chidziwitso (pakadali ndi licence yakuda) imagwira ntchito bwino mu Firefox. Opanga Chrome anali mwanjira ina osakonzeka ku mfundo yoti wina angafune kupanga ma module opitilira chikwi a WebAssembly, kotero adangopereka gigabyte ya malo adilesi kwa aliyense ...

Ndizo zonse pakadali pano. Mwina padzakhala nkhani ina ngati wina ali ndi chidwi. Ndiko kuti, patsala osachepera kokha gwiritsani ntchito zida za block. Zingakhalenso zomveka kupanga ma modules a WebAssembly kukhala asynchronous, monga momwe zimakhalira m'dziko la JS, popeza palinso womasulira yemwe angakhoze kuchita zonsezi mpaka gawo lachibadwidwe litakonzeka.

Pomaliza mwambi: mwapanga binary pamapangidwe a 32-bit, koma kachidindo, pogwiritsa ntchito kukumbukira, amakwera kuchokera ku Binaryen, kwinakwake pa stack, kapena kwinakwake kumtunda kwa 2 GB kwa malo adilesi ya 32-bit. Vuto ndilakuti kuchokera kumalingaliro a Binaryen izi ndikufikira adilesi yayikulu kwambiri. Kodi mungazungulire bwanji izi?

Mu njira ya admin

Sindinathe kuyesa izi, koma lingaliro langa loyamba linali "Bwanji ndikayika 32-bit Linux?" Ndiye kumtunda kwa danga la adiresi kudzakhala ndi kernel. Funso lokhalo ndiloti mudzakhala ndi ndalama zingati: 1 kapena 2 Gb.

Munjira ya mapulogalamu (njira ya akatswiri)

Tiyeni tiwuze thovu pamwamba pa malo adilesi. Ine ndekha sindikumvetsa chifukwa chake zimagwira ntchito - pamenepo kale payenera kukhala palimodzi. Koma "ndife akatswiri: chirichonse chimagwira ntchito kwa ife, koma palibe amene akudziwa chifukwa chake ..."

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

... ndizowona kuti sizogwirizana ndi Valgrind, koma, mwamwayi, Valgrind mwiniwake amakankhira bwino aliyense kuchokera pamenepo :)

Mwina wina afotokoze bwino momwe code yanga imagwirira ntchito ...

Source: www.habr.com

Kuwonjezera ndemanga