Qemu.js ka tšehetso ea JIT: o ntse o ka khutlisetsa mince morao

Lilemong tse 'maloa tse fetileng Fabrice Bellard e ngotsoeng ke jslinux ke emulator ea PC e ngotsoeng ka JavaScript. Ka mor'a moo ho ne ho e-na le bonyane tse ling Virtual x86. Empa kaofela ha bona, ho ea kamoo ke tsebang, e ne e le bafetoleli, athe Qemu, e ngotsoeng pejana ke Fabrice Bellard a le mong, 'me, mohlomong, emulator leha e le efe ea sejoale-joale e itlhomphang, e sebelisa pokello ea JIT ea khoutu ea baeti ho khoutu ea sistimi e amohelang. Ho 'na ho ne ho bonahala eka ke nako ea ho kenya ts'ebetsong mosebetsi o fapaneng le oo libatli li li rarollang: JIT e kopanya khoutu ea mochini ho JavaScript, eo ho neng ho bonahala e utloahala ho port Qemu. Ho ka bonahala eka, ke hobane'ng ha Qemu, ho na le li-emulators tse bonolo le tse bonolo ho mosebedisi - VirtualBox e tšoanang, mohlala - e kentsoeng ebile e sebetsa. Empa Qemu e na le likarolo tse 'maloa tse khahlisang

  • mohloli o bulehileng
  • bokgoni ba ho sebetsa ntle le mokganni wa kernel
  • bokgoni ba ho sebetsa ka mokgwa wa toloko
  • tšehetso bakeng sa palo e kholo ea meralo ea baeti le ea baeti

Mabapi le ntlha ea boraro, joale nka hlalosa hore ha e le hantle, ka mokhoa oa TCI, hase litaelo tsa mochine oa moeti ka botsona tse hlalosoang, empa bytecode e fumanoeng ho bona, empa sena ha se fetole moelelo - e le ho haha ​​​​le ho matha. Qemu mabapi le meralo e mecha, haeba u na le lehlohonolo, A C compiler e lekane - ho ngola jenereithara ea khoutu ho ka chechisoa.

'Me joale, ka mor'a lilemo tse peli tsa ho itlosa bolutu ka khoutu ea mohloli oa Qemu ka nako ea ka ea mahala, ho ile ha hlaha mohlala o sebetsang, oo u seng u ntse u ka matha, mohlala, Kolibri OS.

Emscripten ke eng

Matsatsing ana, baqapi ba bangata ba hlahile, phello ea eona ke JavaScript. Tse ling, joalo ka Type Script, qalong li ne li reretsoe ho ba mokhoa o motle oa ho ngolla webosaete. Ka nako e ts'oanang, Emscripten ke mokhoa oa ho nka khoutu ea C kapa C ++ e seng e ntse e le teng le ho e bokella ka foromo e baloang ke sebatli. E butsoe leqepheng lena Re bokelletse likou tse ngata tsa mananeo a tsebahalang: monaKa mohlala, u ka sheba PyPy - ka tsela, ba bolela hore ba se ba ntse ba e-na le JIT. Ebile, ha se lenaneo le leng le le leng le ka hlophisoang le ho tsamaisoa ka har'a sebatli - ho na le palo Likaroloana, eo u tlamehang ho e mamella, leha ho le joalo, joalo ka ha mongolo o leqepheng le tšoanang o re "Emscripten e ka sebelisoa ho bokella hoo e ka bang efe kapa efe. nkehang habobebe C/C++ code to JavaScript". Ke hore, ho na le lits'ebetso tse 'maloa tse sa hlalosoang ho latela maemo, empa hangata li sebetsa ho x86 - mohlala, phihlello e sa lekanyetsoang ea mefuta-futa, e hanetsoeng ka kakaretso meahong e meng. , Qemu is a cross-platform programme , ke ne ke batla ho lumela, 'me ha e se e na le boitšoaro bo bongata bo sa hlalosoang - e nke 'me u bokelle, ebe u nahana hanyenyane ka JIT - 'me u qetile! nyeoe...

Pele leka

Ka kakaretso, ha se motho oa pele oa ho hlahisa mohopolo oa ho isa Qemu ho JavaScript. Ho na le potso e ileng ea botsoa sethaleng sa ReactOS haeba sena se ka khonahala ho sebelisoa Emscripten. Esita le pejana, ho ne ho e-na le menyenyetsi ea hore Fabrice Bellard o entse sena ka boeena, empa re ne re bua ka jslinux, eo, ho ea kamoo ke tsebang, e leng boiteko ba ho finyella ts'ebetso e lekaneng ka letsoho ho JS, 'me e ngotsoe ho tloha qalong. Hamorao, Virtual x86 e ile ea ngoloa - mehloli e sa tsejoeng e ile ea kenngoa bakeng sa eona, 'me, joalokaha ho boletsoe, "nete" e kholoanyane ea ho etsisa e entse hore ho khonehe ho sebelisa SeaBIOS e le firmware. Ho feta moo, ho bile le bonyane teko e le 'ngoe ea ho palamisa Qemu ke sebelisa Emscripten - ke lekile ho etsa sena socketpair, empa tsoelopele, ho ea kamoo ke utloisisang, e ne e le leqhoa.

