QEMU.js: tam sim no hnyav thiab nrog WASM

Muaj ib zaug kuv txiav txim siab rau kev lom zem ua pov thawj qhov thim rov qab ntawm cov txheej txheem thiab kawm yuav ua li cas los tsim JavaScript (ntau dua, Asm.js) los ntawm tshuab code. QEMU tau raug xaiv rau qhov kev sim, thiab qee lub sijhawm tom qab ntawd ib tsab xov xwm tau sau rau ntawm Habr. Hauv cov lus kuv tau qhia kom rov ua qhov project hauv WebAssembly, thiab txawm tawm ntawm kuv tus kheej yuav luag tag Kuv tsis xav tau qhov project ... Txoj haujlwm tau mus, tab sis maj mam, thiab tam sim no, tsis ntev los no hauv tsab xov xwm tau tshwm sim tawm tswv yim ntawm lub ntsiab lus "Yog li cas nws tag nrho xaus?" Hauv kev teb rau kuv cov lus teb ntxaws, Kuv hnov ​​​​"Qhov no suab zoo li ib tsab xov xwm." Zoo, yog tias koj ua tau, yuav muaj ib tsab xov xwm. Tej zaum ib tug neeg yuav pom tias muaj txiaj ntsig. Los ntawm nws tus nyeem ntawv yuav kawm qee qhov tseeb txog kev tsim ntawm QEMU code tiam backends, nrog rau yuav ua li cas sau Just-in-Time compiler rau lub vev xaib thov.

paub tab

Txij li thaum kuv twb tau kawm yuav ua li cas rau "yuav ua li cas" chaw nres nkoj QEMU rau JavaScript, lub sijhawm no nws tau txiav txim siab ua kom zoo thiab tsis rov ua yuam kev qub.

Qhov yuam kev thib ib: ceg los ntawm kev tso tawm

Kuv thawj zaug yuam kev yog fork kuv version ntawm upstream version 2.4.1. Tom qab ntawd nws zoo li kuv lub tswv yim zoo: yog tias muaj qhov taw qhia tso tawm, ces nws yog qhov ruaj khov dua li qhov yooj yim 2.4, thiab ntau dua li cov ceg. master. Thiab txij li thaum kuv npaj yuav ntxiv qhov ncaj ncees ntawm kuv tus kheej kab, kuv tsis xav tau lwm tus li. Qhov ntawd yog tej zaum nws tig tawm li cas. Tab sis ntawm no yog qhov: QEMU tsis nyob twj ywm, thiab nyob rau qee lub sijhawm lawv txawm tshaj tawm kev ua kom zoo ntawm cov lej tsim los ntawm 10 feem pua. "Yog lawm, tam sim no kuv yuav khov," Kuv xav thiab tawg. Ntawm no peb yuav tsum ua kom muaj kev tsis sib haum xeeb: vim yog qhov xwm txheej ib leeg ntawm QEMU.js thiab qhov tseeb tias thawj QEMU tsis txhais tau tias tsis muaj ntau txoj xov (uas yog, muaj peev xwm ua haujlwm ib txhij ua ntau txoj hauv kev tsis sib xws, thiab tsis yog "siv tag nrho cov kernels") yog qhov tseem ceeb rau nws, lub luag haujlwm tseem ceeb ntawm cov xov kuv yuav tsum "tig nws" kom tuaj yeem hu los ntawm sab nraud. Qhov no tsim qee qhov teeb meem ntuj thaum lub sijhawm sib koom ua ke. Txawm li cas los xij, qhov tseeb tias qee qhov kev hloov pauv ntawm ceg master, nrog rau qhov uas kuv tau sim ua ke kuv cov cai, kuj cherry khaws nyob rau hauv lub ntsiab lus tso tawm (thiab yog li ntawd nyob rau hauv kuv ceg) kuj tej zaum yuav tsis muaj ntxiv yooj yim.

Feem ntau, kuv txiav txim siab tias nws tseem ua rau kev txiav txim siab pov tawm cov qauv, disassemble nws rau qhov chaw thiab tsim ib qho tshiab los ntawm kos raws li ib yam dab tsi tshiab thiab tam sim no los ntawm master.

Qhov yuam kev thib ob: TLP txheej txheem

