QEMU.js: joale e tebile ebile e na le WASM

Ka nako e 'ngoe ke ile ka etsa qeto ea ho ithabisa paka ho sokoloha ha ts'ebetso 'me u ithute ho hlahisa JavaScript (ka nepo, Asm.js) ho tsoa ho khoutu ea mochini. QEMU e ile ea khethoa bakeng sa teko, 'me nakoana hamorao ho ile ha ngoloa sengoloa se buang ka Habr. Litlhalosong ke ile ka eletsoa ho etsa morero hape ho WebAssembly, esita le ho tlohela batla fedile Ka tsela e itseng ke ne ke sa batle morero ... Mosebetsi o ne o ntse o tsoela pele, empa butle-butle, 'me hona joale, haufinyane sehloohong seo se ile sa hlaha. tlhaloso sehloohong se reng “Joale lintho tsohle li ile tsa fela joang?” Ha ke araba karabo ea ka e qaqileng, ke ile ka utloa "Sena se utloahala eka ke sengoloa." Hantle, haeba u ka khona, ho tla ba le sehlooho. Mohlomong motho e mong o tla e fumana e le molemo. Ho eona 'mali o tla ithuta lintlha tse ling mabapi le moralo oa li-backend tsa tlhahiso ea khoutu ea QEMU, hammoho le mokhoa oa ho ngola compiler ea Just-in-Time bakeng sa ts'ebeliso ea webo.

mesebetsi

Kaha ke ne ke se ke ithutile ho "ka tsela e itseng" ho kenya QEMU ho JavaScript, lekhetlong lena ho ile ha etsoa qeto ea ho e etsa ka bohlale le ho se phete liphoso tsa khale.

Phoso ea nomoro ea pele: lekala le tsoang ho ntlha

Phoso ea ka ea pele e ne e le ho fereko phetolelo ea ka ho tloha ho 2.4.1. Joale ho ne ho bonahala e le khopolo e ntle ho 'na: haeba ho lokolloa ha ntlha ho teng, mohlomong ho tsitsitse ho feta 2.4 e bonolo, le ho feta lekala. master. 'Me kaha ke ne ke rerile ho eketsa palo e lekaneng ea likokoana-hloko tsa ka, ke ne ke sa hloke motho e mong ho hang. Ho ka etsahala hore ebe ho bile joalo. Empa taba ke ena: QEMU ha e eme, 'me ka nako e' ngoe ba bile ba phatlalatsa ho ntlafatsa khoutu e hlahisitsoeng ka liphesente tse 10. "E, joale ke tla hoama," ke ile ka nahana 'me ka robeha. Mona re hloka ho kheloha: ka lebaka la sebopeho se le seng sa QEMU.js le taba ea hore QEMU ea pele ha e bolele ho ba sieo ha mefuta e mengata (ke hore, bokhoni ba ho sebetsa ka nako e le 'ngoe litsela tse ngata tse sa amaneng tsa khoutu, le eseng feela "sebelisa lithollo tsohle") ke ea bohlokoa bakeng sa eona, mesebetsi ea mantlha ea likhoele ke ile ka tlameha ho "e tima" hore ke tsebe ho letsetsa kantle. Sena se ile sa baka mathata a mang a tlhaho nakong ea ho kopanya. Leha ho le joalo, 'nete ea hore tse ling tsa liphetoho tse tsoang lekaleng master, eo ke lekileng ho kopanya khoutu ea ka ka eona, le tsona li ile tsa khethoa li-cherry ho tokollo ea ntlha (ka hona lekaleng la ka) le tsona mohlomong li ne li ke ke tsa e-ba bonolo.

Ka kakaretso, ke ile ka etsa qeto ea hore ho ntse ho utloahala ho lahla mohlala, ho o arola bakeng sa likarolo le ho haha ​​​​phetolelo e ncha ho tloha qalong ho itšetlehile ka ntho e ncha le hona joale ho tloha qalong. master.

Phoso ea bobeli: mokhoa oa TLP