Kahoo, ho ka bonahala eka mehloli ke ena, Emscripten ke ena - e nke 'me u e bokelle. Empa ho boetse ho na le lilaeborari tseo Qemu e itšetlehileng ka tsona, le lilaebrari tseo lilaebrari tseo li itšetlehileng ka tsona, joalo-joalo, ’me e ’ngoe ea tsona ke libfi, eo glib e itšetlehileng ka eona. Ho ne ho e-na le menyenyetsi Inthaneteng ea hore ho na le e 'ngoe ea pokello e kholo ea likou tsa lilaebrari bakeng sa Emscripten, empa ka tsela e itseng ho ne ho le thata ho lumela: pele, e ne e sa rereloa ho ba moqapi o mocha, oa bobeli, e ne e le boemo bo tlaase haholo. laebrari eo u ka e nkang, 'me u e hlophise ho JS. Mme ha se taba feela ea ho kenya kopano - mohlomong, haeba o e sotha, bakeng sa likopano tse ling tsa mehala o ka hlahisa likhang tse hlokahalang ho stack mme o letsetsa ts'ebetso ntle le tsona. Empa Emscripten ke ntho e qhekellang: molemong oa ho etsa hore khoutu e hlahisitsoeng e shebahale e tloaelehile ho sebatli sa JS engine optimizer, ho sebelisoa maqheka a mang. Haholo-holo, seo ho thoeng ke relooping - jenereithara ea khoutu e sebelisang LLVM IR e amohetseng e nang le litaelo tse ling tse sa bonahaleng tsa phetoho e leka ho etsa li-ifs tse hlakileng, loops, joalo-joalo. Joale, likhang li fetisetsoa joang mosebetsing? Ka tlhaho, joalo ka likhang mabapi le mesebetsi ea JS, ke hore, ha ho khoneha, eseng ka stack.

Qalong ho ne ho e-na le mohopolo oa ho ngola feela phetoho ea libffi le JS le ho etsa liteko tse tloaelehileng, empa qetellong ke ile ka ferekana mabapi le mokhoa oa ho etsa lifaele tsa hlooho ea ka e le hore li sebetse ka khoutu e teng - nka etsa eng, ha ba ntse ba re, "Na mesebetsi e rarahane "Na re maoatla hakaale?" Ke ile ka tlameha ho kenya libffi ho ea mohahong o mong, ka tsela ea ho bua - ka lehlohonolo, Emscripten e na le li-macros tse peli bakeng sa kopano e ka hare (ka Javascript, ee - hantle, ho sa tsotellehe hore na ke mohaho ofe, kahoo motlatsi), le bokhoni ba ho tsamaisa khoutu e hlahisoang ka fofa. Ka kakaretso, kamora ho ts'oara likhechana tsa libffi tse itšetlehileng ka sethala nako e itseng, ke ile ka fumana khoutu e ka kopantsoeng mme ka e tsamaisa tekong ea pele eo ke e fumaneng. Ke ile ka makala ha teko eo e atleha. Ke hloletsoe ke bohlale ba ka - ha ho motlae, e ile ea sebetsa ho tloha qalong - 'na, ke ntse ke sa kholoe mahlo a ka, ke ile ka ea sheba khoutu e hlahang hape, ho lekola hore na ke cheka hokae. Mona ke ile ka ea linate ka lekhetlo la bobeli - ntho feela eo mosebetsi oa ka o e entseng e ne e le ffi_call - sena se tlalehile mohala o atlehileng. Ho ne ho se na pitso ka boeona. Kahoo ke ile ka romela kopo ea ka ea pele ea ho hula, e ileng ea lokisa phoso tekong e hlakileng ho seithuti leha e le sefe sa Olympiad - linomoro tsa sebele ha lia lokela ho bapisoa le a == b esita le joang a - b < EPS - o boetse o hloka ho hopola mojule, ho seng joalo 0 e tla lekana haholo le 1/3 ... Ka kakaretso, ke ile ka tla le kou e itseng ea libffi, e fetisang liteko tse bonolo ka ho fetisisa, le hore na ke glib efe. e hlophisitsoe - ke nkile qeto ea hore ho tla hlokahala, ke tla e kenyelletsa hamorao. Ha ke sheba pele, ke tla re, joalokaha ho ile ha fumaneha, moqapi ha aa ka a kenyelletsa mosebetsi oa libffi khoutu ea ho qetela.

Empa, joalo ka ha ke se ke boletse, ho na le mefokolo e itseng, 'me har'a ts'ebeliso ea mahala ea boits'oaro bo fapaneng bo sa hlalosoang, ho patiloe tšobotsi e sa thabiseng ho feta - JavaScript ka moralo ha e tšehetse ho bala ka bongata ka mohopolo o arolelanoang. Ha e le hantle, hangata sena se ka bitsoa mohopolo o motle, empa eseng bakeng sa khoutu ea porting eo meaho ea eona e hokahaneng le likhoele tsa C. Ka kakaretso, Firefox e ntse e leka ho tšehetsa basebetsi ba arolelanoang, 'me Emscripten e na le ts'ebetsong ea pthread bakeng sa bona, empa ke ne ke sa batle ho itšetleha ka eona. Ke ile ka tlameha ho ntša butle-butle ho bala lintlha tse ngata ho khoutu ea Qemu - ke hore, ho fumana moo likhoele li mathang teng, ke tsamaise 'mele oa loop e mathang ka khoele ena hore e be mosebetsi o arohaneng,' me u bitse mesebetsi e joalo ka bonngoe ho tloha ho lupu e kholo.

Teko ea bobeli

Ka nako e 'ngoe, ho ile ha hlaka hore bothata bo ne bo ntse bo le teng, le hore lithupa tsa ho sututsa ka mokhoa o sa reroang ho pota-pota khoutu ho ne ho ke ke ha tlisa molemo oa letho. Qetello: ka tsela e itseng re hloka ho hlophisa ts'ebetso ea ho eketsa lithupa. Ka hona, phetolelo ea 2.4.1, e neng e le ncha ka nako eo, e nkiloe (eseng 2.5.0, hobane, ke mang ea tsebang, ho tla ba le likokoana-hloko phetolelong e ncha e e-s'o tšoaroe, 'me ke na le likokoana-hloko tsa ka tse lekaneng. ), ’me ntho ea pele e bile ho e ngola hape ka mokhoa o sireletsehileng thread-posix.c. Ho joalo, ke hore, ho bolokehile: haeba motho e mong a leka ho etsa opereishene e lebisang ho thibela, mosebetsi o ile oa bitsoa hang-hang abort() - ha e le hantle, sena ha sea ka sa rarolla mathata ohle ka nako e le 'ngoe, empa bonyane e ne e le monate ka tsela e itseng ho feta ho amohela ka khutso data e sa lumellaneng.