Hauv qhov tseeb, qhov no tsis yog qhov yuam kev, feem ntau, nws tsuas yog ib qho ntawm kev tsim ib qhov project nyob rau hauv cov xwm txheej ntawm kev nkag siab tsis meej ntawm ob qho tib si "qhov twg thiab yuav tsiv mus li cas?" thiab feem ntau "peb puas tuaj yeem mus txog?" Hauv cov xwm txheej no programming tsis zoo yog qhov kev xaiv tsim nyog, tab sis, qhov tseeb, kuv tsis xav rov ua nws yam tsis tsim nyog. Lub sijhawm no kuv xav ua kom muaj kev txawj ntse: atomic commits, nco qab code hloov (thiab tsis yog "stringing random cim ua ke kom txog thaum nws compiles (nrog ceeb toom)", li Linus Torvalds ib zaug hais txog ib tug neeg, raws li Wikiquote), thiab lwm yam.

Qhov yuam kev thib peb: nkag mus rau hauv dej yam tsis paub ford

Kuv tseem tsis tau tshem tag nrho qhov no, tab sis tam sim no kuv tau txiav txim siab tsis ua raws li txoj kev ntawm kev tawm tsam tsawg kawg nkaus, thiab ua nws "raws li ib tug neeg laus," uas yog, sau kuv TCG backend los ntawm kos, thiaj li tsis yuav tsum tau hais tom qab, "Yog lawm, qhov no yog qhov tseeb, maj mam, tab sis kuv tswj tsis tau txhua yam - yog li TCI tau sau ... " Ntxiv mus, qhov no pib zoo li ib qho kev daws teeb meem, txij li thaum Kuv tsim binary code. Raws li lawv hais, "Ghent tau sauу, tab sis tsis yog ib qho ": cov cai yog, ntawm chav kawm, binary, tab sis kev tswj tsis tuaj yeem hloov mus rau nws yooj yim - nws yuav tsum raug thawb rau hauv qhov browser kom muab tso ua ke, ua rau muaj qee yam khoom los ntawm JS ntiaj teb, uas tseem xav tau. tau txais kev cawmdim nyob qhov twg. Txawm li cas los xij, ntawm RISC architectures ib txwm muaj, raws li kuv nkag siab, qhov xwm txheej zoo ib yam yog qhov yuav tsum tau rov pib dua cov lus qhia cache rau kev tsim kho dua tshiab - yog tias qhov no tsis yog qhov peb xav tau, ces, txawm li cas los xij, nws nyob ze. Tsis tas li ntawd, los ntawm kuv qhov kev sim zaum kawg, kuv tau kawm tias kev tswj xyuas tsis zoo li hloov mus rau nruab nrab ntawm kev txhais lus thaiv, yog li peb tsis xav tau bytecode txhais los ntawm ib qho offset, thiab peb tuaj yeem tsim nws los ntawm kev ua haujlwm ntawm TB. .

Lawv tuaj ncaws

Txawm hais tias kuv tau pib sau cov lej rov qab rau lub Xya Hli, qhov kev ncaws pob khawv koob ua rau tsis pom zoo: feem ntau cov ntawv los ntawm GitHub tuaj txog raws li kev ceeb toom txog cov lus teb rau Cov Teeb Meem thiab rub cov lus thov, tab sis ntawm no, mam li nco dheev hais hauv xov Binaryen raws li qemu backend hauv cov ntsiab lus, "Nws ua ib yam dab tsi zoo li ntawd, tej zaum nws yuav hais ib yam dab tsi." Peb tab tom tham txog kev siv Emscripten lub tsev qiv ntawv ntsig txog Binaryen los tsim WASM JIT. Zoo, kuv tau hais tias koj muaj Apache 2.0 daim ntawv tso cai nyob ntawd, thiab QEMU tag nrho yog faib raws li GPLv2, thiab lawv tsis sib xws heev. Dheev nws tig tawm tias daim ntawv tso cai tuaj yeem ua tau kho nws li cas (Kuv tsis paub: tej zaum hloov nws, tej zaum ob daim ntawv tso cai, tej zaum lwm yam ...). Qhov no, ntawm chav kawm, ua rau kuv zoo siab, vim hais tias los ntawm lub sij hawm ntawd kuv twb ntsia ze rau hom ntawv binary WebAssembly, thiab kuv tau tu siab thiab tsis nkag siab. Kuj tseem muaj lub tsev qiv ntawv uas yuav cuam tshuam cov blocks yooj yim nrog cov duab hloov pauv, tsim cov bytecode, thiab txawm khiav hauv tus neeg txhais lus nws tus kheej, yog tias tsim nyog.