Ha e le hantle, sena ha se phoso, ka kakaretso, ke tšobotsi feela ea ho theha morero maemong a ho se utloisisane ka ho feletseng "hokae le ho falla joang?" 'me ka kakaretso "na re tla fihla moo?" Maemong ana mananeo a bohlasoa e ne e le khetho e nepahetseng, empa, ka tlhaho, ke ne ke sa batle ho e pheta ho sa hlokahale. Lekhetlong lena ke ne ke batla ho e etsa ka bohlale: boitlamo ba athomo, liphetoho tsa khoutu (eseng "ho kopanya litlhaku tse sa reroang ho fihlela li bokella (ka litemoso)", joalo ka ha Linus Torvalds a kile a bua ka motho e mong, ho latela Wikiquote), joalo-joalo.

Phoso ya boraro: ho kena ka metsing ntle le ho tseba ford

Ke ntse ke e-s'o tlose sena ka ho feletseng, empa joale ke entse qeto ea ho se latele tsela ea ho hanyetsa ho hang, le ho e etsa "joaloka motho e moholo," e leng, ngola TCG ea ka ea morao-rao ho tloha qalong, e le hore ke se ke ka etsa joalo. ho tlameha ho re hamorao, "E, sena ke 'nete, butle-butle, empa ha ke khone ho laola ntho e' ngoe le e 'ngoe - ke kamoo TCI e ngotsoeng kateng ..." Ho feta moo, sena qalong se ne se bonahala e le tharollo e totobetseng, kaha Ke hlahisa khoutu ea binary. Joalo ka ha ba re, “Ghent e ile ea bokanaу, empa eseng eona ": khoutu, ehlile, ke binary, empa taolo e ke ke ea fetisetsoa ho eona feela - e tlameha ho sutumelletsoa ka ho hlaka ka har'a sebatli bakeng sa ho bokelloa, ho fella ka ntho e itseng e tsoang lefats'eng la JS, e ntseng e hloka ho bolokeha kae kae. Leha ho le joalo, ka meralo e tloaelehileng ea RISC, ho ea kamoo ke utloisisang kateng, boemo bo tloaelehileng ke tlhokahalo ea ho tsosolosa ka mokhoa o hlakileng cache ea litaelo bakeng sa khoutu e nchafalitsoeng - haeba sena e se seo re se hlokang, joale, leha e le efe, e haufi. Ho phaella moo, ho tloha boitekong ba ka ba ho qetela, ke ithutile hore taolo ha e bonahale e fetisetsoa bohareng ba sebaka sa phetolelo, kahoo ha re hloke hore bytecode e hlalosoe ho tloha leha e le efe, 'me re ka e hlahisa feela ho tloha mosebetsing oa lefuba. .

Ba fihla ba raha

Leha ke ile ka qala ho ngola khoutu hape ka Phupu, ho raha boselamose ho ile ha hlaha ho sa hlokomeloe: hangata mangolo a tsoang ho GitHub a fihla e le litemoso mabapi le likarabo tsa Mathata le Likopo tsa Pull, empa mona, ka tshohanyetso bua ka khoele Binaryen joalo ka qemu backend moelelong, "O entse ntho e joalo, mohlomong o tla bua ho hong." Re ne re bua ka ho sebelisa laeborari e amanang le Emscripten Binaryen ho theha WASM JIT. Che, ke itse u na le lengolo la Apache 2.0 moo, 'me QEMU ka kakaretso e ajoa tlas'a GPLv2,' me ha li lumellane haholo. Ka tšohanyetso ho ile ha fumaneha hore lengolo la tumello le ka ba lokisa ka tsela e itseng (Ha ke tsebe: mohlomong fetola, mohlomong dual laesense, mohlomong ntho e nngwe ...). Sena, ehlile, se ile sa nthabisa, hobane ka nako eo ke ne ke se ke shebile ka hloko sebopeho sa binary WebAssembly, 'me ke ne ke hloname ka tsela e itseng ke sa utloisisehe. Hape ho ne ho e-na le laebrari e neng e tla ja li-blocks tsa motheo ka graph ea phetoho, e hlahise bytecode, esita le ho e tsamaisa ho mofetoleli ka boeena, ha ho hlokahala.