Ka kakaretso, likhetho tsa Emscripten li thusa haholo ho tsamaisa khoutu ho JS -s ASSERTIONS=1 -s SAFE_HEAP=1 - ba tšoara mefuta e meng ea boits'oaro bo sa hlalosoang, joalo ka mehala e eang atereseng e sa lekanyetsoang (e sa lumellaneng ho hang le khoutu ea mefuta e thaepileng joalo ka HEAP32[addr >> 2] = 1) kapa ho bitsa tšebetso ka palo e fosahetseng ea likhang.

Ka tsela, liphoso tsa ho tsamaisana ke taba e fapaneng. Joalo ka ha ke se ke boletse, Qemu e na le "tlhaloso e mpe" bakeng sa tlhahiso ea khoutu TCI (mofetoleli o monyane oa khoutu), le ho aha le ho tsamaisa Qemu moahong o mocha, haeba u le lehlohonolo, moqapi oa C o lekane. "haeba u lehlohonolo". Ke ne ke le malimabe, 'me ho ile ha fumaneha hore TCI e sebelisa phihlello e sa lekanyetsoang ha e bapisa bytecode ea eona. Ke hore, mefuteng eohle ea ARM le meaho e meng e nang le phihlello e hlokahalang, Qemu e bokella hobane e na le TCG e tloaelehileng e hlahisang khoutu ea tlhaho, empa hore na TCI e tla sebetsa ho eona ke potso e 'ngoe. Leha ho le joalo, joalokaha ho ile ha etsahala, litokomane tsa TCI li bontšitse ka ho hlaka ntho e tšoanang. Ka lebaka leo, mehala ea ts'ebetso ea ho bala e sa lekanyetsoang e kentsoe khoutu, e ileng ea fumanoa karolong e 'ngoe ea Qemu.

Tshenyeho ya qubu

Ka lebaka leo, phihlello e sa lekanyetsoang ea TCI e ile ea lokisoa, ho ile ha etsoa loop e kholo eo le eona e bitsoang processor, RCU le lintho tse ling tse nyane. 'Me kahoo ke qala Qemu ka khetho -d exec,in_asm,out_asm, ho bolelang hore o hloka ho bolela hore na ke li-blocks life tse ntseng li etsoa, ​​​​le nakong ea phatlalatso ho ngola hore na khoutu ea moeti e ne e le efe, hore na khoutu ea moeti e bile efe (tabeng ena, bytecode). E qala, e etsa li-blocks tse 'maloa tsa phetolelo, e ngola molaetsa oa debugging oo ke o siileng hore RCU joale e tla qala le ... abort() ka hare ho mosebetsi free(). Ka ho shebana le tšebetso free() Re khonne ho fumana hore hloohong ea qubu ea qubu, e ka har'a li-byte tse robeli tse etellang pele mohopolo o fanoeng, ho e-na le boholo ba li-block kapa ntho e tšoanang, ho ne ho e-na le litšila.

Ho timetsoa ha qubu - ho monate hakaakang ... Boemong bo joalo, ho na le pheko ea bohlokoa - ho tloha (haeba ho khoneha) mehloli e tšoanang, bokella binary ea tlhaho 'me u e tsamaise tlas'a Valgrind. Ka mor'a nako e itseng, binary e ne e se e loketse. Ke e qala ka likhetho tse ts'oanang - e ea senyeha le nakong ea ho qala, pele e fihla ts'ebetsong. Ha ho monate, ha e le hantle - ho hlakile hore mehloli e ne e sa tšoane hantle, e leng ha ho makatse, hobane ho hlophisa likhetho tse fapaneng tse fapaneng, empa ke na le Valgrind - pele ke tla lokisa bothata bona, 'me joale, haeba ke le lehlohonolo. , ea pele e tla hlaha. Ke ntse ke matha ntho e ts'oanang tlas'a Valgrind ... Y-y-y, y-y-y, uh-uh, e qalile, ea feta ka ho qala ka mokhoa o tloaelehileng 'me ea fetela pele ho feta kokoana ea pele ntle le temoso e le' ngoe mabapi le phihlelo e fosahetseng ea mohopolo, ho sa bue letho ka ho oa. Bophelo, joalo ka ha ba re, ha boa ka ba ntokisetsa sena - lenaneo le senyehang le khaotsa ho senyeha ha le qala tlas'a Walgrind. Hore na e ne e le eng ke sephiri. Khopolo ea ka ke hore hang ha e le haufi le thuto ea hajoale ka mor'a kotsi nakong ea ho qala, gdb e bontšitse mosebetsi. memset-a e nang le sesupa se nepahetseng se sebelisang leha e le efe mmx, kapa xmm ngoliso, joale mohlomong e ne e le phoso ea mofuta o itseng, leha ho ntse ho le thata ho lumela.

Ho lokile, Valgrind ha a bonahale a thusa mona. 'Me mona ntho e nyonyehang ka ho fetisisa e qalile - ntho e' ngoe le e 'ngoe e bonahala eka e qala, empa e oela ka mabaka a sa tsejoeng ka ho feletseng ka lebaka la ketsahalo e ka beng e etsahetse limilione tsa litaelo tse fetileng. Ka nako e telele, ho ne ho sa hlaka le hore na ho ka atameloa joang. Qetellong, ke ne ke ntse ke tlameha ho lula fatše le ho lokisa liphoso. Ho hatisa seo hlooho e neng e ngotsoe hape ka sona ho bontšitse hore e ne e sa shebahale joaloka palo, empa ho e-na le hoo e le mofuta oa data ea binary. 'Me, bonang, khoele ena ea binary e fumanoe faeleng ea BIOS - ke hore, joale ho ne ho ka khoneha ho bua ka kholiseho e utloahalang hore e ne e le buffer e khaphatsehang,' me ho hlakile hore e ngotsoe ho buffer ena. Joale, ntho e kang ena - ho Emscripten, ka lehlohonolo, ha ho na randomisation ea sebaka sa aterese, ha ho na masoba ho eona, kahoo o ka ngola kae-kae bohareng ba khoutu ho hlahisa data ka pointer ho tloha qalong ea ho qetela, sheba data, sheba pointer, 'me, haeba e sa fetoha, fumana lijo tsa ho nahana. Ke 'nete, ho nka metsotso e seng mekae ho hokahanya ka mor'a phetoho leha e le efe, empa u ka etsa'ng? Ka lebaka leo, ho ile ha fumanoa mohala o itseng o kopitsitseng BIOS ho tloha ho buffer ea nakoana ho ea mohopolong oa moeti - mme, ehlile, ho ne ho se na sebaka se lekaneng ka har'a buffer. Ho fumana mohloli oa aterese eo e makatsang ea buffer ho felletse ka ts'ebetso qemu_anon_ram_alloc ka faele oslib-posix.c - mohopolo o ne o le ona: ka linako tse ling ho ka ba molemo ho hokahanya aterese le leqephe le leholo la 2 MB ka boholo, bakeng sa sena re tla botsa mmap pele ho feta hanyane, ebe re khutlisetsa ho feteletseng ka thuso munmap. 'Me haeba ho sa hlokahale ho lumellana ho joalo, joale re tla bontša sephetho ho e-na le 2 MB getpagesize() - mmap e ntse e tla fana ka aterese e tsamaellanang... Kahoo ho Emscripten mmap mehala feela malloc, empa ha e le hantle ha e lumellane le leqephe. Ka kakaretso, kokoanyana e ileng ea nkhathatsa ka likhoeli tse 'maloa e ile ea lokisoa ke phetoho двух mela.