Tom qab ntawd muaj ntau dua tsab ntawv ntawm QEMU daim ntawv xa ntawv, tab sis qhov no yog ntau ntxiv txog cov lus nug, "Leej twg xav tau nws?" Thiab nws, mam li nco dheev, nws muab tawm nws yog tsim nyog. Qhov tsawg kawg nkaus, koj tuaj yeem sib sau ua ke cov kev siv tau hauv qab no, yog tias nws ua haujlwm ntau dua lossis tsawg dua:

  • launching ib yam dab tsi kev kawm yam tsis muaj installation txhua
  • virtualization ntawm iOS no, qhov twg, raws li cov lus xaiv, tsuas yog daim ntawv thov uas muaj cai rau code tiam ya yog JS cav (qhov no puas muaj tseeb?)
  • ua qauv qhia ntawm mini-OS - ib leeg-floppy, built-in, txhua yam firmware, thiab lwm yam ...

Browser Runtime Features

Raws li kuv twb tau hais lawm, QEMU yog khi rau multithreading, tab sis qhov browser tsis muaj nws. Zoo, uas yog, tsis yog ... Thaum xub thawj nws tsis muaj nyob rau hauv tag nrho, ces WebWorkers tshwm - raws li kuv nkag siab, qhov no yog multithreading raws li cov lus hla tsis muaj kev sib koom sib txawv. Lawm, qhov no tsim teeb meem loj thaum porting code uas twb muaj lawm raws li kev sib koom ua qauv nco. Tom qab ntawd, nyob rau hauv cov pej xeem siab, nws kuj tau ua raws li lub npe SharedArrayBuffers. Nws tau maj mam qhia, lawv ua kev zoo siab rau nws lub community launch nyob rau hauv txawv browsers, ces lawv ua kev zoo siab rau lub Xyoo Tshiab, thiab ces Meltdown ... Tom qab ntawd lawv tuaj mus rau lub xaus hais tias ntxhib los yog ntxhib lub sij hawm ntsuas, tab sis nrog kev pab los ntawm kev sib koom nco thiab ib tug. xov incrementing lub txee, nws yog tib yam nws yuav ua haujlwm tawm zoo nkauj heev. Yog li ntawd, peb disabled multithreading nrog sib koom nco. Nws zoo nkaus li tias lawv tom qab muab nws rov qab, tab sis, raws li nws tau pom tseeb los ntawm thawj qhov kev sim, muaj lub neej tsis muaj nws, thiab yog tias muaj, peb yuav sim ua nws yam tsis muaj kev vam khom ntau.

Qhov thib ob feature yog qhov impossibility ntawm qis-theem manipulations nrog pawg: koj tsis tuaj yeem nqa, txuag cov ntsiab lus tam sim no thiab hloov mus rau ib qho tshiab nrog pawg tshiab. Cov pawg hu yog tswj hwm los ntawm JS virtual tshuab. Nws yuav zoo li, qhov teeb meem yog dab tsi, txij li thaum peb tseem txiav txim siab los tswj cov qub ntws tag manually? Qhov tseeb yog qhov thaiv I / O hauv QEMU yog siv los ntawm coroutines, thiab qhov no yog qhov uas cov pawg qis qis yuav los ua ke. Hmoov zoo, Emscipten twb muaj cov txheej txheem rau kev ua haujlwm asynchronous, txawm tias ob: Asyncify и Tus neeg txhais lus. Thawj qhov ua haujlwm dhau los ntawm qhov tseem ceeb hauv qhov tsim JavaScript code thiab tsis muaj kev txhawb nqa ntxiv lawm. Qhov thib ob yog tam sim no "txoj kev raug" thiab ua haujlwm los ntawm kev tsim bytecode rau tus neeg txhais lus ib txwm. Nws ua haujlwm, ntawm chav kawm, maj mam, tab sis nws tsis bloat lub chaws. Muaj tseeb, kev txhawb nqa rau coroutines rau cov txheej txheem no yuav tsum tau pab txhawb rau nws tus kheej (twb twb tau sau coroutines rau Asyncify thiab muaj kev siv kwv yees li tib API rau Emterpreter, koj tsuas yog xav tau txuas rau lawv).