Joale ho ne ho e-na le tse ling hape lengolo lethathamong la mangolo la QEMU, empa taba ena e mabapi le potso, "Ke mang ea e hlokang?" Mme ho jwalo ka tshohanyetso, ho ile ha fumaneha hore ho ne ho hlokahala. Bonyane, o ka kopanya menyetla e latelang ea ts'ebeliso, haeba e sebetsa kapele kapa hanyane:

  • ho qala ntho e rutang ntle le ho kenya letho ho hang
  • virtualization ho iOS, moo, ho ea ka menyenyetsi, ts'ebeliso e le 'ngoe feela e nang le tokelo ea ho hlahisa khoutu ka fofa ke enjene ea JS (na sena ke' nete?)
  • pontšo ea mini-OS - single-floppy, e hahiloeng ka hare, mefuta eohle ea firmware, joalo-joalo ...

Browser Runtime Features

Joalokaha ke se ke boletse, QEMU e hokahane le multithreading, empa sebatli ha se na eona. Hantle, ke hore, che ... Qalong e ne e le sieo ho hang, joale WebWorkers e ile ea hlaha - ho ea kamoo ke utloisisang, sena ke multithreading e thehiloeng ho fetisa molaetsa. ntle le diphapano tse arolelanoang. Ka tlhaho, sena se baka mathata a bohlokoa ha o tsamaisa khoutu e teng ho latela mohlala oa memori o arolelanoang. Joale, tlas’a khatello ea sechaba, e ile ea boela ea kenngoa tšebetsong tlas’a lebitso SharedArrayBuffers. E ile ea hlahisoa butle-butle, ba keteka ho qalisoa ha eona ka li-browser tse fapaneng, joale ba keteka Selemo se Secha, 'me joale Meltdown ... Ka mor'a moo ba fihletse qeto ea hore nako e mahoashe kapa e mahoashe, empa ka thuso ea mohopolo o kopanetsoeng le a khoele e eketsang khaontara, hoa tšoana e tla sebetsa hantle haholo. Kahoo re ile ra thibela multithreading ka mohopolo o arolelanoang. Ho bonahala eka hamorao ba ile ba e khutlisetsa morao, empa, joalokaha ho ile ha hlaka ho tloha tekong ea pele, ho na le bophelo ntle le eona, 'me haeba ho joalo, re tla leka ho e etsa ntle le ho itšetleha ka ho bala ka bongata.

Karolo ea bobeli ke ho se khonehe ha manonyeletso a boemo bo tlase ka stack: o ke ke oa nka feela, boloka maemo a hajoale le ho fetohela ho e ncha ka stack e ncha. Mohala oa mohala o laoloa ke mochini o sebetsang oa JS. Ho ka bonahala eka bothata ke bofe, kaha re ntse re nkile qeto ea ho laola phallo ea pele ka letsoho ka botlalo? 'Nete ke hore thibela I / O ho QEMU e kenngoa ts'ebetsong ka li-coroutines,' me ke hona moo mekhoa e tlaase ea li-stack e tla ba teng. Ka lehlohonolo, Emscipten e se e ntse e na le mochini oa ts'ebetso ea asynchronous, esita le tse peli: Asyncify и Emterpreter. Ea pele e sebetsa ka bloat e kholo khoutu ea JavaScript e hlahisitsoeng mme ha e sa tšehetsoa. Ea bobeli ke "tsela e nepahetseng" ea hajoale mme e sebetsa ka tlhahiso ea bytecode bakeng sa mofetoleli oa matsoalloa. E sebetsa, ehlile, butle-butle, empa ha e koale khoutu. Ke 'nete, tšehetso ea li-coroutines bakeng sa mochine ona e ne e tlameha ho tlatsetsoa ka boithaopo (ho ne ho se ho ntse ho e-na le li-coroutines tse ngotsoeng bakeng sa Asyncify 'me ho ne ho e-na le ts'ebetsong ea hoo e batlang e le API e tšoanang bakeng sa Emterpreter, u ne u hloka feela ho e hokahanya).

Hona joale, ha ke e-s'o khone ho arola khoutu ho e 'ngoe e hlophisitsoeng ka WASM le ho hlalosoa ho sebelisa Emterpreter, kahoo thibela lisebelisoa ha li sebetse (bona letotong le latelang, joalokaha ba re ...). Ka mantsoe a mang, qetellong u lokela ho fumana ntho e kang ena e qabolang ea lera:

  • tolokiloe boloko I/O. Na u ne u hlile u lebelletse NVMe e etsisoang ka ts'ebetso ea tlhaho? 🙂
  • Khoutu ea mantlha ea QEMU (mofetoleli, lisebelisoa tse ling tse etsisitsoeng, jj.)
  • o hlophisitse khoutu ea moeti ka matla ho WASM

Likarolo tsa mehloli ea QEMU

Joalo ka ha o se o ntse o nahanne, khoutu ea ho etsisa meralo ea baeti le khoutu ea ho hlahisa litaelo tsa mochini o amohelang li arotsoe ho QEMU. Ha e le hantle, ho thata le ho feta:

  • ho na le meaho ea baeti
  • ke li-accelerator, e leng, KVM bakeng sa virtualization ea lisebelisoa ho Linux (bakeng sa litsamaiso tsa baeti le tsa baeti tse lumellanang), TCG bakeng sa tlhahiso ea khoutu ea JIT kae kapa kae. Ho qala ka QEMU 2.9, ho ile ha hlaha tšehetso bakeng sa maemo a HAXM a hardware a Windows.lintlha)
  • haeba TCG e sebelisoa eseng hardware virtualization, joale e na le e arohaneng code molokong tšehetso bakeng sa mong le e mong meralo ea moeti, hammoho le bakeng sa mofetoleli bokahohleng.
  • ... le ho pota-pota tsena tsohle - li-peripherals tse etsisoang, sebopeho sa mosebedisi, ho falla, ho bapala hape, joalo-joalo.