Likarolo tsa mesebetsi ea ho letsetsa

'Me joale processor e ntse e bala ho hong, Qemu ha e senyehe, empa skrine ha e bulehe,' me processor e potlakela ho loops, e ahlola ka tlhahiso. -d exec,in_asm,out_asm. Ho hlahile khopolo-taba: nako e sitisa nako (kapa, ka kakaretso, litšitiso tsohle) ha e fihle. 'Me ehlile, haeba u tlosa litšitiso ho tsoa kopanong ea matsoalloa, eo ka lebaka le itseng e ileng ea sebetsa, u fumana setšoantšo se ts'oanang. Empa ena e ne e se karabo ho hang: papiso ea mesaletsa e fanoeng le khetho e kaholimo e bonts'itse hore litsela tsa polao li ile tsa fapana kapele haholo. Mona ho tlameha ho boleloa hore papiso ea se rekotiloeng ho sebelisoa sebui emrun debugging sephetho ka tlhahiso ea kopano ea matsoalloa ha se ts'ebetso ea mochini ka botlalo. Ha ke tsebe hantle hore na lenaneo le sebetsang ho sebatli le hokahana joang le emrun, empa mela e meng ea tlhahiso e fetoha e hlophisoa bocha, kahoo phapang ea phapang ha e e-s'o be lebaka la ho nahana hore litsela li fapane. Ka kakaretso, ho ile ha hlaka hore ho ea ka litaelo ljmpl ho na le phetoho ho ea ho liaterese tse fapaneng, 'me bytecode e hlahisoang e fapane haholo: e' ngoe e na le taelo ea ho bitsa mosebetsi oa mothusi, e 'ngoe ha e eo. Ka mor'a ho hlahloba litaelo le ho ithuta khoutu e fetolelang litaelo tsena, ho ile ha hlaka hore, pele, hang-hang pele ho eona ho ngolisa. cr0 ho ile ha rekota - hape ho sebelisoa mothusi - e ileng ea fetola processor ho mokhoa o sirelelitsoeng, 'me ea bobeli, hore mofuta oa js ha oa ka oa fetohela ho mokhoa o sirelelitsoeng. Empa 'nete ke hore tšobotsi e' ngoe ea Emscripten ke ho tsilatsila ha eona ho mamella khoutu joalo ka ts'ebetsong ea litaelo. call ho TCI, moo pointer efe kapa efe ea ts'ebetso e hlahisang mofuta long long f(int arg0, .. int arg9) - mesebetsi e tlameha ho bitsoa ka palo e nepahetseng ea likhang. Haeba molao ona o tlōtsoe, ho itšetlehile ka litlhophiso tsa ho lokisa liphoso, lenaneo le tla senyeha (le molemo) kapa le bitse ts'ebetso e fosahetseng ho hang (e tla ba masoabi ho e lokisa). Hape ho na le khetho ea boraro - ho nolofalletsa moloko oa li-wrappers tse eketsang / tlosa likhang, empa ka kakaretso li-wrappers tsena li nka sebaka se ngata, ho sa tsotellehe hore ha e le hantle ke hloka feela li-wrappers tse fetang lekholo. Sena se le seng se utloisa bohloko haholo, empa ho ile ha e-ba le bothata bo tebileng haholoanyane: ka khoutu e hlahisitsoeng ea mesebetsi ea wrapper, likhang li ile tsa fetoloa 'me tsa fetoloa, empa ka linako tse ling mosebetsi o nang le likhang tse hlahisitsoeng o ne o sa bitsoa - hantle, joalo ka ho. ts'ebetsong ea ka ea libffi. Ke hore, bathusi ba bang ha baa ka ba bolaoa.

Ka lehlohonolo, Qemu e na le manane a baloang ke mochini a ba thusang ka sebopeho sa faele ea hlooho joalo ka

DEF_HELPER_0(lock, void)
DEF_HELPER_0(unlock, void)
DEF_HELPER_3(write_eflags, void, env, tl, i32)

Li sebelisoa ka mokhoa o qabolang: pele, li-macro li hlalosoa bocha ka tsela e makatsang ka ho fetesisa DEF_HELPER_n, ebe oa bulela helper.h. Ho isa tekanyong eo macro e atolosoang ka eona ho qala sebopeho le comma, ebe ho hlalosoa lethathamo, mme sebakeng sa likarolo - #include <helper.h> Ka lebaka leo, qetellong ke ile ka ba le monyetla oa ho leka laebrari mosebetsing pyparsing, 'me ho ngotsoe mongolo o hlahisang li-wrappers hantle bakeng sa mesebetsi eo li e hlokehang.