Lub sijhawm tam sim no, kuv tseem tsis tau tswj hwm los faib cov cai rau hauv ib qho muab tso ua ke hauv WASM thiab txhais siv Emterpreter, yog li thaiv cov khoom siv tseem tsis tau ua haujlwm (saib hauv kab tom ntej, raws li lawv hais ...). Ntawd yog, thaum kawg koj yuav tsum tau txais ib yam dab tsi zoo li no funny txheej:

  • txhais block I/O. Zoo, koj puas tau xav tias emulated NVMe nrog kev ua haujlwm ib txwm? 🙂
  • statically compiled lub ntsiab QEMU code (tus neeg txhais lus, lwm yam khoom siv emulated, thiab lwm yam)
  • dynamically compiled qhua code rau hauv WASM

Cov yam ntxwv ntawm QEMU qhov chaw

Raws li koj tej zaum twb tau twv, cov cai rau emulating qhua architectures thiab cov cai rau generating host cov lus qhia raug cais nyob rau hauv QEMU. Qhov tseeb, nws tseem yog me ntsis trickier:

  • muaj qhua architectures
  • yog accelerators, uas yog, KVM rau kho vajtse virtualization ntawm Linux (rau cov qhua thiab cov tswv tsev sib haum nrog ib leeg), TCG rau JIT code tiam nyob qhov twg. Pib nrog QEMU 2.9, kev txhawb nqa rau HAXM hardware virtualization tus qauv ntawm Windows tshwm sim (cov ntsiab lus)
  • Yog tias TCG siv thiab tsis yog kho vajtse virtualization, ces nws muaj cais cov cim tsim kev txhawb nqa rau txhua tus tswv tsev architecture, nrog rau cov neeg txhais lus thoob ntiaj teb.
  • ... thiab nyob ib ncig ntawm tag nrho cov no - emulated peripherals, neeg siv interface, migration, record-replay, thiab lwm yam.

Los ntawm txoj kev, koj puas paub: QEMU tuaj yeem ua raws li tsis yog tag nrho lub khoos phis tawj nkaus xwb, tab sis kuj tseem yog lub processor rau cov txheej txheem sib cais ntawm cov neeg siv khoom hauv lub party kernel, uas yog siv, piv txwv li, los ntawm AFL fuzzer rau binary instrumentation. Tej zaum ib tug neeg xav port hom kev ua haujlwm ntawm QEMU rau JS? 😉

Zoo li feem ntau cov software pub dawb ntev ntev, QEMU yog tsim los ntawm kev hu configure и make. Cia peb hais tias koj txiav txim siab ntxiv ib yam dab tsi: TCG backend, xov siv, lwm yam. Tsis txhob maj kom zoo siab / txaus ntshai (saib hauv qab raws li qhov tsim nyog) ntawm qhov kev cia siab ntawm kev sib txuas lus nrog Autoconf - qhov tseeb, configure QEMU's pom tau tias nws tus kheej sau thiab tsis yog tsim los ntawm dab tsi.

WebAssembly

Yog li cas qhov no hu ua WebAssembly (aka WASM)? Qhov no yog qhov hloov pauv rau Asm.js, tsis ua piv txwv li JavaScript code siv tau lawm. Ntawm qhov tsis sib xws, nws yog binary nkaus xwb thiab optimized, thiab txawm tias tsuas yog sau tus lej rau hauv nws tsis yooj yim heev: rau compactness, nws yog khaws cia rau hauv hom. LIB 128.

Tej zaum koj yuav tau hnov ​​​​txog qhov kev rov qab algorithm rau Asm.js - qhov no yog kev kho dua tshiab ntawm "siab-theem" ​​cov lus qhia ntws tswj (uas yog, yog tias-tom qab ntawd-lwm, loops, thiab lwm yam), uas JS cov cav tsim tau tsim, los ntawm qib qis LLVM IR, ze rau lub tshuab code ua tiav los ntawm lub processor. Lawm, qhov nruab nrab sawv cev ntawm QEMU yog ze rau qhov thib ob. Nws yuav zoo li ntawm no nws yog, bytecode, qhov kawg ntawm kev tsim txom ... Thiab tom qab ntawd muaj cov blocks, yog tias-tom qab-lwm thiab loops!..

