æ°å¹Žå ãã¡ããªã¹ã»ãã©ãŒã«
- ãªãŒãã³ãœãŒã¹
- ã«ãŒãã«ãã©ã€ããŒãªãã§åäœããæ©èœ
- éèš³ã¢ãŒãã§äœæ¥ããæ©èœ
- å€æ°ã®ãã¹ããšã²ã¹ãã®äž¡æ¹ã®ã¢ãŒããã¯ãã£ããµããŒã
XNUMX çªç®ã®ç¹ã«ã€ããŠã¯ãå®éãTCI ã¢ãŒãã§ã¯è§£éãããã®ã¯ã²ã¹ã ãã·ã³åœä»€èªäœã§ã¯ãªããã²ã¹ã ãã·ã³åœä»€ããååŸããããã€ãã³ãŒãã§ããããšã説æã§ããŸãããããã¯æ¬è³ªãå€æŽããŸããããã«ãããŠå®è¡ããããã§ããæ°ããã¢ãŒããã¯ãã£äžã® Qemu ã¯ãéãè¯ããã° C ã³ã³ãã€ã©ã§ååã§ããã³ãŒã ãžã§ãã¬ãŒã¿ãŒã®äœæã¯åŸåãã«ããããšãã§ããŸãã
ãããŠä»ãèªç±æéã« Qemu ã®ãœãŒã¹ ã³ãŒãã XNUMX 幎éãã£ãããããç¶ããçµæãåäœãããããã¿ã€ããçŸããŸããããã®ãããã¿ã€ãã§ã¯ããã§ã« Kolibri OS ãªã©ãå®è¡ã§ããŸãã
ãšã ã¹ã¯ãªããã³ãšã¯
çŸåšã§ã¯ãå€ãã®ã³ã³ãã€ã©ãŒãç»å Žãããã®æçµçµæã JavaScript ã§ãã Type Script ãªã©ã®äžéšã®ãã®ã¯ãããšããš Web çšã«èšè¿°ããããã®æè¯ã®æ¹æ³ã§ããããšãæå³ããŠããŸããã åæã«ãEmscripten ã¯æ¢åã® C ãŸã㯠C++ ã³ãŒããååŸãããã©ãŠã¶ãŒã§èªã¿åãå¯èœãªåœ¢åŒã«ã³ã³ãã€ã«ããæ¹æ³ã§ãã ã®äž
æåã«è©Šã
äžè¬çã«èšã£ãŠãQemu ã JavaScript ã«ç§»æ€ãããšããã¢ã€ãã¢ãæãã€ããã®ã¯ç§ãæåã§ã¯ãããŸããã ReactOS ãã©ãŒã©ã ã§ãEmscripten ã䜿çšããŠãããå¯èœãã©ãããšãã質åããããŸããã 以åã«ãããã¡ããªã¹ ãã©ãŒã«ããããå人çã«è¡ã£ããšããåããããŸããããç§ãã¡ã話ããŠããã®ã¯ jslinux ã«ã€ããŠã§ãããç§ã®ç¥ãéãããã㯠JS ã§ååãªããã©ãŒãã³ã¹ãæåã§éæããè©Šã¿ã«ãããããŒãããæžããããã®ã§ãã ãã®åŸãVirtual x86 ãäœæãããé£èªåãããŠããªããœãŒã¹ãæçš¿ãããåè¿°ããããã«ããšãã¥ã¬ãŒã·ã§ã³ã®ãçŸå®æ§ããåäžãããããSeaBIOS ããã¡ãŒã ãŠã§ã¢ãšããŠäœ¿çšã§ããããã«ãªããŸããã ããã«ãEmscripten ã䜿çšã㊠Qemu ã移æ€ããè©Šã¿ãå°ãªããšã XNUMX åãããŸãã - ç§ã¯ãããè©Šã¿ãŸãã
ã€ãŸããããã«ãœãŒã¹ããããããã« Emscripten ãããããã«èŠããŸãããããååŸããŠã³ã³ãã€ã«ããŸãã ãã ããQemu ãäŸåããã©ã€ãã©ãªãããããã®ã©ã€ãã©ãªãäŸåããã©ã€ãã©ãªãªã©ãããããã®ãã¡ã® XNUMX ã€ã¯æ¬¡ã®ãšããã§ãã
åœå㯠libffi ã®çœ®ãæãã JS ã§äœæããŠæšæºãã¹ããå®è¡ãããšããã¢ã€ãã¢ããããŸããããæçµçã«ã¯æ¢åã®ã³ãŒãã§åäœããããã«ããã㌠ãã¡ã€ã«ãäœæããæ¹æ³ã«ã€ããŠæ··ä¹±ããŸãããã©ãããã°ããã§ããããã圌ãã¯èšãããã«ããã¿ã¹ã¯ã¯ããã»ã©è€éã§ããïŒç§ãã¡ã¯ãããªã«æãã§ããïŒã ããã°ãlibffi ãå¥ã®ã¢ãŒããã¯ãã£ã«ç§»æ€ããå¿
èŠããããŸããã幞ããªããšã«ãEmscripten ã«ã¯ãã€ã³ã©ã€ã³ ã¢ã»ã³ã㪠(JavaScript ã®å Žåãããã§ãããã¢ãŒããã¯ãã£ãäœã§ãããã¢ã»ã³ãã©) çšã®ãã¯ããšããªã³ã¶ãã©ã€ã§çæãããã³ãŒããå®è¡ããæ©èœã®äž¡æ¹ãåãã£ãŠããŸãã äžè¬ã«ããã©ãããã©ãŒã ã«äŸåãã libffi ãã©ã°ã¡ã³ãããã°ããããã£ãåŸãã³ã³ãã€ã«å¯èœãªã³ãŒããååŸããæåã«èŠã€ãããã¹ãã§ãããå®è¡ããŸããã é©ããããšã«ããã¹ãã¯æåããŸããã èªåã®å€©ææ§ã«åç¶ãšããŸãã - åè«ã§ã¯ãªããæåã®èµ·åããæ©èœããŸãã - ç§ã¯ãŸã èªåã®ç®ãä¿¡ãããçµæãšããŠåŸãããã³ãŒããããäžåºŠèŠãŠã次ã«ã©ããæãã¹ãããè©äŸ¡ããŸããã ããã§ç§ã¯äºåºŠç®ã«æ°ãçããŸãã - ç§ã®é¢æ°ããã£ãããšã¯ãã äžã€ ffi_call
- ããã¯åŒã³åºããæåããããšãå ±åããŸããã é»è©±èªäœã¯ãããŸããã§ããã ããã§ç§ã¯æåã®ãã« ãªã¯ãšã¹ããéä¿¡ããŸãããããã«ããããªãªã³ããã¯ã®åŠçãªã誰ã§ãæãããªãã¹ãã®ãšã©ãŒãä¿®æ£ãããŸãããå®æ°ã¯æ¬¡ã®ããã«æ¯èŒãããã¹ãã§ã¯ãããŸããã a == b
ãããŠã©ããã£ãŠã a - b < EPS
- ã¢ãžã¥ãŒã«ãèŠããŠããå¿
èŠããããŸããããããªããšã0 㯠1/3 ã«ã»ãŒçããããšãããããŸã... äžè¬ã«ãç§ã¯ libffi ã®ç¹å®ã®ããŒããæãã€ããŸãããããã¯æãåçŽãªãã¹ãã«åæ Œããglib ã¯ã³ã³ãã€ã«æžã¿ - å¿
èŠã ãšå€æããã®ã§ãåŸã§è¿œå ããŸãã ä»åŸã®ããšãèããŠãçµå±ã®ãšãããã³ã³ãã€ã©ã¯æçµã³ãŒãã« libffi é¢æ°ããçµã¿èŸŒãã§ããªãã£ããšèšããŸãã
ãããããã§ã«è¿°ã¹ãããã«ãããã€ãã®å¶éããããããŸããŸãªæªå®çŸ©ã®åäœã®èªç±ãªäœ¿çšã®äžã«ãããã«äžå¿«ãªæ©èœãé ãããŠããŸããJavaScript ã¯èšèšäžãå ±æã¡ã¢ãªã§ã®ãã«ãã¹ã¬ããããµããŒãããŠããŸããã ååãšããŠãããã¯éåžžãè¯ãã¢ã€ãã¢ã§ãããšããèšããŸãããã¢ãŒããã¯ãã£ã C ã¹ã¬ããã«é¢é£ä»ããããŠããã³ãŒãã移æ€ããå Žåã«ã¯é©ããŠããŸããã äžè¬çã«ãFirefox ã¯å ±æã¯ãŒã«ãŒã®ãµããŒããå®éšããŠãããEmscripten ã«ã¯å ±æã¯ãŒã«ãŒçšã® pthread å®è£ ããããŸãããç§ã¯ããã«äŸåããããããŸããã§ããã Qemu ã³ãŒããããã«ãã¹ã¬ããããã£ãããšæ ¹çµ¶ããå¿ èŠããããŸãããã€ãŸããã¹ã¬ãããå®è¡ãããŠããå ŽæãèŠã€ããŠããã®ã¹ã¬ããã§å®è¡ãããŠããã«ãŒãã®æ¬äœãå¥ã®é¢æ°ã«ç§»åãããã®ãããªé¢æ°ãã¡ã€ã³ ã«ãŒããã XNUMX ã€ãã€åŒã³åºãå¿ èŠããããŸããã
2åç®ã®è©Šã¿
ããæç¹ã§ãåé¡ã¯äŸç¶ãšããŠååšããŠãããç¡èšç»ã«ã³ãŒãã«æŸèæãçªãã€ããŠãäœã®è¯ãçµæããããããªãããšãæããã«ãªããŸããã çµè«: æŸèæãè¿œå ããããã»ã¹ãäœããã®æ¹æ³ã§äœç³»åããå¿
èŠããããŸãã ãããã£ãŠããã®æç¹ã§ã¯ææ°ã ã£ãããŒãžã§ã³ 2.4.1 ãæ¡çšãããŸãã (2.5.0 ã§ã¯ãããŸããããªããªããæ°ããããŒãžã§ã³ã«ã¯ãŸã ææãããŠããªããã°ãååšãããã©ããã¯ããããŸãããç§ã«ã¯ç¬èªã®ãã°ãååã«ããããã§ã)ãã°ïŒããããŠç§ãæåã«ããããšã¯ãããå®å
šã«æžãçŽãããšã§ãã thread-posix.c
ã ãŸããããã¯å®å
šã§ãã誰ãããããã¯ã«ã€ãªããæäœãå®è¡ããããšãããšããã®é¢æ°ã¯ããã«åŒã³åºãããŸãã abort()
ãã¡ãããããã§ãã¹ãŠã®åé¡ãäžåºŠã«è§£æ±ºãããããã§ã¯ãããŸããããå°ãªããšããäžè²«æ§ã®ãªãããŒã¿ãé»ã£ãŠåä¿¡ããããã¯ããªããšãªãå¿«é©ã§ããã
äžè¬ã«ãEmscripten ãªãã·ã§ã³ã¯ã³ãŒãã JS ã«ç§»æ€ããéã«éåžžã«åœ¹ç«ã¡ãŸãã -s ASSERTIONS=1 -s SAFE_HEAP=1
- ãããã¯ãæŽåãããŠããªãã¢ãã¬ã¹ãžã®åŒã³åºããªã©ãããã€ãã®çš®é¡ã®æªå®çŸ©ã®åäœãææããŸã (ããã¯ã次ã®ãããªåä»ãé
åã®ã³ãŒããšãŸã£ããäžèŽããŸãã) HEAP32[addr >> 2] = 1
)ããŸãã¯ééã£ãæ°ã®åŒæ°ãæå®ããŠé¢æ°ãåŒã³åºããå¯èœæ§ããããŸãã
ã¡ãªã¿ã«ãã¢ã©ã€ã¡ã³ãã®èª€å·®ã¯å¥åé¡ã§ãã ãã§ã«è¿°ã¹ãããã«ãQemu ã«ã¯ã³ãŒãçæ TCI (å°ããªã³ãŒã ã€ã³ã¿ãŒããªã¿ãŒ) çšã®ãçž®éãããã€ã³ã¿ãŒããªã¿ãŒ ããã¯ãšã³ãããããæ°ããã¢ãŒããã¯ãã£äžã§ Qemu ãæ§ç¯ããŠå®è¡ããã«ã¯ãéãè¯ããã° C ã³ã³ãã€ã©ãŒã§ååã§ãã ãéãè¯ããã°ãã éãæªãã£ãã®ã§ãããTCI ããã€ãã³ãŒãã解æãããšãã«éæŽåã¢ã¯ã»ã¹ã䜿çšããŠããããšãå€æããŸããã ã€ãŸããå¿ ç¶çã«å¹³æºåãããã¢ã¯ã»ã¹ãæã€ããããçš®é¡ã® ARM ããã³ãã®ä»ã®ã¢ãŒããã¯ãã£ã§ã¯ããã€ãã£ã ã³ãŒããçæããéåžžã® TCG ããã¯ãšã³ãããããããQemu ã¯ã³ã³ãã€ã«ããŸãããTCI ããããã§åäœãããã©ããã¯å¥ã®åé¡ã§ãã ããããçµå±ã®ãšãããTCI ã®ããã¥ã¡ã³ãã«ã¯åæ§ã®ããšãæ確ã«ç€ºãããŠããŸããã ãã®çµæãéæŽåèªã¿åãã®é¢æ°åŒã³åºããã³ãŒãã«è¿œå ãããŸãããããã㯠Qemu ã®å¥ã®éšåã§èŠã€ãããŸããã
ããŒãã®ç Žå£
ãã®çµæãTCI ãžã®éæŽåã¢ã¯ã»ã¹ãä¿®æ£ãããããã»ããµãRCUããã®ä»ã®å°ããªãã®ãé çªã«åŒã³åºãã¡ã€ã³ ã«ãŒããäœæãããŸããã ããã§ããªãã·ã§ã³ã䜿çšã㊠Qemu ãèµ·åããŸã -d exec,in_asm,out_asm
ã€ãŸããã³ãŒãã®ã©ã®ãããã¯ãå®è¡ãããŠããããæå®ããå¿
èŠãããããŸããããŒããã£ã¹ãæã«ãã²ã¹ã ã³ãŒããäœã§ãã£ããããã¹ã ã³ãŒããã©ã®ããã«ãªã£ãã (ãã®å Žåã¯ãã€ãã³ãŒã) ãèšè¿°ããå¿
èŠããããŸãã èµ·åããããã€ãã®å€æãããã¯ãå®è¡ããRCU ãèµ·åãããšããç§ãæ®ãããããã° ã¡ãã»ãŒãžãæžã蟌ã¿ããããŠ...ã¯ã©ãã·ã¥ããŸãã abort()
é¢æ°å
㧠free()
ã é¢æ°ãããã£ãŠã¿ããš free()
ç§ãã¡ã¯ãããã㯠ãµã€ãºãªã©ã§ã¯ãªããå²ãåœãŠãããã¡ã¢ãªã®åã® XNUMX ãã€ãã«ããããŒã ãããã¯ã®ããããŒã«ã¬ããŒãžãããããšãçºèŠããŸããã
ããŒãã®ç Žå£ - ãªããŠãããã... ãã®ãããªå Žåã䟿å©ãªè§£æ±ºçããããŸãã(å¯èœã§ããã°) åããœãŒã¹ãããã€ãã£ã ãã€ããªãã¢ã»ã³ãã«ããValgrind ã§å®è¡ããŸãã ãã°ãããããšããã€ããªã®æºåãæŽããŸããã åããªãã·ã§ã³ã䜿çšããŠèµ·åããŸããå®éã«å®è¡ã«éããåã«ãåæåäžã§ãã¯ã©ãã·ã¥ããŸãã ãã¡ããäžæå¿«ã§ã - æããã«ããœãŒã¹ã¯ãŸã£ããåãã§ã¯ãããŸããã§ãããããã¯é©ãã¹ãããšã§ã¯ãããŸãããconfigure ããããã«ç°ãªããªãã·ã§ã³ãæ¢ãåºããããã§ããããããç§ã¯ Valgrind ãæã£ãŠããŸã - ãŸããã®ãã°ãä¿®æ£ãããã®åŸãéãè¯ããã°ããªãªãžãã«ã®ãã®ã衚瀺ãããŸãã åãããšã Valgrind ã§å®è¡ããŠããŸã... ã¯ããã¯ãããããšãããã¯éå§ãããæ£åžžã«åæåãå®äºãããã©ãŒã«ã«ã€ããŠã¯èšããŸã§ããªããäžæ£ãªã¡ã¢ãª ã¢ã¯ã»ã¹ã«é¢ããèŠåã XNUMX ã€ã衚瀺ãããããšãªããå
ã®ãã°ãä¹ãè¶ããŠé²ã¿ãŸããã 圌ããèšãããã«ã人çã¯ç§ã«ããã«å¯ŸããæºåããããŸããã§ãã - ã¯ã©ãã·ã¥ããããã°ã©ã ã¯ãWalgrind ã®äžã§èµ·åãããšã¯ã©ãã·ã¥ããªããªããŸãã ãããäœã ã£ãã®ãã¯è¬ã§ãã ç§ã®ä»®èª¬ã¯ãåæåäžã®ã¯ã©ãã·ã¥ã®åŸãçŸåšã®åœä»€ã®è¿ã㧠gdb ãåäœã瀺ãããšããããšã§ãã memset
-a ã®ããããã䜿çšããæå¹ãªãã€ã³ã¿ mmx
ã xmm
ã¬ãžã¹ã¿ãŒã«åé¡ãããå Žåã¯ãããããäœããã®ã¢ã©ã€ã¡ã³ããšã©ãŒã ã£ãã®ã§ããããããŸã ä¿¡ããããããšã§ãã
ããŠããŽã¡ã«ã°ãªã³ãã¯ããã§ã¯åœ¹ã«ç«ããªãããã§ãã ãããŠãããã§æãå«ãªããšãå§ãŸããŸããããã¹ãŠãå§ãŸã£ãããã«èŠããŸãããäœçŸäžãã®åœä»€åã«çºçããå¯èœæ§ã®ããã€ãã³ãã«ããããŸã£ããæªç¥ã®çç±ã§ã¯ã©ãã·ã¥ããŸãã é·ãéãã©ã®ããã«ã¢ãããŒãããã°ããã®ãããæ確ã§ã¯ãããŸããã§ããã çµå±ãç§ã¯ãŸã 座ã£ãŠãããã°ããå¿
èŠããããŸããã ããããŒãæžãæããããå
容ãåºåãããšããããæ°å€ã§ã¯ãªããããçš®ã®ãã€ã㪠ããŒã¿ã§ããããšãããããŸããã ãããŠãªããšããã®ãã€ããªæååã BIOS ãã¡ã€ã«ã§èŠã€ãããŸãããã€ãŸããããããããã¡ ãªãŒããŒãããŒã§ãããšããªãã®èªä¿¡ãæã£ãŠèšããããã«ãªãããã®æååããã®ãããã¡ã«æžã蟌ãŸããããšããæããã§ãã ããŠã次ã®ãããªãã®ã§ãã幞ããªããšã«ãEmscripten ã§ã¯ã¢ãã¬ã¹ç©ºéã®ã©ã³ãã åã¯ãªããã¢ãã¬ã¹ç©ºéã«ãç©Žããªããããã³ãŒãã®éäžã®ã©ããã«ãååã®èµ·åããã®ãã€ã³ã¿ã«ãã£ãŠããŒã¿ãåºåããããã«èšè¿°ããããšãã§ããŸããããŒã¿ãèŠãŠããã€ã³ã¿ãèŠãŠãå€åããŠããªãå Žåã¯ãèããææãååŸããŸãã 確ãã«ãå€æŽãå ãããšãªã³ã¯ãããŸã§ã«æ°åããããŸãããã©ãããã°ããã§ãããã? ãã®çµæãBIOS ãäžæãããã¡ããã²ã¹ã ã¡ã¢ãªã«ã³ããŒããç¹å®ã®è¡ãèŠã€ãããŸãããå®éããããã¡ã«ã¯ååãªã¹ããŒã¹ããããŸããã§ããã ãã®å¥åŠãªãããã¡ã¢ãã¬ã¹ã®ãœãŒã¹ãèŠã€ãããšãé¢æ°ãçæãããŸããã qemu_anon_ram_alloc
ãã¡ã€ã«å
oslib-posix.c
- ããžãã¯ã¯æ¬¡ã®ãšããã§ããã¢ãã¬ã¹ããµã€ãº 2 MB ã®å·šå€§ãªããŒãžã«æãããšäŸ¿å©ãªå ŽåããããŸãããã®ããã«ã次ã®ããšãå°ããŸãã mmap
æåã¯ããå°ããããããäœåãªãã®ã¯å©ããåããŠè¿ããŸã munmap
ã ãã®ãããªèª¿æŽãå¿
èŠãªãå Žåã¯ã2 MB ã®ä»£ããã«çµæã瀺ããŸãã getpagesize()
- mmap
ããã§ããæŽåãããã¢ãã¬ã¹ãæäŸãããŸã...ãããã£ãŠãEmscriptenã§ã¯ mmap
ãã é»è©±ããã ã malloc
, ãããããã¡ããããŒãžäžã§ã¯æŽåããŸããã äžè¬ã«ãæ°ãæéç§ãã€ã©ã€ã©ããããã°ã¯ã ЎвÑÑ
ç·ã
é¢æ°åŒã³åºãã®ç¹åŸŽ
ãããŠçŸåšãããã»ããµã¯äœããã«ãŠã³ãããŠããŸããQemuã¯ã¯ã©ãã·ã¥ããŸããããç»é¢ã¯ãªã³ã«ãªããŸãããåºåããå€æãããšãããã»ããµã¯ããã«ã«ãŒãã«å
¥ããŸãã -d exec,in_asm,out_asm
ã 仮説ãæµ®äžããŸãããããã¯ãã¿ã€ããŒå²ã蟌㿠(ãŸãã¯ãäžè¬ã«ããã¹ãŠã®å²ã蟌ã¿) ãå°çããªããšããããšã§ãã å®éãäœããã®çç±ã§æ©èœãããã€ãã£ã ã¢ã»ã³ããªããã®å²ã蟌ã¿ã解é€ãããšãåæ§ã®ç¶æ³ãåŸãããŸãã ããããããã¯ãŸã£ããçãã§ã¯ãããŸããã§ãããäžèšã®ãªãã·ã§ã³ã§çºè¡ããããã¬ãŒã¹ãæ¯èŒãããšãå®è¡è»è·¡ãéåžžã«æ©ã段éã§åå²ããŠããããšãããããŸããã ããã§ã¯ãã©ã³ãã£ãŒã䜿çšããŠèšé²ããããã®ãšã®æ¯èŒãéèŠã§ãããšèšããªããã°ãªããŸãã emrun
ãã€ãã£ã ã¢ã»ã³ããªã®åºåã䜿çšãããããã°åºåã¯ãå®å
šã«æ©æ¢°çãªããã»ã¹ã§ã¯ãããŸããã ãã©ãŠã¶ã§å®è¡ãããŠããããã°ã©ã ãã©ã®ããã«æ¥ç¶ããŠããã®ãæ£ç¢ºã«ã¯ããããŸãã emrun
ãã ããåºåå
ã®äžéšã®è¡ã¯åé
眮ãããŠããããšãå€æãããããdiff ã®éãã¯ãè»è·¡ãçºæ£ãããšä»®å®ããçç±ã«ã¯ãŸã ãªããŸããã äžè¬çã«ãæ瀺ã«åŸã£ãŠããããšãæããã«ãªããŸãã ljmpl
ç°ãªãã¢ãã¬ã¹ãžã®é·ç§»ããããçæããããã€ãã³ãŒãã¯æ ¹æ¬çã«ç°ãªããŸããäžæ¹ã«ã¯ãã«ããŒé¢æ°ãåŒã³åºãåœä»€ãå«ãŸããããäžæ¹ã«ã¯å«ãŸããŠããŸããã æ瀺ãã°ãŒã°ã«ã§æ€çŽ¢ãããããã®æ瀺ã翻蚳ããã³ãŒãã調ã¹ããšããããŸããã¬ãžã¹ã¿å
ã®æ瀺ã®çŽåã«ã cr0
ããããã«ããŒã䜿çšããŠèšé²ãè¡ãããããã»ããµãä¿è·ã¢ãŒãã«åãæ¿ãããŸããã次ã«ãjs ããŒãžã§ã³ãä¿è·ã¢ãŒãã«åãæ¿ãããªãã£ãããšãããããŸãã ãããå®éã®ãšãããEmscripten ã®ãã XNUMX ã€ã®ç¹åŸŽã¯ãåœä»€ã®å®è£
ãªã©ã®ã³ãŒãã蚱容ããªãããšã§ãã call
TCI ã§ã¯ãé¢æ°ãã€ã³ã¿ã®çµæãåã«ãªããŸãã long long f(int arg0, .. int arg9)
- é¢æ°ã¯æ£ããæ°ã®åŒæ°ãæå®ããŠåŒã³åºãå¿
èŠããããŸãã ãã®ã«ãŒã«ã«éåãããšããããã°èšå®ã«å¿ããŠãããã°ã©ã ãã¯ã©ãã·ã¥ããã (ããã¯è¯ãããšã§ãã)ãééã£ãé¢æ°ããŸã£ããåŒã³åºãããã (ãããã°ããã«ã¯æ®å¿µãªããšã«ãªããŸã) ã®ããããã«ãªããŸãã XNUMX çªç®ã®ãªãã·ã§ã³ããããŸããåŒæ°ãè¿œå ãŸãã¯åé€ããã©ãããŒã®çæãæå¹ã«ããŸãããã ããå®éã«ã¯ XNUMX åãå°ãè¶
ããã©ãããŒããå¿
èŠãªãã«ããããããããããã®ã©ãããŒã¯åèšã§å€ãã®ã¹ããŒã¹ãå æããŸãã ããã ãã§ãéåžžã«æ²ããããšã§ãããããã«æ·±å»ãªåé¡ãããããšãå€æããŸãããã©ãããŒé¢æ°ã®çæãããã³ãŒãã§ã¯ãåŒæ°ã¯å€æãããŠå€æãããŸããããçæãããåŒæ°ãæã€é¢æ°ãåŒã³åºãããªãããšããããŸãããç§ã® libffi å®è£
ã ã€ãŸããäžéšã®ãã«ããŒã¯åã«å®è¡ãããŸããã§ããã
幞ããªããšã«ãQemu ã«ã¯æ¬¡ã®ãããªããã㌠ãã¡ã€ã«ã®åœ¢åŒã§æ©æ¢°å¯èªãªãã«ããŒã®ãªã¹ãããããŸãã
DEF_HELPER_0(lock, void)
DEF_HELPER_0(unlock, void)
DEF_HELPER_3(write_eflags, void, env, tl, i32)
ãããã¯éåžžã«é¢çœã䜿ãæ¹ãããŠããŸãããŸãããã¯ãã¯æãå¥åŠãªæ¹æ³ã§åå®çŸ©ãããŸãã DEF_HELPER_n
ããã®åŸé»æºãå
¥ããŸã helper.h
ã ãã¯ããæ§é äœåæååãšã«ã³ãã«å±éãããèŠçŽ ã®ä»£ããã«é
åãå®çŸ©ãããç¯å²ãŸã§ - #include <helper.h>
ãã®çµæãã€ãã«è·å Žã§ã©ã€ãã©ãªãè©Šãæ©äŒãåŸãããŸãã
ãããŠãã®åŸãããã»ããµã¯åäœããããã§ãã memtest86+ ã¯ãã€ãã£ãã¢ã»ã³ããªã§å®è¡ã§ããã«ãããããããç»é¢ãåæåãããªãã£ãããšãåå ãšæãããŸãã ããã§ãQemu ããã㯠I/O ã³ãŒããã³ã«ãŒãã³ã§èšè¿°ãããŠããããšãæ確ã«ããå¿
èŠããããŸãã Emscripten ã«ã¯ç¬èªã®éåžžã«ããªãããŒãªå®è£
ããããŸãããQemu ã³ãŒãã§ãµããŒãããå¿
èŠããããããã»ããµããããã°ã§ããããã«ãªããŸãããQemu ã¯ãªãã·ã§ã³ããµããŒãããŠããŸãã -kernel
, -initrd
, -append
ããã䜿çšãããšãããã㯠ããã€ã¹ããŸã£ãã䜿çšããã« Linux ããããšãã° memtest86+ ãèµ·åã§ããŸãã ããããããã«åé¡ããããŸãããã€ãã£ã ã¢ã»ã³ããªã§ã¯ããªãã·ã§ã³ã䜿çšããŠã³ã³ãœãŒã«ã« Linux ã«ãŒãã«åºåã衚瀺ãããå¯èœæ§ããããŸãã -nographic
ããã©ãŠã¶ããèµ·åå
ã®ã¿ãŒããã«ãžã®åºåã¯ãããŸãã emrun
ãæ¥ãŸããã§ããã ã€ãŸããããã»ããµãåäœããŠããªãã®ããã°ã©ãã£ãã¯åºåãåäœããŠããªãã®ãã¯äžæã§ãã ãããŠãå°ãåŸ
ã£ãŠã¿ãããšæãã€ããŸããã ãããã»ããµã¯ã¹ãªãŒãç¶æ
ã§ã¯ãªããåã«ãã£ããç¹æ»
ããŠããã ããã§ããããšãå€æããçŽ 2 ååŸã«ã«ãŒãã«ã倧éã®ã¡ãã»ãŒãžãã³ã³ãœãŒã«ã«ã¹ããŒãããã³ã°ãç¶ããŸããã ããã»ããµã¯äžè¬çã«åäœããããšãæããã«ãªããSDL0 ã§åäœããã³ãŒãã詳ãã調ã¹ãå¿
èŠããããŸãã æ®å¿µãªãããç§ã¯ãã®ã©ã€ãã©ãªã®äœ¿ãæ¹ãç¥ããªãã®ã§ãããã€ãã®å Žæã§ã©ã³ãã ã«è¡åããªããã°ãªããŸããã§ããã ããæç¹ã§ãç»é¢äžã®éè²ã®èæ¯ã«ãParallelXNUMX ãšããç·ãç¹æ»
ããããã€ãã®èãã瀺åããŸããã æçµçã«ãåé¡ã¯ Qemu ã XNUMX ã€ã®ç©çãŠã£ã³ããŠå
ã§è€æ°ã®ä»®æ³ãŠã£ã³ããŠãéããCtrl-Alt-n ã䜿çšããŠåãæ¿ããããšãã§ããããšã§ããããšãå€æããŸããããã€ãã£ã ãã«ãã§ã¯æ©èœããŸãããEmscripten ã§ã¯æ©èœããŸããã ãªãã·ã§ã³ã䜿çšããŠäžèŠãªãŠã£ã³ããŠãåé€ããåŸ -monitor none -parallel none -serial none
åãã¬ãŒã ã§ç»é¢å
šäœã匷å¶çã«åæç»ããåœä»€ãå®è¡ãããšããã¹ãŠãçªç¶æ©èœããŸããã
ã³ã«ãŒãã³
ãããã£ãŠããã©ãŠã¶ã§ã®ãšãã¥ã¬ãŒã·ã§ã³ã¯æ©èœããŸãããããã㯠I/O ããªããããèå³æ·±ãåäžãããããŒãå®è¡ããããšã¯ã§ããŸãããã³ã«ãŒãã³ã®ãµããŒããå®è£
ããå¿
èŠããããŸãã Qemu ã«ã¯ãã§ã«ããã€ãã®ã³ã«ãŒãã³ ããã¯ãšã³ãããããŸãããJavaScript ãš Emscripten ã³ãŒã ãžã§ãã¬ãŒã¿ãŒã®æ§è³ªã«ããããã åã«ã¹ã¿ãã¯ãæäœãå§ããããšã¯ã§ããŸããã ããã¹ãŠããªããªã£ãŠãç³èãåãé€ãããŠãããããã«èŠãããããããŸããããEmscripten ã®éçºè
ã¯ãã§ã«ãã¹ãŠãåŠçããŠããŸãã ããã¯éåžžã«é¢çœãå®è£
ã§ãããã®ãããªæªããé¢æ°åŒã³åºããåŒã³åºããŠã¿ãŸãããã emscripten_sleep
ä»ã®ããã€ã㯠Asyncify ã¡ã«ããºã ã䜿çšããŠããããã€ã³ã¿ãŒåŒã³åºããšãåã® XNUMX ã€ã®ã±ãŒã¹ã®ãããããã¹ã¿ãã¯ã®ããã«äžã§çºçããå¯èœæ§ãããé¢æ°ãžã®åŒã³åºããåæ§ã§ãã ãããŠãçãããåŒã³åºãã®åã«ãéåæã³ã³ããã¹ããéžæããåŒã³åºãã®çŽåŸã«ãéåæåŒã³åºããçºçãããã©ããã確èªããéåæåŒã³åºããçºçããå Žåã¯ããã¹ãŠã®ããŒã«ã«å€æ°ããã®éåæã³ã³ããã¹ãã«ä¿åããã©ã®é¢æ°ã瀺ããã瀺ããŸããå®è¡ãç¶ç¶ããå¿
èŠããããšãã«å¶åŸ¡ã移ããçŸåšã®é¢æ°ãçµäºããŸãã ããã«ã¯å¹æãç 究ããäœå°ããããŸã -O3
ã çæãããã³ãŒããå®è¡ãããšãChromium ãã¡ã¢ãªãæ¶è²»ããŠã¯ã©ãã·ã¥ããŸãã ãã®åŸã圌ãããŠã³ããŒãããããšããŠãããã®ãå¶ç¶èŠãŠããŸããŸãã...ãŸããäœãšèšããã500 MB 以äžã® Javascript ãæ
éã«ç 究ããŠæé©åããããã«é ŒãŸããŠããããç§ãåºãŸã£ãŠããã§ãããã
æ®å¿µãªãããAsyncify ãµããŒã ã©ã€ãã©ãª ã³ãŒãã®ãã§ãã¯ã¯å®å
šã«é©åã§ã¯ãããŸããã§ããã longjmp
-s ã¯ä»®æ³ããã»ããµ ã³ãŒãã§äœ¿çšãããŸããããããã®ãã§ãã¯ãç¡å¹ã«ãããã¹ãŠãæ£åžžã§ãããã®ããã«ã³ã³ããã¹ãã匷å¶çã«åŸ©å
ããå°ããªãããã®åŸãã³ãŒãã¯æ©èœããŸããã ãããŠãå¥åŠãªããšãå§ãŸããŸãããæã
ãåæã³ãŒãã®ãã§ãã¯ãããªã¬ãŒãããŸãããããã¯ãå®è¡ããžãã¯ã«åŸã£ãŠãããã¯ãããã¹ãã§ããå Žåã«ã³ãŒããã¯ã©ãã·ã¥ããããã®ãšåããã®ã§ããã誰ãããã§ã«ãã£ããã£ããããã¥ãŒããã¯ã¹ãååŸããããšããŸããã 幞ããªããšã«ãããã¯ã·ãªã¢ã«åãããã³ãŒãã§ã¯è«ççãªåé¡ã§ã¯ãªãããšãå€æããŸãããç§ã¯åã« Emscripten ãæäŸããæšæºã®ã¡ã€ã³ ã«ãŒãæ©èœã䜿çšããŠããŸããããéåæåŒã³åºãã«ãã£ãŠã¹ã¿ãã¯ãå®å
šã«ã¢ã³ã©ããããããã®ç¬éã«å€±æããããšããããŸããã setTimeout
ã¡ã€ã³ ã«ãŒããã - ãããã£ãŠãã³ãŒãã¯åã®å埩ãé¢ããããšãªãã¡ã€ã³ ã«ãŒãã®å埩ã«å
¥ããŸããã ç¡éã«ãŒãã§æžãçŽããŠã emscripten_sleep
ããã¥ãŒããã¯ã¹ã®åé¡ã¯ãªããªããŸããã ã³ãŒãã¯ããã«è«ççã«ãªããŸãããå®éã次ã®ã¢ãã¡ãŒã·ã§ã³ ãã¬ãŒã ãæºåããã³ãŒãã¯ãããŸãããããã»ããµã¯åã«äœããèšç®ããç»é¢ã¯å®æçã«æŽæ°ãããŸãã ããããåé¡ã¯ããã ãã§ã¯ãããŸããã§ãããQemu ã®å®è¡ããäŸå€ããšã©ãŒãçºçãããã«åã«çµäºããããšããããŸããã ãã®ç¬éãç§ã¯ãããè«ŠããŸããããå°æ¥ãèŠæ®ããŠãåé¡ã¯æ¬¡ã®ãšããã§ãããšèšããŸããå®éãã³ã«ãŒãã³ ã³ãŒãã§ã¯ã setTimeout
(å°ãªããšãããªããæã£ãŠããã»ã©é »ç¹ã§ã¯ãããŸãã): é¢æ° emscripten_yield
éåæåŒã³åºããã©ã°ãèšå®ããã ãã§ãã èŠç¹ã¯æ¬¡ã®ãšããã§ã emscripten_coroutine_next
ã¯éåæé¢æ°ã§ã¯ãããŸãããå
éšçã«ãã©ã°ããã§ãã¯ããŠãªã»ããããå¿
èŠãªå Žæã«å¶åŸ¡ãæž¡ããŸãã ã€ãŸããã¹ã¿ãã¯ã®ææ Œã¯ããã§çµäºããŸãã åé¡ã¯ãæ¢åã®ã³ã«ãŒãã³ ããã¯ãšã³ãããéèŠãªã³ãŒãè¡ãã³ããŒããªãã£ãããã«ã³ã«ãŒãã³ ããŒã«ãç¡å¹ã«ãªã£ããšãã«çºçãã use-after-free ãåå ã§ãé¢æ° qemu_in_coroutine
å®éã«ã¯ false ãè¿ãå¿
èŠããããšãã« true ãè¿ããŸããã ãããé»è©±ã«ã€ãªãããŸãã emscripten_yield
ããã®äžã«ã¯ã¹ã¿ãã¯ã«èª°ããããŸããã§ãã emscripten_coroutine_next
ãã¹ã¿ãã¯ã¯äžçªäžãŸã§å±éãããŸãããã setTimeout
ããã§ã«è¿°ã¹ãããã«ãå±ç€ºãããŠããŸããã§ããã
JavaScript ã³ãŒãã®çæ
ãããŠå®éãããã§çŽæããããã²ãèãå ã«æ»ããã®ã§ãã ããŸãã ãã¡ããããã©ãŠã¶ãŒã§ Qemu ãå®è¡ãããã®äžã§ Node.js ãå®è¡ãããšãåœç¶ã®ããšãªãããQemu ã§ã®ã³ãŒãçæåŸã«ã¯å®å šã«ééã£ã JavaScript ãçæãããŸãã ããããããã§ããããçš®ã®éå€æã
ãŸããQemu ã®ä»çµã¿ã«ã€ããŠå°ã説æããŸãã ä»ããã容赊ãã ãããç§ã¯ããã® Qemu éçºè
ã§ã¯ãªããããç§ã®çµè«ã¯å Žæã«ãã£ãŠã¯ééã£ãŠããå¯èœæ§ããããŸãã 圌ããèšãããã«ããçåŸã®æèŠã¯æåž«ã®æèŠããã¢ãã®å
¬çãåžžèãšäžèŽããå¿
èŠã¯ãªããã®ã§ãã Qemu ã«ã¯ãµããŒããããŠããã²ã¹ã ã¢ãŒããã¯ãã£ãäžå®æ°ãããããããã«æ¬¡ã®ãããªãã£ã¬ã¯ããªããããŸãã target-i386
ã ãã«ãæã«è€æ°ã®ã²ã¹ã ã¢ãŒããã¯ãã£ã®ãµããŒããæå®ã§ããŸãããçµæãšããŠåŸãããã®ã¯è€æ°ã®ãã€ããªã ãã§ãã ã²ã¹ã ã¢ãŒããã¯ãã£ããµããŒãããã³ãŒãã¯ãããã€ãã®å
éš Qemu æäœãçæããŸããããã¯ãTCG (Tiny Code Generator) ã«ãã£ãŠãã§ã«ãã¹ã ã¢ãŒããã¯ãã£çšã®ãã·ã³ ã³ãŒãã«å€æãããŠããŸãã tcg ãã£ã¬ã¯ããªã«ãã readme ãã¡ã€ã«ã«èšèŒãããŠããããã«ãããã¯å
ã
ã¯éåžžã® C ã³ã³ãã€ã©ã®äžéšã§ãããåŸã« JIT ã«é©åãããããŸããã ãããã£ãŠãããšãã°ããã®ããã¥ã¡ã³ãã«ãããã¿ãŒã²ãã ã¢ãŒããã¯ãã£ã¯ã²ã¹ã ã¢ãŒããã¯ãã£ã§ã¯ãªãããã¹ã ã¢ãŒããã¯ãã£ã«ãªããŸãã ããæç¹ã§ãå¥ã®ã³ã³ããŒãã³ãã§ãã Tiny Code Interpreter (TCI) ãç»å ŽããŸãããããã¯ãç¹å®ã®ãã¹ã ã¢ãŒããã¯ãã£çšã®ã³ãŒã ãžã§ãã¬ãŒã¿ãŒãååšããªãå Žåã§ãã³ãŒã (ã»ãŒåãå
éšæäœ) ãå®è¡ããå¿
èŠããããŸãã å®éãããã¥ã¡ã³ãã«èšèŒãããŠããããã«ããã®ã€ã³ã¿ããªã¿ã¯ãé床ã®ç¹ã§éçãªç¹ã ãã§ãªãã質çãªç¹ã§ããåžžã« JIT ã³ãŒã ãžã§ãã¬ãŒã¿ã»ã©ã®ããã©ãŒãã³ã¹ãçºæ®ãããšã¯éããŸããã 圌ã®èª¬æãå®å
šã«é©åã§ãããã©ããã¯ããããŸãããã
æåã¯æ¬æ Œç㪠TCG ããã¯ãšã³ããäœãããšããŸããããããã«ãœãŒã¹ ã³ãŒããæ··ä¹±ãããã€ãã³ãŒãåœä»€ã®èª¬æãå®å šã«æ確ã§ã¯ãªããªã£ããããTCI ã€ã³ã¿ãŒããªã¿ãã©ããããããšã«ããŸããã ããã«ããã次ã®ãããªããã€ãã®å©ç¹ãåŸãããŸããã
- ã³ãŒã ãžã§ãã¬ãŒã¿ãŒãå®è£ ãããšãã¯ãåœä»€ã®èª¬æã§ã¯ãªããã€ã³ã¿ãŒããªã¿ãŒ ã³ãŒããèŠãããšãã§ããŸãã
- é¢æ°ã¯ãæ€åºããããã¹ãŠã®å€æãããã¯ã«å¯ŸããŠçæã§ããããã§ã¯ãããŸããããããšãã° XNUMX åç®ã®å®è¡åŸã«ã®ã¿çæã§ããŸãã
- çæãããã³ãŒããå€æŽãããå Žå (ããããšããåèªãå«ãååãæã€é¢æ°ããå€æãããšãããã¯å¯èœã§ããããã§ã)ãçæããã JS ã³ãŒããç¡å¹ã«ããå¿ èŠããããŸãããå°ãªããšããããåçæãããã®ã¯çšæãããŠããŸãã
XNUMX çªç®ã®ç¹ã«ã€ããŠã¯ãã³ãŒããåããŠå®è¡ããåŸã«ããããé©çšã§ãããã©ããã¯ããããŸããããæåã® XNUMX ç¹ã§ååã§ãã
åœåãã³ãŒãã¯å
ã®ãã€ãã³ãŒãåœä»€ã®ã¢ãã¬ã¹ã«ãã倧ããªã¹ã€ããã®åœ¢åŒã§çæãããŸãããããã®åŸãEmscriptenãçæããã JS ã®æé©åãããã³åã«ãŒãã«é¢ããèšäºãæãåºããŠããã人éçãªã³ãŒããçæããããšã«ããŸãããå€æãããã¯ãžã®å¯äžã®ãšã³ã㪠ãã€ã³ãã¯ããã® Start ã§ããããšãå€æããŸããã èšããŸã§ããªãããã°ãããããšãifs ã䜿çšã㊠(ã«ãŒããªãã§ã¯ãããŸãã) ã³ãŒããçæããã³ãŒã ãžã§ãã¬ãŒã¿ãŒãå®æããŸããã ãããéæªãã¯ã©ãã·ã¥ããåœä»€ã®é·ããééã£ãŠãããšããã¡ãã»ãŒãžã衚瀺ãããŸããã ããã«ããã®ååž°ã¬ãã«ã§ã®æåŸã®åœä»€ã¯ brcond
ã ããŠãååž°åŒã³åºãã®ååŸã«ãã®åœä»€ã®çæã«åäžã®ãã§ãã¯ãè¿œå ããŸãããã®ãã¡ã® XNUMX ã€ãå®è¡ãããŸããã§ããããã¢ãµãŒã ã¹ã€ããã®åŸã§ã倱æããŸããã çµå±ãçæãããã³ãŒãã調ã¹ãçµæãåãæ¿ãåŸãçŸåšã®åœä»€ãžã®ãã€ã³ã¿ãã¹ã¿ãã¯ããåããŒããããããããçæããã JavaScript ã³ãŒãã«ãã£ãŠäžæžããããããšãããããŸããã ãããŠããããå€æããŸããã ãããã¡ã XNUMX ã¡ã¬ãã€ããã XNUMX ã¡ã¬ãã€ãã«å¢ãããŠãäœãèµ·ããããã³ãŒã ãžã§ãã¬ãŒã¿ãŒãå ã
å·¡ãããŠå®è¡ãããŠããããšãæããã«ãªããŸããã çŸåšã® TB ã®å¢çãè¶
ããŠããªãããšã確èªããå¿
èŠããããè¶
ããå Žåã¯ãå®è¡ãç¶è¡ã§ããããã«ããã€ãã¹èšå·ãä»ããŠæ¬¡ã® TB ã®ã¢ãã¬ã¹ãçºè¡ããå¿
èŠããããŸããã ããã«ãããã«ãããããã®ãã€ãã³ãŒããå€æŽãããå Žåãã©ã®çæé¢æ°ãç¡å¹ã«ããå¿
èŠãããã?ããšããåé¡ã解決ãããŸãã â ãã®å€æãããã¯ã«å¯Ÿå¿ããé¢æ°ã®ã¿ãç¡å¹ã«ããå¿
èŠããããŸãã ã¡ãªã¿ã«ãç§ã¯ãã¹ãŠã Chromium ã§ãããã°ããŸããã (Firefox ã䜿çšããŠãããå®éšã«ã¯å¥ã®ãã©ãŠã¶ã䜿çšããã»ããç°¡åãªã®ã§)ãFirefox 㯠asm.js æšæºãšã®éäºææ§ãä¿®æ£ããã®ã«åœ¹ç«ã¡ããã®åŸãã³ãŒãã¯ããé«éã«åäœããããã«ãªããŸãããã¯ãã ã
çæãããã³ãŒãã®äŸ
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"]
ãŸãšã
ãšããããšã§ããŸã å·¥äºã¯çµãã£ãŠããªãã®ã§ããããã®é·æã«ãããå·¥äºããã£ããå®æãããã®ã«ç²ããŸããã ããã§ãä»ãããã®ãå
¬éããããšã«ããŸããã ããã¯å®éšã§ãããäœãããå¿
èŠãããããäºåã«æ確ã§ã¯ãªããããã³ãŒãã¯ãšããã©ããå°ãæãã§ãã ãããããããæ°ããããŒãžã§ã³ã® Qemu äžã§éåžžã®ã¢ããã㯠ã³ããããçºè¡ãã䟡å€ã¯ããã§ãããã ãã®éãã®ãŒã¿ã«ã¯ããã°åœ¢åŒã®ã¹ã¬ããããããå°ãªããšãäœããã®åœ¢ã§åæ Œãããã¬ãã«ãããšã«ããã·ã¢èªã§ã®è©³çŽ°ãªè§£èª¬ãè¿œå ãããŠããŸãã å®éããã®èšäºã¯å€§éšåãçµè«ã®å話ã§ãã git log
.
ãã¹ãŠè©ŠããŠã¿ãããšãã§ããŸã
ãã§ã«æ©èœããŠãããã®:
- x86 ä»®æ³ããã»ããµãå®è¡ãããŠãã
- ãã·ã³ã³ãŒããã JavaScript ãŸã§ã® JIT ã³ãŒããžã§ãã¬ãŒã¿ãŒã®å®çšçãªãããã¿ã€ãããããŸã
- ä»ã® 32 ããã ã²ã¹ã ã¢ãŒããã¯ãã£ãã¢ã»ã³ãã«ããããã®ãã³ãã¬ãŒãããããŸããçŸæç¹ã§ã¯ãèªã¿èŸŒã¿æ®µéã§ãã©ãŠã¶å ã§ããªãŒãºãã MIPS ã¢ãŒããã¯ãã£çšã® Linux ãè³è³ã§ããŸãã
ä»ã«äœãã§ããã§ãããã
- ãšãã¥ã¬ãŒã·ã§ã³ãé«éåããŸãã JIT ã¢ãŒãã§ããVirtual x86 ãããåäœãé ãããã«èŠããŸã (ãã ããå€ãã®ãšãã¥ã¬ãŒããããããŒããŠã§ã¢ãšã¢ãŒããã¯ãã£ãåãã Qemu å šäœãååšããå¯èœæ§ããããŸã)ã
- éåžžã®ã€ã³ã¿ãŒãã§ãŒã¹ãäœæããã«ã¯ - ççŽã«èšã£ãŠãç§ã¯åªãã Web éçºè ã§ã¯ãªãã®ã§ãä»ã®ãšããã¯ã§ããéãæšæºã® Emscripten ã·ã§ã«ãäœãçŽããŸããã
- ããè€é㪠Qemu æ©èœ (ãããã¯ãŒãã³ã°ãVM 移è¡ãªã©) ãèµ·åããŠã¿ãŠãã ããã
- UPDïŒ Qemu ãä»ã®ãããžã§ã¯ãã®ä»¥åã®ç§»æ€è ãè¡ã£ãŠããããã«ãããã€ãã®éçºãšãã° ã¬ããŒãã Emscripten äžæµã«æåºããå¿ èŠããããŸãã Emscripten ãžã®åœŒãã®è²¢ç®ãç§ã®ä»äºã®äžéšãšããŠæé»çã«äœ¿çšã§ããããšã«æè¬ããŸãã
åºæïŒ habr.com