Kahoo, ka mor'a moo processor e ne e bonahala e sebetsa. Ho bonahala eka ke hobane skrini ha se so ka se qalisoa, leha memtest86 + e ile ea khona ho sebetsa kopanong ea lehae. Mona hoa hlokahala ho hlakisa hore khoutu ea Qemu block I / O e ngotsoe ka li-coroutines. Emscripten e na le ts'ebetsong ea eona e qhekellang, empa e ne e ntse e hloka ho tšehetsoa ka khoutu ea Qemu, 'me u ka khona ho lokisa processor hona joale: Qemu e tšehetsa likhetho. -kernel, -initrd, -append, eo ka eona u ka qalang Linux kapa, ka mohlala, memtest86 +, ntle le ho sebelisa lisebelisoa tsa thibela ho hang. Empa bothata ke bona: kopanong ea lehae motho o ne a ka bona tlhahiso ea Linux kernel ho console ka khetho -nographic, 'me ha ho tlhahiso ho tsoa ho sebatli ho ea ho terminal ho tloha moo e qalileng teng emrun, ha ea ka ea tla. Ke hore, ha ho hlake: processor ha e sebetse kapa tlhahiso ea litšoantšo ha e sebetse. Mme yaba ke nahana hore ke eme hanyane. Ho ile ha fumaneha hore "processor ha e robale, empa e panya butle butle," mme kamora metsotso e ka bang mehlano kernel e ile ea akhela letšoele la melaetsa ho khomphutha mme ea tsoela pele ho fanyeha. Ho ile ha hlaka hore processor, ka kakaretso, e sebetsa, 'me re hloka ho cheka khoutu ea ho sebetsa le SDL2. Ka bomalimabe, ha ke tsebe ho sebelisa laebrari ena, kahoo libakeng tse ling ke ne ke tlameha ho etsa lintho ka tšohanyetso. Ka nako e 'ngoe, mola oa parallel0 o ne o benya skrineng se ka morao ho boputsoa, ​​​​e neng e fana ka maikutlo a itseng. Qetellong, ho ile ha fumaneha hore bothata ke hore Qemu e bula lifensetere tse 'maloa ka fensetere e le' ngoe ea 'mele, eo u ka e fetolang u sebelisa Ctrl-Alt-n: e sebetsa mohahong oa matsoalloa, empa eseng ho Emscripten. Ka mor'a ho tlosa lifensetere tse sa hlokahaleng u sebelisa likhetho -monitor none -parallel none -serial none le litaelo tsa ho hula skrine kaofela ka matla foreiming ka 'ngoe, ntho e 'ngoe le e' ngoe e ile ea sebetsa ka tšohanyetso.

Li-Coroutines

Kahoo, ho etsisa sebatli ho sebetsa, empa u ke ke ua tsamaisa ntho leha e le efe e thahasellisang e le 'ngoe ho eona, hobane ha ho na block I / O - o hloka ho kenya ts'ehetso bakeng sa li-coroutines. Qemu e se e ntse e e-na le li-backend tse 'maloa tsa coroutine, empa ka lebaka la sebopeho sa JavaScript le jenereithara ea khoutu ea Emscripten, u ke ke ua qala ho kopanya mekotla. Ho ka bonahala eka "ntho e 'ngoe le e 'ngoe e felile, samente e ntse e tlosoa," empa baetsi ba Emscripten ba se ba ntse ba hlokometse ntho e' ngoe le e 'ngoe. Sena se kengoa tšebetsong se qabolang: ha re letse mohala oa ts'ebetso joalo ka o belaetsang emscripten_sleep le ba bang ba 'maloa ba sebelisang mochine oa Asyncify, hammoho le li-call tsa pointer le mehala ho ts'ebetso leha e le efe moo e' ngoe ea linyeoe tse peli tse fetileng e ka hlahang ho feta ho theosa le stack. 'Me joale, pele ho mohala o mong le o mong o belaetsang, re tla khetha moelelo oa async,' me hang ka mor'a mohala, re tla hlahloba hore na pitso e sa tloaelehang e etsahetse, 'me haeba e entse joalo, re tla boloka mefuta eohle ea libaka sebakeng sena sa async, re bontše hore na ke mosebetsi ofe. ho fetisetsa taolo ho nako eo re hlokang ho tsoela pele ka eona , le ho tsoa tšebetsong ea hajoale. Mona ke moo ho nang le sebaka sa ho ithuta phello ho senya - bakeng sa litlhoko tsa ts'ebetso ea khoutu e tsoelang pele ka mor'a ho khutla ho tsoa pitsong e sa tloaelehang, moqapi o hlahisa "stubs" ea ts'ebetso ho qala ka mor'a mohala o belaetsang - tjena: haeba ho na le mehala e belaetsang, joale mosebetsi o tla atolosoa kae-kae n/2 linako - sena se ntse se le joalo, haeba ho se joalo Hopola hore ka mor'a mohala o mong le o mong o ka 'nang oa e-ba asynchronous, u lokela ho eketsa ho boloka mefuta e meng ea sebaka mosebetsing oa pele. Kamora moo, ke ile ka ba ka tlameha ho ngola mongolo o bonolo ho Python, oo, ho ipapisitsoe le sehlopha se fanoeng sa mesebetsi e sebelisitsoeng haholo eo ho thoeng "ha e lumelle asynchrony hore e fete ka bobona" ​​(ke hore, papatso ea stack le tsohle tseo ke sa tsoa li hlalosa ha li. sebetsa ho tsona), e bonts'a mehala ka litsupa moo mesebetsi e lokelang ho hlokomolohuoa ke moqapi e le hore mesebetsi ena e se ke ea nkuoa e le ntho e sa lumellaneng. 'Me joale lifaele tsa JS tse ka tlase ho 60 MB li hlakile haholo - ha re re bonyane 30. Leha ho le joalo, hang ha ke ne ke theha sengoloa sa kopano, 'me ka phoso ka lahlela likhetho tsa li-linker, tseo har'a tsona ho neng ho e-na le eona. -O3. Ke tsamaisa khoutu e hlahisitsoeng, 'me Chromium e ja mohopolo le likotsi. Joale ka phoso ke ile ka sheba seo a neng a leka ho se khoasolla ... Hantle-ntle, nka re'ng, le 'na nka be ke ile ka hoama haeba ke ne ke kōptjoa ho ithuta ka mokhoa o nahanang le ho ntlafatsa Javascript ea 500+ MB.