Thiab qhov no yog lwm qhov laj thawj vim li cas Binaryen thiaj li muaj txiaj ntsig: nws tuaj yeem lees txais cov qib siab nyob ze rau qhov yuav khaws cia hauv WASM. Tab sis nws tseem tuaj yeem tsim cov cai los ntawm cov duab ntawm cov blocks yooj yim thiab kev hloov pauv ntawm lawv. Zoo, kuv twb tau hais tias nws zais WebAssembly cia hom ntawv tom qab qhov yooj yim C / C ++ API.

TCG (Tiny Code Generator)

GTC yog Ameslikas backend rau C compiler, tom qab ntawd, pom meej, nws tsis tuaj yeem tiv thaiv kev sib tw nrog GCC, tab sis thaum kawg nws pom nws qhov chaw hauv QEMU raws li kev tsim cov txheej txheem rau lub party platform. Kuj tseem muaj TCG backend uas tsim qee qhov kev paub tsis meej bytecode, uas yog tam sim ntawd los ntawm tus neeg txhais lus, tab sis kuv txiav txim siab kom tsis txhob siv lub sijhawm no. Txawm li cas los xij, qhov tseeb tias hauv QEMU nws twb muaj peev xwm ua kom muaj kev hloov pauv mus rau TB generated los ntawm kev ua haujlwm tcg_qemu_tb_exec, nws tuaj ua ke heev rau kuv.

Txhawm rau ntxiv TCG backend tshiab rau QEMU, koj yuav tsum tsim cov npe subdirectory tcg/<имя архитектуры> (hauv qhov no, tcg/binaryen), thiab nws muaj ob cov ntaub ntawv: tcg-target.h и tcg-target.inc.c и sau ntawv yuav tshuaj nws yog txhua yam hais txog configure. Koj tuaj yeem tso lwm cov ntaub ntawv rau ntawd, tab sis, raws li koj tuaj yeem kwv yees los ntawm cov npe ntawm ob qho no, lawv ob leeg yuav suav nrog qhov chaw: ib qho ua cov ntaub ntawv header tsis tu ncua (nws suav nrog hauv tcg/tcg.h, thiab tus ntawd twb nyob rau hauv lwm cov ntaub ntawv nyob rau hauv cov directory tcg, accel thiab tsis tsuas yog), lwm yam - tsuas yog raws li ib tug code snippet nyob rau hauv tcg/tcg.c, tab sis nws muaj kev nkag mus rau nws cov haujlwm zoo li qub.

Kev txiav txim siab tias kuv yuav siv sijhawm ntau dhau los ntawm kev tshawb xyuas ntxaws txog nws ua haujlwm li cas, kuv tsuas yog theej "skeletons" ntawm ob cov ntaub ntawv no los ntawm lwm qhov kev siv rov qab, qhia ncaj ncees rau qhov no hauv daim ntawv tso cai header.

cov ntaub ntawv tcg-target.h muaj feem ntau qhov chaw hauv daim ntawv #define-s:

  • Muaj pes tsawg tus neeg sau npe thiab dav npaum li cas nyob rau ntawm lub hom phiaj architecture (peb muaj ntau npaum li peb xav tau, ntau npaum li peb xav tau - cov lus nug yog ntau ntxiv txog dab tsi yuav raug tsim los rau hauv cov lej zoo dua los ntawm qhov browser ntawm "tag nrho lub hom phiaj" architecture ...)
  • Kev ua raws li tus tswv tsev cov lus qhia: ntawm x86, thiab txawm nyob rau hauv TCI, cov lus qhia tsis ua raws li tag nrho, tab sis kuv yuav muab tso rau hauv cov cai tsis yog cov lus qhia txhua, tab sis taw tes rau Binaryen cov tsev qiv ntawv, yog li kuv yuav hais: 4 bytes
  • dab tsi xaiv cov lus qhia lub backend tuaj yeem tsim tau - peb suav nrog txhua yam peb pom hauv Binaryen, cia tus accelerator tawg rau hauv qhov yooj yim dua nws tus kheej
  • Qhov kwv yees loj npaum li cas ntawm TLB cache thov los ntawm lub backend. Qhov tseeb yog tias hauv QEMU txhua yam yog qhov hnyav: txawm hais tias muaj cov haujlwm pabcuam uas ua haujlwm thauj khoom / khw muag khoom noj rau hauv tus account tus qhua MMU (qhov twg peb yuav tsis muaj tam sim no?), lawv khaws lawv cov ntaub ntawv txhais lus hauv cov qauv, kev ua ntawm uas yog yooj yim rau embed ncaj qha mus rau hauv broadcast blocks. Cov lus nug yog, dab tsi offset nyob rau hauv cov qauv no yog ua tau zoo tshaj plaws los ntawm ib tug me me thiab ceev ib theem zuj zus ntawm commands?
  • ntawm no koj tuaj yeem tweak lub hom phiaj ntawm ib lossis ob lub npe tshwj tseg, pab hu rau TB los ntawm kev ua haujlwm thiab xaiv tau piav qhia ob peb qhov me me inline- ua haujlwm zoo li flush_icache_range (tab sis qhov no tsis yog peb qhov teeb meem)