Ka tsela, na u ne u tseba: QEMU e ka etsisa eseng komporo eohle feela, empa hape le processor bakeng sa ts'ebetso e fapaneng ea mosebelisi ho kernel e amohelang, e sebelisoang, mohlala, ke AFL fuzzer bakeng sa lisebelisoa tsa binary. Mohlomong ho na le motho ea ka ratang ho tsamaisa mokhoa ona oa ts'ebetso oa QEMU ho JS? 😉

Joalo ka software ea mahala ea nako e telele, QEMU e hahiloe ka mohala configure и make. Ha re re u etsa qeto ea ho eketsa ntho e itseng: TCG backend, ts'ebetsong ea khoele, ntho e 'ngoe hape. Se ke oa potlakela ho thaba/ho tšoha (thalla mola ka moo ho loketseng) ka tebello ea ho buisana le Autoconf - ha e le hantle, configure Ho hlakile hore QEMU's e ngotse 'me ha e hlahisoe ka letho.

WebAssembly

Joale ntho ee e bitsoang WebAssembly (aka WASM) ke eng? Ena ke sebaka sa Asm.js, ha e sa etsa eka ke khoutu e nepahetseng ea JavaScript. Ho e-na le hoo, ke ea binary ebile e ntlafalitsoe, 'me le ho ngola palo e felletseng ho eona ha ho bonolo haholo: bakeng sa compactness, e bolokiloe ka sebopeho. LEB128.

E ka 'na eaba u utloile ka algorithm ea ho tsosolosa bakeng sa Asm.js - ena ke tsosoloso ea litaelo tsa "boemo bo phahameng" ba taolo ea phallo (ke hore, haeba-ha ho le joalo, li-loops, joalo-joalo), tseo lienjineri tsa JS li etselitsoeng tsona, ho tloha. LLVM IR ea boemo bo tlase, haufi le khoutu ea mochini e entsoeng ke processor. Ka tlhaho, boemeli ba mahareng ba QEMU bo haufi le ea bobeli. Ho ka bonahala eka ke ena, bytecode, pheletso ea tlhokofatso ... 'Me joale ho na le li-blocks, haeba-ha ho le joalo le loops!..