Ka bomalimabe, licheke tse ho khoutu ea laeborari ea tšehetso ea Asyncify li ne li se na botsoalle ka botlalo longjmp- tse sebelisoang ho khoutu ea processor ea sebele, empa ka mor'a patch e nyenyane e thibelang licheke tsena le ho tsosolosa ka matla maemo joalokaha eka ntho e 'ngoe le e' ngoe e lokile, khoutu e sebetsa. 'Me joale ntho e makatsang e ile ea qala: ka linako tse ling ho ile ha qalisoa licheke ka har'a khoutu ea ho lumellana - tsona tse senyang khoutu haeba, ho latela mohopolo oa ts'ebetso, e lokela ho thibeloa - motho e mong o ile a leka ho tšoara mutex e seng e hapiloe. Ka lehlohonolo, sena se ile sa fetoha bothata bo utloahalang khoutung ea serialized - ke ne ke sebelisa ts'ebetso e tloaelehileng ea loop e fanoeng ke Emscripten, empa ka linako tse ling mohala oa asynchronous o ne o ka manolla stack ka botlalo, mme ka nako eo e ne e tla hloleha. setTimeout ho tloha ho loop e kholo - ka hona, khoutu e kene ka mokhoa o ka sehloohong oa loop ntle le ho siea iteration e fetileng. Ngola bocha ka loop e sa feleng le emscripten_sleep, 'me mathata a limumu a ile a emisa. Khoutu e se e ntse e utloahala le ho feta - ka mor'a tsohle, ha e le hantle, ha ke na khoutu e lokisang foreimi e latelang ea animation - processor e mpa e bala ho hong mme skrineng se ntlafatsoa nako le nako. Leha ho le joalo, mathata ha aa ka a fella moo: ka linako tse ling ho bolaoa ha Qemu ho ne ho fela ka khutso ntle le mekhelo kapa liphoso. Ka nako eo ke ile ka tela, empa, ha ke sheba pele, ke tla re bothata e ne e le bona: khoutu ea coroutine, ha e le hantle, ha e sebelise. setTimeout (kapa bonyane eseng hangata kamoo o ka nahanang): mosebetsi emscripten_yield e beha feela folakha ea mohala ea asynchronous. Taba eohle ke hore emscripten_coroutine_next ha se mosebetsi oa asynchronous: ka hare ho hlahloba folakha, ho e tsosolosa le ho fetisetsa taolo moo e hlokahalang. Ke hore, promotion of the stack e fella moo. Bothata e ne e le hore ka lebaka la ho sebelisa-kamora-mahala, e ileng ea hlaha ha letamo la coroutine le holofetse ka lebaka la hore ha kea ka ka kopitsa mohala oa bohlokoa oa khoutu ho tloha ho coroutine backend e teng, mosebetsi. qemu_in_coroutine e khutliselitsoe e le 'nete empa e ne e lokela ho khutla e le leshano. Sena se ile sa lebisa pitsong emscripten_yield, ka holim'a eona ho ne ho se na motho ka har'a stack emscripten_coroutine_next, qubu eo e ile ea phutholoha ho ea holimo haholo, empa che setTimeout, joalo ka ha ke se ke boletse, ha ea bontšoa.

Ho hlahisa khoutu ea JavaScript

'Me mona, ha e le hantle, ke "ho busetsa nama e halikiloeng" e tšepisitsoeng. E seng joalo hantle. Ha e le hantle, haeba re matha Qemu ho sebatli, le Node.js ho eona, joale, ka tlhaho, ka mor'a tlhahiso ea khoutu Qemu re tla fumana JavaScript e fosahetseng ka ho feletseng. Leha ho le joalo, ho na le mofuta o mong oa phetoho e fetohang.

Taba ea pele, ho se hokae ka hore na Qemu e sebetsa joang. Ke kopa o ntšoarele hang-hang: Ha ke setsebi sa Qemu 'me liqeto tsa ka li ka ba tse fosahetseng libakeng tse ling. Joalokaha ba re, "maikutlo a seithuti ha a tlameha ho lumellana le maikutlo a mosuoe, maikutlo a Peano a axiomatics le kelello e tloaelehileng." Qemu e na le palo e itseng ea meaho ea baeti e tšehelitsoeng mme bakeng sa e 'ngoe le e' ngoe ho na le bukana e joalo target-i386. Ha o haha, o ka hlakisa ts'ehetso bakeng sa meralo e mengata ea baeti, empa sephetho e tla ba li-binaries tse 'maloa feela. Khoutu ea ho ts'ehetsa moaho oa moeti, ka lehlakoreng le leng, e hlahisa ts'ebetso ea kahare ea Qemu, eo TCG (Tiny Code Generator) e seng e e fetola khoutu ea mochini bakeng sa meralo ea moamoheli. Joalokaha ho boletsoe faeleng ea readme e bukeng ea tcg, qalong ena e ne e le karolo ea motlatsi oa kamehla oa C, eo hamorao e ileng ea fetoloa bakeng sa JIT. Ka hona, mohlala, meralo e reretsoeng ho latela tokomane ena ha e sa le mohaho oa baeti, empa ke mohaho oa moeti. Ka nako e 'ngoe, ho ile ha hlaha karolo e' ngoe - Tiny Code Interpreter (TCI), e lokelang ho phethahatsa khoutu (hoo e batlang e le ts'ebetso e tšoanang ea ka hare) ha ho se na jenereithara ea khoutu bakeng sa mohaho o itseng oa moeti. Ha e le hantle, joalokaha litokomane tsa eona li bolela, mofetoleli enoa a ka 'na a se ke a sebetsa kamehla hammoho le jenereithara ea khoutu ea JIT, eseng feela ka bongata ka lebelo, empa hape le ka boleng. Le hoja ke sa tsebe hantle hore tlhaloso ea hae e nepahetse ka ho feletseng.