cov ntaub ntawv tcg-target.inc.c, tau kawg, feem ntau yog qhov loj dua qhov loj thiab muaj ntau yam haujlwm yuav tsum tau ua:

  • pib, suav nrog kev txwv ntawm cov lus qhia twg tuaj yeem ua haujlwm ntawm cov operands. Blatantly theej los ntawm kuv los ntawm lwm qhov backend
  • muaj nuj nqi uas siv ib qho kev qhia bytecode sab hauv
  • Koj tuaj yeem tso cov haujlwm pabcuam ntawm no, thiab koj tuaj yeem siv cov haujlwm zoo li qub los ntawm tcg/tcg.c

Rau kuv tus kheej, kuv xaiv lub tswv yim hauv qab no: hauv thawj cov lus ntawm qhov kev txhais lus tom ntej, kuv tau sau plaub lub ntsiab lus: lub cim pib (ib qho txiaj ntsig nyob ib puag ncig 0xFFFFFFFF, uas txiav txim siab txog lub xeev tam sim no ntawm TB), cov ntsiab lus, tsim qauv, thiab tus lej khawv koob rau kev debugging. Thaum xub thawj lub cim tau muab tso rau hauv 0xFFFFFFFF - nqhov twg n - tus lej zoo me me, thiab txhua zaus nws raug tua los ntawm tus neeg txhais lus nws nce 1. Thaum nws mus txog 0xFFFFFFFE, muab tso ua ke coj qhov chaw, lub module tau txais kev cawmdim nyob rau hauv lub rooj muaj nuj nqi, imported rau hauv ib tug me me "launcher", nyob rau hauv uas tua mus los ntawm tcg_qemu_tb_exec, thiab lub module raug tshem tawm ntawm QEMU nco.

Rau paraphrase classics, "Crutch, ntau npaum li cas yog intertwined nyob rau hauv no suab rau proger lub siab ...". Txawm li cas los xij, lub cim xeeb tau xau qhov chaw. Ntxiv mus, nws yog lub cim xeeb tswj los ntawm QEMU! Kuv muaj ib txoj cai uas, thaum sau cov lus qhia tom ntej (zoo, uas yog, tus taw tes), deleted tus uas nws txuas nyob rau hauv qhov chaw ua ntej, tab sis qhov no tsis pab. Qhov tseeb, hauv qhov yooj yim tshaj plaws, QEMU faib lub cim xeeb thaum pib thiab sau cov lej tsim muaj nyob ntawd. Thaum tus tsis tau khiav tawm, tus lej raug pov tseg thiab tus tom ntej pib sau rau hauv nws qhov chaw.

Tom qab kawm txog cov cai, kuv pom tau hais tias qhov ua kom yuam kev nrog tus lej khawv koob tso cai rau kuv kom tsis txhob poob ntawm kev puas tsuaj los ntawm kev tso ib yam dab tsi tsis ncaj ncees lawm ntawm qhov tsis pom zoo ntawm thawj zaug. Tab sis leej twg rewrites qhov tsis los hla kuv txoj haujlwm tom qab? Raws li Emscripten developers qhia, thaum kuv khiav mus rau hauv ib qho teeb meem, kuv ported lub resulting code rov qab mus rau lub haiv neeg daim ntawv thov, teem Mozilla Record-Replay rau nws... Feem ntau, thaum kawg kuv pom ib tug yooj yim tshaj plaws: rau txhua qhov thaiv, ib struct TranslationBlock nrog nws cov lus piav qhia. Kwv yees qhov twg ... Qhov ntawd yog, ua ntej lub thaiv txoj cai nyob rau hauv tsis. Paub txog qhov no, kuv tau txiav txim siab txiav tawm siv cov cuab yeej (tsawg kawg qee qhov), thiab tsuas yog pov tawm tus lej khawv koob, thiab xa cov lus ntxiv mus rau struct TranslationBlock, tsim ib daim ntawv txuas ib leeg uas tuaj yeem hla tau sai thaum cov ntaub ntawv txhais lus rov pib dua, thiab tso lub cim xeeb.