'Me lena ke lebaka le leng leo ka lona Binaryen e leng molemo: ka tlhaho e ka amohela li-blocks tsa boemo bo phahameng tse haufi le se neng se tla bolokoa ho WASM. Empa e ka boela ea hlahisa khoutu ho tloha ho kerafo ea li-blocks tsa motheo le liphetoho pakeng tsa tsona. Hantle, ke se ke boletse hore e pata sebopeho sa polokelo ea WebAssembly ka morao ho C / C ++ API e loketseng.

TCG (Jenereithara ea Khoutu e Nyenyane)

GTC e ne e le qalong backend bakeng sa compiler C. Joale, ho bonahala eka e ne e ke ke ea mamella tlhōlisano le GCC, empa qetellong e ile ea fumana sebaka sa eona QEMU e le mokhoa oa ho hlahisa khoutu bakeng sa sethaleng sa moeti. Ho boetse ho na le TCG backend e hlahisang li-bytecode tse sa bonahaleng, tse etsoang hang-hang ke mofetoleli, empa ke ile ka etsa qeto ea ho qoba ho e sebelisa nakong ena. Leha ho le joalo, taba ea hore ho QEMU ho se ho khoneha ho etsa hore phetoho ea lefuba le hlahisitsoeng ka mosebetsi. tcg_qemu_tb_exec, e ile ea e-ba molemo haholo ho ’na.