Qalong ke ile ka leka ho etsa TCG e feletseng, empa ka potlako ke ile ka ferekanngoa mohloling oa mohloli le tlhaloso e sa hlakang ka ho feletseng ea litaelo tsa bytecode, kahoo ke ile ka etsa qeto ea ho phuthela mofetoleli oa TCI. Sena se ile sa fana ka melemo e mengata:

  • ha o kenya ts'ebetsong ea jenereithara ea khoutu, u ne u ke ke ua sheba tlhaloso ea litaelo, empa ho khoutu ea mofetoleli
  • o ka hlahisa mesebetsi eseng bakeng sa boloko bo bong le bo bong ba phetolelo bo kopaneng, empa, mohlala, feela kamora ts'ebetso ea lekholo
  • haeba khoutu e hlahisoang e fetoha ('me sena se bonahala se ka khoneha, ho ahlola ka mesebetsi e nang le mabitso a nang le patch ea lentsoe), ke tla hloka ho hlakola khoutu ea JS e hlahisitsoeng, empa bonyane ke tla ba le ho hong ho e tsosolosa ho tloha.

Mabapi le ntlha ea boraro, ha ke na bonnete ba hore ho patching hoa khoneha kamora hore khoutu e phethoe ka lekhetlo la pele, empa lintlha tse peli tsa pele li lekane.

Qalong, khoutu e ne e hlahisoa ka mokhoa oa phetoho e kholo atereseng ea taelo ea pele ea bytecode, empa joale, ho hopola sehlooho se buang ka Emscripten, ho ntlafatsa JS e hlahisitsoeng le ho tsosolosa, ke ile ka etsa qeto ea ho hlahisa khoutu ea batho, haholo-holo kaha e ne e le matla. ho ile ha fumaneha hore sebaka se le seng feela sa ho kena ka har'a boloko ba phetolelo ke Qalo ea eona. Hang ka mor'a moo, ka mor'a nakoana re ne re e-na le jenereithara ea khoutu e hlahisang khoutu e nang le ifs (le hoja e se na loops). Empa ka bomalimabe, e ile ea soahlamana, ea fana ka molaetsa oa hore litaelo li ne li le bolelele bo fosahetseng. Ho feta moo, taelo ea ho qetela boemong bona ba ho khutlela morao e bile brcond. Ho lokile, ke tla eketsa cheke e ts'oanang ho moloko oa taelo ena pele le ka mor'a pitso e pheta-phetoang 'me ... ha ho le ea mong oa bona ea ileng a bolaoa, empa ka mor'a hore ho be le phetoho ea assert ba ntse ba hlōleha. Qetellong, ka mor'a ho ithuta khoutu e hlahisitsoeng, ke ile ka hlokomela hore ka mor'a ho fetola, pointer ea taelo ea hona joale e tsosolosoa ho tloha ho stack mme mohlomong e ngotsoe ka khoutu ea JavaScript e hlahisitsoeng. Mme ho ile ha fela ha eba jwalo. Ho eketsa buffer ho tloha ho megabyte e le 'ngoe ho isa ho leshome ha hoa ka ha lebisa ho letho,' me ho ile ha hlaka hore jenereithara ea khoutu e ntse e sebetsa ka selikalikoe. Re ile ra tlameha ho hlahloba hore na ha re fetele ka nģ’ane ho meeli ea lefuba la hona joale, ’me haeba re ile ra etsa joalo, joale re fane ka aterese ea TB e latelang ka letšoao la ho ntša mpa e le hore re ka tsoela pele ho bolaoa. Ntle le moo, sena se rarolla bothata "ke mesebetsi efe e hlahisitsoeng e lokelang ho se sebetse haeba karolo ee ea bytecode e fetohile?" - ke ts'ebetso feela e tsamaellanang le boloko bona ba phetolelo e hlokang ho se sebetse. Ka tsela, le hoja ke ile ka lokisa ntho e 'ngoe le e' ngoe ho Chromium (kaha ke sebelisa Firefox 'me ho bonolo hore ke sebelise sebatli se arohaneng bakeng sa liteko), Firefox e nthusitse ho lokisa ho se lumellane le maemo a asm.js, ka mor'a moo khoutu e qala ho sebetsa ka potlako ho Chromium.

Mohlala oa khoutu e hlahisitsoeng

Compiling 0x15b46d0:
CompiledTB[0x015b46d0] = function(stdlib, ffi, heap) {
"use asm";
var HEAP8 = new stdlib.Int8Array(heap);
var HEAP16 = new stdlib.Int16Array(heap);
var HEAP32 = new stdlib.Int32Array(heap);
var HEAPU8 = new stdlib.Uint8Array(heap);
var HEAPU16 = new stdlib.Uint16Array(heap);
var HEAPU32 = new stdlib.Uint32Array(heap);

var dynCall_iiiiiiiiiii = ffi.dynCall_iiiiiiiiiii;
var getTempRet0 = ffi.getTempRet0;
var badAlignment = ffi.badAlignment;
var _i64Add = ffi._i64Add;
var _i64Subtract = ffi._i64Subtract;
var Math_imul = ffi.Math_imul;
var _mul_unsigned_long_long = ffi._mul_unsigned_long_long;
var execute_if_compiled = ffi.execute_if_compiled;
var getThrew = ffi.getThrew;
var abort = ffi.abort;
var qemu_ld_ub = ffi.qemu_ld_ub;
var qemu_ld_leuw = ffi.qemu_ld_leuw;
var qemu_ld_leul = ffi.qemu_ld_leul;
var qemu_ld_beuw = ffi.qemu_ld_beuw;
var qemu_ld_beul = ffi.qemu_ld_beul;
var qemu_ld_beq = ffi.qemu_ld_beq;
var qemu_ld_leq = ffi.qemu_ld_leq;
var qemu_st_b = ffi.qemu_st_b;
var qemu_st_lew = ffi.qemu_st_lew;
var qemu_st_lel = ffi.qemu_st_lel;
var qemu_st_bew = ffi.qemu_st_bew;
var qemu_st_bel = ffi.qemu_st_bel;
var qemu_st_leq = ffi.qemu_st_leq;
var qemu_st_beq = ffi.qemu_st_beq;

function tb_fun(tb_ptr, env, sp_value, depth) {
  tb_ptr = tb_ptr|0;
  env = env|0;
  sp_value = sp_value|0;
  depth = depth|0;
  var u0 = 0, u1 = 0, u2 = 0, u3 = 0, result = 0;
  var r0 = 0, r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = 0, r7 = 0, r8 = 0, r9 = 0;
  var r10 = 0, r11 = 0, r12 = 0, r13 = 0, r14 = 0, r15 = 0, r16 = 0, r17 = 0, r18 = 0, r19 = 0;
  var r20 = 0, r21 = 0, r22 = 0, r23 = 0, r24 = 0, r25 = 0, r26 = 0, r27 = 0, r28 = 0, r29 = 0;
  var r30 = 0, r31 = 0, r41 = 0, r42 = 0, r43 = 0, r44 = 0;
    r14 = env|0;
    r15 = sp_value|0;
  START: do {
    r0 = HEAPU32[((r14 + (-4))|0) >> 2] | 0;
    r42 = 0;
    result = ((r0|0) != (r42|0))|0;
    HEAPU32[1445307] = r0;
    HEAPU32[1445321] = r14;
    if(result|0) {
    HEAPU32[1445322] = r15;
    return 0x0345bf93|0;
    }
    r0 = HEAPU32[((r14 + (16))|0) >> 2] | 0;
    r42 = 8;
    r0 = ((r0|0) - (r42|0))|0;
    HEAPU32[(r14 + (16)) >> 2] = r0;
    r1 = 8;
    HEAPU32[(r14 + (44)) >> 2] = r1;
    r1 = r0|0;
    HEAPU32[(r14 + (40)) >> 2] = r1;
    r42 = 4;
    r0 = ((r0|0) + (r42|0))|0;
    r2 = HEAPU32[((r14 + (24))|0) >> 2] | 0;
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    HEAPU32[1445309] = r2;
    HEAPU32[1445321] = r14;
    HEAPU32[1445322] = r15;
    qemu_st_lel(env|0, r0|0, r2|0, 34, 22759218);
if(getThrew() | 0) abort();
    r0 = 3241038392;
    HEAPU32[1445307] = r0;
    r0 = qemu_ld_leul(env|0, r0|0, 34, 22759233)|0;
if(getThrew() | 0) abort();
    HEAPU32[(r14 + (24)) >> 2] = r0;
    r1 = HEAPU32[((r14 + (12))|0) >> 2] | 0;
    r2 = HEAPU32[((r14 + (40))|0) >> 2] | 0;
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    HEAPU32[1445309] = r2;
    qemu_st_lel(env|0, r2|0, r1|0, 34, 22759265);
if(getThrew() | 0) abort();
    r0 = HEAPU32[((r14 + (24))|0) >> 2] | 0;
    HEAPU32[(r14 + (40)) >> 2] = r0;
    r1 = 24;
    HEAPU32[(r14 + (52)) >> 2] = r1;
    r42 = 0;
    result = ((r0|0) == (r42|0))|0;
    if(result|0) {
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    }
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    return execute_if_compiled(22759392|0, env|0, sp_value|0, depth|0) | 0;
    return execute_if_compiled(23164080|0, env|0, sp_value|0, depth|0) | 0;
    break;
  } while(1); abort(); return 0|0;
}
return {tb_fun: tb_fun};
}(window, CompilerFFI, Module.buffer)["tb_fun"]

fihlela qeto e

Kahoo, mosebetsi o ntse o e-s’o phethoe, empa ke khathetse ke ho tlisa kaho ena ea nako e telele ka sekhukhu phethehong. Ka hona, ke ile ka etsa qeto ea ho phatlalatsa seo ke nang le sona hajoale. Khoutu e tšosoa hanyenyane libakeng, hobane ena ke teko, 'me ha e hlake esale pele hore na ho hlokahala eng ho etsoa. Mohlomong, joale ho loketse ho fana ka boitlamo bo tloaelehileng ba athomo holim'a mofuta o mong oa sejoale-joale oa Qemu. Ho sa le joalo, ho na le khoele ho Gita ka sebopeho sa blog: bakeng sa "boemo" bo bong le bo bong bo fetisitsoeng ka tsela e itseng, tlhaloso e qaqileng ka Serussia e kentsoe. Ha e le hantle, sengoloa sena ke tlhaloso e kholo ea sephetho git log.

U ka e leka kaofela mona (hlokomela sephethephethe).

Se se se ntse se sebetsa:

  • x86 virtual processor e sebetsa
  • Ho na le mohlala o sebetsang oa jenereithara ea khoutu ea JIT ho tloha ho khoutu ea mochini ho ea ho JavaScript
  • Ho na le template ea ho bokella meralo e meng ea meralo ea baeti ba 32-bit: hajoale o ka khahloa ke Linux bakeng sa meralo ea MIPS e batang ka har'a sebatli sethaleng sa ho jarolla.

Ke eng hape eo u ka e etsang

  • Potlakisa emulation. Leha e le ka mokhoa oa JIT e bonahala e sebetsa butle ho feta Virtual x86 (empa ho na le monyetla oa hore ho na le Qemu eohle e nang le lisebelisoa tse ngata tse etsisitsoeng le meaho)
  • Ho etsa sebopeho se tloaelehileng - ka 'nete, ha ke moqapi ea hloahloa oa webo, kahoo hajoale ke entse khetla e tloaelehileng ea Emscripten kamoo nka khonang.
  • Leka ho qala mesebetsi e rarahaneng ea Qemu - marang-rang, ho falla ha VM, joalo-joalo.
  • UPD: o tla hloka ho fana ka lintlafatso tsa hau tse 'maloa le litlaleho tsa liphoso ho Emscripten holimo, joalo ka ha bo-porters ba Qemu le merero e meng ba entse. Ke leboha bona ka ho khona ho sebelisa tlatsetso ea bona ho Emscripten e le karolo ea mosebetsi oa ka.

Source: www.habr.com

Eketsa ka tlhaloso