Qee cov crutches tseem nyob: piv txwv li, cov cim taw qhia hauv cov cai tsis-ib co ntawm lawv yog qhov yooj yim BinaryenExpressionRef, uas yog, lawv saib cov kab lus uas yuav tsum tau linearly muab tso rau hauv lub generated yooj yim block, ib feem yog tus mob rau kev hloov ntawm BBs, ib feem yog qhov twg mus. Zoo, twb tau npaj cov blocks rau Relooper uas yuav tsum tau txuas nrog raws li cov xwm txheej. Txhawm rau paub qhov txawv ntawm lawv, qhov kev xav tau siv tias lawv txhua tus tau ua raws li tsawg kawg yog plaub bytes, yog li koj tuaj yeem siv yam tsawg kawg nkaus ob lub cim rau daim ntawv lo, koj tsuas yog yuav tsum nco ntsoov tshem tawm yog tias tsim nyog. Los ntawm txoj kev, cov ntawv no twb tau siv nyob rau hauv QEMU los qhia qhov laj thawj ntawm kev tawm ntawm TCG voj.

Siv Binaryen

Modules hauv WebAssembly muaj cov haujlwm, txhua qhov muaj lub cev, uas yog qhov qhia. Cov lus qhia yog unary thiab binary ua haujlwm, blocks muaj cov npe ntawm lwm cov kab lus, tswj ntws, thiab lwm yam. Raws li kuv twb tau hais lawm, kev tswj kev khiav ntawm no yog tsim los ntawm cov ceg siab siab, lub voj voog, kev ua haujlwm hu, thiab lwm yam. Kev sib cav rau kev ua haujlwm tsis dhau ntawm pawg, tab sis qhia meej, ib yam li hauv JS. Kuj tseem muaj qhov hloov pauv thoob ntiaj teb, tab sis kuv tsis tau siv lawv, yog li kuv yuav tsis qhia koj txog lawv.

Cov haujlwm tseem muaj qhov sib txawv hauv zos, suav nrog xoom, hom: int32 / int64 / ntab / ob npaug. Hauv qhov no, thawj qhov sib txawv hauv zos yog cov lus sib cav dhau mus rau txoj haujlwm. Thov nco ntsoov tias txawm hais tias txhua yam ntawm no tsis yog theem qis ntawm kev tswj hwm, cov lej tseem tsis muaj qhov "kos npe / tsis kos npe" tus cwj pwm: tus lej coj li cas nyob ntawm txoj haujlwm ua haujlwm.

Feem ntau hais lus, Binaryen muab yooj yim C-API: koj tsim ib tug module, hauv nws tsim cov kab lus - unary, binary, blocks los ntawm lwm cov kab lus, tswj ntws, thiab lwm yam. Tom qab ntawd koj tsim ib qho haujlwm nrog kev qhia raws li nws lub cev. Yog tias koj, zoo li kuv, muaj cov duab hloov pauv qis, cov khoom siv rov qab yuav pab koj. Raws li kuv nkag siab, nws muaj peev xwm siv kev tswj hwm qib siab ntawm kev ua tiav hauv qhov thaiv, tsuav yog tias nws tsis mus dhau ntawm thaj tsam ntawm qhov thaiv - uas yog, nws tuaj yeem ua rau sab hauv txoj kev nrawm / qeeb. txoj kev branching nyob rau hauv lub built-in TLB cache ua code, tab sis tsis txhob cuam tshuam nrog "sab nraud" tswj ntws . Thaum koj tso lub relooper, nws cov blocks raug tso tawm; thaum koj tso ib lub module, cov kab lus, kev ua haujlwm, thiab lwm yam. muab faib rau nws ploj. chaw ua si.