Ho kenya TCG e ncha morao-rao ho QEMU, o hloka ho theha subdirectory tcg/<имя архитектуры> (boemong bona, tcg/binaryen), 'me e na le lifaele tse peli: tcg-target.h и tcg-target.inc.c и laela ke tsohle ka configure. U ka beha lifaele tse ling moo, empa, joalo ka ha u ka hakanya ho tsoa mabitsong a tsena tse peli, ka bobeli li tla kenyelletsoa kae-kae: e le 'ngoe e le faele ea hlooho e tloaelehileng (e kenyelelitsoe ho tcg/tcg.h, 'me e se e ntse e le lifaeleng tse ling ho li-directory tcg, accel mme eseng feela), e 'ngoe - feela joalo ka snippet ea khoutu tcg/tcg.c, empa e na le phihlello ea mesebetsi ea eona e sa fetoheng.

Ha ke etsa qeto ea hore ke tla qeta nako e ngata ke etsa lipatlisiso tse qaqileng tsa hore na e sebetsa joang, ke ile ka kopitsa "masapo" a lifaele tsena tse peli ho tloha ts'ebetsong e 'ngoe ea backend, ka botšepehi ke bontša sena sehloohong sa laesense.

faele tcg-target.h e na le li-setting haholo ka foromo #define-s:

  • hore na ho na le li-rejista tse kae le bophara bo bokae mohahong oa meralo (re na le tse ngata kamoo re li batlang, tse ngata kamoo re batlang kateng - potso e mabapi le hore na ke eng e tla hlahisoa ka khoutu e sebetsang haholoanyane ke sebatli ho "taelo e feletseng" ea meralo. ...)
  • tlhophiso ea litaelo tsa moamoheli: ho x86, esita le ho TCI, litaelo ha li tsamaellane ho hang, empa ke tla kenya buffer ea khoutu eseng litaelo ho hang, empa lisupa ho meaho ea laeborari ea Binaryen, kahoo ke tla re: 4 li-byte
  • ke litaelo life tsa boikhethelo tse ka hlahisoang ke backend - re kenyelletsa ntho e ngoe le e ngoe eo re e fumanang ho Binaryen, tlohella accelerator e arole tse ling hore e be tse bonolo ka botsona.
  • Ke boholo bo bokae ba cache ea TLB e kopiloeng ke backend. 'Nete ke hore ho QEMU ntho e' ngoe le e 'ngoe e tebile: le hoja ho na le mesebetsi ea mothusi e etsang mojaro / lebenkele ho nahanela moeti MMU (re ka be re le kae ntle le eona hona joale?), Ba boloka cache ea bona ea phetolelo ka mokhoa oa sebopeho, the ts'ebetso ea eona e bonolo ho kenngoa ka kotloloho ho li-block tsa khaso. Potso ke hore, ke eng e fokolitsoeng sebopehong see e sebetsoang ka mokhoa o atlehileng haholo ke tatellano e nyane le e potlakileng ea litaelo?
  • Mona o ka fetola sepheo sa rejisetara e le 'ngoe kapa tse peli tse bolokiloeng, o nolofalletsa ho letsetsa TB ka ts'ebetso ebe o hlalosa ka boikhethelo tse nyane tse nyane. inline-mesebetsi joalo ka flush_icache_range (empa sena ha se taba ea rona)

faele tcg-target.inc.c, ehlile, hangata e kholoanyane ka boholo mme e na le mesebetsi e mengata e tlamang:

  • ho qalisoa, ho kenyelletsa le lithibelo tseo litaelo li ka sebetsang ho li-operands. E qopisitsoe ke 'na ka mokhoa o hlakileng ho tsoa mokokotlong o mong
  • mosebetsi o nkang taelo e le 'ngoe ea ka hare ea bytecode
  • U ka boela ua beha mesebetsi e thusang mona, 'me u ka sebelisa mesebetsi e tsitsitseng ho tloha tcg/tcg.c

Bakeng sa ka, ke ikhethetse leano le latelang: ka mantsoe a pele a lebokose le latelang la phetolelo, ke ngotse lintlha tse 'nè: letšoao la ho qala (boleng bo itseng sebakeng se haufi. 0xFFFFFFFF, e entseng qeto ea boemo ba hajoale ba lefuba), moelelo oa taba, mojule o hlahisitsoeng, le nomoro ea boselamose bakeng sa ho lokisa liphoso. Qalong letšoao le ne le kentsoe 0xFFFFFFFF - nkae n - palo e nyenyane e ntle, 'me nako le nako ha e ne e etsoa ka mofetoleli e ne e eketseha ka 1. Ha e fihla 0xFFFFFFFE, ho hlophisoa ho ile ha etsoa, ​​​​mojule e bolokiloe tafoleng ea ts'ebetso, e kenngoa ka har'a "launcher" e nyenyane, eo ts'ebetso e ileng ea tsoa ho eona. tcg_qemu_tb_exec, mme mojule o tlositsoe mohopolong oa QEMU.

Ho hlalosa li-classics, "Crutch, ke bokae ho kopantsoeng molumo ona bakeng sa pelo ea proger ...". Leha ho le joalo, mohopolo o ne o lutla kae-kae. Ho feta moo, e ne e le mohopolo o laoloang ke QEMU! Ke ne ke e-na le khoutu eo, ha ke ngola taelo e latelang (hantle, ke hore, pointer), e tlose eo sehokelo sa hae se neng se le sebakeng sena pejana, empa sena ha sea ka sa thusa. Haele hantle, maemong a bonolo, QEMU e fana ka memori ha e qala ebe e ngola khoutu e hlahisitsoeng moo. Ha buffer e fela, khoutu e lahleloa ka ntle 'me e latelang e qala ho ngoloa sebakeng sa eona.

Ka mor'a ho ithuta khoutu, ke ile ka hlokomela hore leqheka le nang le nomoro ea boselamose le ile la ntumella hore ke se ke ka hlōleha ho senya qubu ka ho lokolla ntho e fosahetseng holim'a buffer e sa tsejoeng nakong ea pele. Empa ke mang ea ngolang buffer hape hore e fete tšebetso ea ka hamorao? Joalokaha bahlahisi ba Emscripten ba eletsa, ha ke kena bothateng, ke ile ka kenya khoutu e hlahang morao ho kopo ea tlhaho, ke beha Mozilla Record-Replay ho eona ... Ka kakaretso, qetellong ke ile ka hlokomela ntho e bonolo: bakeng sa thibelo e 'ngoe le e' ngoe, a struct TranslationBlock ka tlhaloso ea eona. Nahana hore na ... Ho lokile, pele ho boloko hantle feela ka har'a buffer. Ha ke hlokomela sena, ke ile ka etsa qeto ea ho tlohela ho sebelisa lithupa (bonyane tse ling), eaba ke lahla nomoro ea boselamose, 'me ka fetisetsa mantsoe a setseng ho. struct TranslationBlock, ho theha lenane le le leng le hokahantsoeng le ka tšeloang ka potlako ha cache ea phetolelo e setiloe bocha, ebe o lokolla memori.

Lithupa tse ling li sala: mohlala, lisupa tse tšoailoeng ka har'a buffer ea khoutu - tse ling tsa tsona li bonolo BinaryenExpressionRef, ke hore, ba sheba lipolelo tse lokelang ho kenngoa ka mokhoa o hlakileng ka har'a thibela ea motheo e hlahisitsoeng, karolo ke boemo ba phetoho pakeng tsa BBs, karolo ke moo u lokelang ho ea teng. Ho joalo, ho na le li-blocks tse seng li lokisitsoe bakeng sa Relooper tse hlokang ho hokahanngoa ho latela maemo. Ho li khetholla, ho sebelisoa khopolo ea hore kaofela li tsamaisana le bonyane li-byte tse 'nè, kahoo u ka sebelisa ka mokhoa o sireletsehileng likotoana tse peli tsa bohlokoa bakeng sa label, u hloka feela ho hopola ho e tlosa ha ho hlokahala. Ka tsela, mangolo a joalo a se a ntse a sebelisoa QEMU ho bontša lebaka la ho tsoa ho loop ea TCG.

Ho sebelisa Binaryen

Li-module ho WebAssembly li na le mesebetsi, e 'ngoe le e' ngoe e nang le 'mele, e leng polelo. Lipolelo ke ts'ebetso e sa tloaelehang le ea binary, li-blocks tse nang le lethathamo la lipolelo tse ling, phallo ea taolo, joalo-joalo. Joalokaha ke se ke boletse, phallo ea taolo mona e hlophisitsoe hantle joalo ka makala a boemo bo holimo, li-loops, li-call tsa mesebetsi, joalo-joalo. Likhang mabapi le mesebetsi ha li fetisetsoe ho stack, empa ka ho hlaka, joalo ka JS. Hape ho na le mefuta e fapaneng ea lefats'e, empa ha ke e-so e sebelise, kahoo nke ke ka u bolella ka eona.

Mesebetsi e boetse e na le mefuta e fapaneng ea lehae, e baloang ho tloha ho zero, ea mofuta: int32 / int64 / float / habeli. Tabeng ena, mefuta ea pele ea n ea sebaka ke likhang tse fetiselitsoeng mosebetsing. Ka kopo hlokomela hore le hoja ntho e 'ngoe le e' ngoe e teng mona e se ea boemo bo tlaase ka ho feletseng mabapi le phallo ea taolo, lipalo-palo li ntse li sa jere tšobotsi e "saenneng / e sa ngolisoang": hore na palo e itšoara joang e itšetlehile ka khoutu ea ts'ebetso.

Ka kakaretso, Binaryen e fana ka C-API e bonolo: o etsa mojule, ho eena theha lipolelo - unary, binary, li-blocks ho tsoa ho lipolelo tse ling, phallo ea taolo, joalo-joalo. Ebe u theha tšebetso e nang le polelo e le 'mele oa eona. Haeba uena, joalo ka 'na, u na le graph ea phetoho ea boemo bo tlase, karolo ea relooper e tla u thusa. Ho ea kamoo ke utloisisang kateng, hoa khoneha ho sebelisa taolo ea boemo bo phahameng ba phallo ea ts'ebetso ka thibela, hafeela e sa fetele meeli ea thibelo - ke hore, hoa khoneha ho etsa tsela e potlakileng ea ka hare / butle. tsela ea lekala ka hare ho khoutu ea ts'ebetso ea cache ea TLB e hahiloeng, empa e se ke ea kena-kenana le "ka ntle" ea taolo ea phallo. Ha o lokolla relooper, li-block tsa eona lia lokolloa; ha o lokolla module, lipolelo, mesebetsi, joalo-joalo, tse fanoeng ho eona lia nyamela. lebala la lipapali.

Leha ho le joalo, haeba u batla ho toloka khoutu ka fofa ntle le pōpo e sa hlokahaleng le ho hlakola mohlala oa mofetoleli, ho ka 'na ha e-ba ntho e utloahalang ho beha mohopolo ona faeleng ea C ++,' me ho tloha moo u tsamaise ka ho toba C ++ API eohle ea laebrari, u feta u itokisitse- li-wrappers tse entsoeng.

Kahoo ho hlahisa khoutu eo u e hlokang

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

... haeba ke lebetse eng kapa eng, masoabi, sena ke feela ho emela sekala, 'me lintlha li teng litokomaneng.

'Me joale crack-fex-pex e qala, ntho e kang ena:

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

E le hore ka tsela e itseng u hokahane le lefats'e la QEMU le JS 'me ka nako e ts'oanang u fihlele mesebetsi e hlophisitsoeng ka potlako, ho ile ha bōptjoa sehlopha (tafole ea mesebetsi bakeng sa ho kenya letsoho ho qala),' me mesebetsi e hlahisitsoeng e ile ea behoa moo. Ho bala index kapele, index ea "zero word block block" e ne e sebelisoa e le eona, empa joale index e baloang ho sebelisoa foromo ena e ile ea qala ho kenella tšimong. struct TranslationBlock.

Tseleng, moemeli (hona joale o na le lengolo la tumello) e sebetsa hantle feela ho Firefox. Bahlahisi ba Chrome ba ne ba ka tsela e itseng e sa itokisetsa 'Nete ea hore motho e mong a ka batla ho etsa mehlala e fetang sekete ea li-module tsa WebAssembly, kahoo ba fane ka sebaka sa aterese sa gigabyte bakeng sa e' ngoe le e 'ngoe ...

Ke phetho bakeng sa jwale. Mohlomong ho tla ba le sehlooho se seng haeba mang kapa mang a thahasella. E leng, ho sa ntse ho na le bonyane feela etsa hore lisebelisoa tsa block li sebetse. Hape ho ka 'na ha e-ba ntho e utloahalang ho etsa hore ho bokelloa ha li-module tsa WebAssembly ho se lumellane, joalokaha ho tloaelehile lefatšeng la JS, kaha ho ntse ho e-na le mofetoleli ea ka etsang tsena tsohle ho fihlela mochine oa tlhaho o se o lokile.

Qetellong ke selotho: u hlophisitse binary ka meralo ea 32-bit, empa khoutu, ka ts'ebetso ea mohopolo, e nyoloha ho tloha Binaryen, kae-kae ho stack, kapa kae-kae sebakeng se ka holimo sa 2 GB sa sebaka sa aterese sa 32-bit. Bothata ke hore ho ea ka pono ea Binaryen sena se fihlella aterese e kholo haholo ea sephetho. Joang ho potoloha see?

Ka tsela ea admin

Ha kea qetella ke lekile sena, empa mohopolo oa ka oa pele e ne e le "Ho thoe'ng haeba ke kentse 32-bit Linux?" Ebe karolo e ka holimo ea sebaka sa aterese e tla be e tšoaretsoe ke kernel. Potso feela ke hore na ho tla ba le bokae: 1 kapa 2 Gb.

Ka tsela ea moqapi (khetho bakeng sa litsebi)

Ha re butse bubble kaholimo ho sebaka sa aterese. Le 'na ha ke utloisise hore na ke hobane'ng ha e sebetsa - moo se ho tlameha ho ba le sekoti. Empa "re litsebi: ntho e 'ngoe le e' ngoe e sebetsa molemong oa rona, empa ha ho motho ea tsebang hore na ke hobane'ng ha ..."

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

... ke 'nete hore ha e lumellane le Valgrind, empa, ka lehlohonolo, Valgrind ka boeona e sutumelletsa motho e mong le e mong ho tsoa moo :)

Mohlomong motho e mong o tla fana ka tlhaloso e betere ea hore na khoutu ena ea ka e sebetsa joang...

Source: www.habr.com

Eketsa ka tlhaloso