Txawm li cas los xij, yog tias koj xav txhais cov cai ntawm ya yam tsis tsim nyog tsim thiab tshem tawm ntawm tus neeg txhais lus piv txwv, nws yuav ua rau muaj kev nkag siab zoo rau muab cov logic no rau hauv C ++ cov ntaub ntawv, thiab los ntawm qhov ntawd ncaj qha tswj tag nrho C ++ API ntawm lub tsev qiv ntawv, hla kev npaj- ua wrappers.

Yog li tsim cov cai koj xav tau

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

... yog tias kuv tsis nco qab dab tsi, thov txim, qhov no tsuas yog los sawv cev rau qhov teev, thiab cov ntsiab lus muaj nyob rau hauv cov ntaub ntawv.

Thiab tam sim no qhov tawg-fex-pex pib, qee yam zoo li no:

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

Txhawm rau qee qhov txuas lub ntiaj teb ntawm QEMU thiab JS thiab tib lub sijhawm nkag mus rau cov haujlwm tau muab tso ua ke sai sai, ib qho array tau tsim (ib lub rooj ua haujlwm rau kev xa mus rau hauv lub launcher), thiab cov haujlwm tsim tau muab tso rau ntawd. Txhawm rau xam qhov ntsuas tau sai, qhov ntsuas ntawm xoom lo lus txhais block tau pib siv raws li nws, tab sis tom qab ntawd qhov ntsuas tau suav nrog cov qauv no pib yooj yim haum rau hauv daim teb hauv struct TranslationBlock.

Los ntawm txoj kev, demo (Tam sim no nrog daim ntawv tso cai murky) tsuas yog ua haujlwm zoo hauv Firefox. Chrome developers yog cas tsis npaj rau qhov tseeb tias ib tus neeg xav tsim ntau dua ib txhiab qhov ntawm WebAssembly modules, yog li lawv tsuas faib ib gigabyte ntawm qhov chaw nyob virtual rau txhua qhov ...

Qhov ntawd yog tag nrho rau tam sim no. Tej zaum yuav muaj lwm tsab xov xwm yog tias leej twg txaus siab. Namely, muaj tsawg kawg yog xwb ua kom thaiv cov cuab yeej ua haujlwm. Nws kuj tseem yuav ua rau muaj kev nkag siab zoo los ua kom muab tso ua ke ntawm WebAssembly modules asynchronous, raws li kev cai hauv JS ntiaj teb, vim tias tseem muaj tus neeg txhais lus uas tuaj yeem ua txhua yam no kom txog rau thaum lub hom phiaj npaj txhij.

Thaum kawg ib riddle: koj tau muab tso ua ke binary ntawm 32-ntsis architecture, tab sis cov cai, los ntawm kev ua haujlwm nco, nce los ntawm Binaryen, qhov chaw ntawm pawg, lossis lwm qhov nyob rau sab saud 2 GB ntawm qhov chaw nyob 32-ntsis. Qhov teeb meem yog tias los ntawm Binaryen qhov kev xav no yog nkag mus rau qhov chaw nyob loj heev. Yuav ua li cas mus ncig qhov no?

Hauv admin txoj kev

Kuv tsis tas sim qhov no, tab sis kuv thawj qhov kev xav yog "Yuav ua li cas yog tias kuv nruab 32-ntsis Linux?" Tom qab ntawd lub sab sauv ntawm qhov chaw nyob yuav nyob ntawm lub kernel. Cov lus nug tsuas yog ntau npaum li cas yuav nyob: 1 lossis 2 Gb.

Nyob rau hauv ib tug programmer txoj kev (xaiv rau practitioners)

Cia peb tshuab npuas rau saum qhov chaw nyob. Kuv tus kheej tsis nkag siab vim li cas nws ua haujlwm - nyob ntawd twb yuav tsum muaj ib pawg. Tab sis "peb yog cov kws tshaj lij: txhua yam ua haujlwm rau peb, tab sis tsis muaj leej twg paub vim li cas ... "

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

... Nws yog qhov tseeb tias nws tsis sib haum nrog Valgrind, tab sis, hmoov zoo, Valgrind nws tus kheej zoo heev thawb txhua tus tawm ntawm qhov ntawd :)

Tej zaum ib tug neeg yuav muab qhov kev piav qhia zoo dua ntawm txoj cai no ntawm kuv txoj haujlwm ...

Tau qhov twg los: www.hab.com

Ntxiv ib saib