èªä½CPUåãCã³ã³ãã¤ã©ãã¤ãã£ã¦OSåããã話 (CPUå®é¨ã¾ã¨ã)
åã®å¦ç§ã§ã¯ä¼çµ±çã«3å¹´ã®å¾æã«åå¹´ããã¦CPUå®é¨ã¨ãããã®ããããªãã çã§èªä½ã®ã¢ã¼ããã¯ãã£ãè¨è¨ã»å®è£ ããFPGAåºæ¿ä¸ã§MinCaml(OCamlã®ãµãã»ãã)ã§ãããã課é¡ç¨ã¬ã¤ãã¬ã¼ã·ã³ã°ããã°ã©ã ãåãã°åä½ãããããã¨ãããã®ã§ããã
ã¬ã¤ãã¬å®åå¾ã«ã¯ããã®é«éåã«ã¯ããããããä½èã¨ãã¦ã²ã¼ã ãã¤ãããããã§ãèªä½CPUä¸ã§è²ã ãããã ãããã
ä»å¹´ã¯æå¿ã§çãçµæããèªä½CPUä¸ã§xv6ã¨ããOSãåãããã åã¯ãã®çã«Cã³ã³ãã¤ã©ä¿ã¨ãã¦åå ããã®ã§ããã®ãã¨ã«ã¤ãã¦ããã ãã¨ãOS移æ¤çå ¨ä½ã®ææã«ã¤ãã¦ã触ããã
ããã¨é·ããªã£ã¦ãã¾ã£ãã®ã§ãçµå±ãªã«ãã§ãããã ã£ã¦ãã人ã¯ãã¨ããããå ã«ãã£ã¡ã«é£ãã§ã»ããã
åæ©
æéã¯4ã¶æç¨åº¦ãé å¸ãããFPGAåºæ¿ã®ããã§åããããã¨ããå¶ç´ã®ãã¨ã§ç§»æ¤ããOSã¯xv6ãé¸æããã ãã®OSã¯ã·ã³ãã«ã§ããããååãªæ©è½ããã£ã¦ããä¸ã«ãMITã§æè²ç¨ã¨ãã¦è¬ç¾©ã§ã¤ãããã¦ããããã§ãè³æãè±å¯ã¨ããå©ç¹ãããã
ãã ããã®OSã¯Cè¨èªã§ãããã¦ããã¨ããåé¡ããã£ãã
OSãCã§ãããã¦ããäºèªä½ã¯æ®éã®ãã¨ã§ããããCPUå®é¨ã®èª²é¡ããã°ã©ã ã¯MinCamlã§ãããã¦ãããããCPUå®é¨ã«é¢ãã¦ã³ã³ãã¤ã©ã¨ããã¨ãMinCamlãæ¹é ãããã®ãæãã®ãä¸è¬çã§ããã ãã®ãããMLã³ã³ãã¤ã©ã¯ç¨æã§ããã®ã ããxv6ããã¹ã¦MinCamlã§æ¸ãç´ãã®ã¯ãããã«å³ããã
ã¨ããããã§ãOSã®ç§»æ¤ã®ã¾ãã«ãèªåãã¡ã®CPUåãã«Cè¨èªã³ã³ãã¤ã©ãã¤ãããã¨ãããã¨ã«ãªã£ãã
æ¢åã®Cã³ã³ãã¤ã©ãèªåãã¡ã®ã¢ã¼ããã¯ãã£åãã«ç§»æ¤ããã¨ããæããã£ããããã£ããã ããã«ã¹ã¯ã©ããã§å®è£ ããæ¹ãé¢ç½ããã ãããã¨ãããã¨ã§ï¼ããèªä½ãããã¨ã«ããã
対象ã¨ããèªä½CPUã¯ãä»å¹´æãæ©ãå®åãã3çã®2ndã¢ã¼ããã¯ãã£ã§ããGAIAã«ããã å½ä»¤ã»ãããç¬èªã®ãã®ãæ¡ç¨ãã¦ããã
ã¤ãã£ãã³ã³ãã¤ã©ã«ã¤ãã¦
ä½æããã³ã³ãã¤ã©ã¯ããã
UCCã¨ããååã§éçºãããOCamlã§å®è£
ããã¦ãããANSI-Cã®å¤§é¨åããµãã¼ããã¦ããã
ANSI-Cã®ä¸»è¦ãªæ©è½ã§éãµãã¼ããªã®ã¯ãããããã£ã¼ã«ãã¨æ§é ä½ãè¿ãé¢æ°ãããã
ã©ã¡ããOSã®ã½ã¼ã¹ã³ã¼ãå
ã§ã¤ããããªãã£ãã®ã§ãå®è£
ã³ã¹ãçã«ãµãã¼ãããã®ããããã
ANSI-Cå¤ã®æ©è½ã¨ãã¦ã¯ãç¬èªã®ã¤ã³ã©ã¤ã³ã¢ã»ã³ãã©ãã¤ãããããã«ããã
libcã«ã¤ãã¦ã¯ãå¿ è¦ã«å¿ãã¦èªåãã¡ã§å®è£ ãã¦ãã£ã¦ããµãã»ãããã¤ãããã
éçºã¯ãèªåã®çã§ã®ã¿ã¹ã¯ãåºåããã¤ãã11æä¸é ããåãéå§ãããã®å¾wasabizã¨b-inaryãå ãã£ã¦3人ã§éçºããã ï¼wasabizã¯CPUã®å®è£ ãb-inaryã¯ã·ãã¥ã¬ã¼ã¿ã»ã¢ã»ã³ãã©ã®å®è£ ãå ¼ä»»ï¼
UCCã§ã¯ã³ã³ãã¤ã«ã
- clangã«ãããããªããã»ã¹ã»ææ³ãã§ãã¯
- æ§æ解æ
- åã¤ããå®æ°ç³ã¿è¾¼ã¿
- ã¢ã»ã³ããªçæ
ã¨ããé ã§ãããªã£ã¦ããã
ããªããã»ããµã¯clangã®ãã®ãã³ã³ãã¤ã©ãå©ç¨ããã
ã¾ããUCCæ¬ä½ã«Cã®ã³ã¼ãã渡ãåã«ãclangã®fsyntax-onlyãªãã·ã§ã³ã§ã®ææ³ãã§ãã¯ããã¾ããããã«ãã¦ããã
UCCæ¬ä½ã§ã¯ã ocamlyaccã§çæãããã¼ãµã§æ½è±¡æ§ææ¨ãä½æãã ãã®å¾ãæ¨ãï¼åãã©ãã¼ã¹ãã¦ãèªä½ã¢ã¼ããã¯ãã£åãã¢ã»ã³ããªãçæããã
å²ã¨ã·ã³ãã«ã§ããããããæ§æã«å®è£ ã§ããã¨ãããã
å®è£
ã®éã«ã¯æé©åããããã°ãªãæ£ããåããã®ãã§ããã ãæ©ãã¤ãããã¨ãæèããã
ãã¨ãã°ãç°¡åã®ãããå¤æ°ã¯ãã¹ã¦ã¡ã¢ãªä¸ã«å²ãã¤ãããã¨ã«ãã¦ããã
ã¾ãããã¹ããéè¦ããã
proveã³ãã³ããå©ç¨ãã¦ç°¡åã«ä¸æ¬ãã¹ãã§ããããã«ããæ©è½ã追å ãããã¨ã«ãã¹ãã³ã¼ãã追å ãã¦ãã£ããããã«ãããå¤æ´ã«ãã£ã¦ã以åã¤ãã£ãæ©è½ãå£ãã¦ãã¾ããããªãã¨ãé²ããã
xv6ã®ç§»æ¤ä½æ¥ãéå§ãã¦ãããç¹ã«å¤§ããªãã°ãè¦ã¤ãããã¨ããªããå®å®ãã¦åä½ããã®ã§è¯ãã£ãã¨æãã
åãããã®ã¨ã
æçµçãªç®æ¨ã¯xv6ã®èªä½CPUä¸ã§ã®åä½ã§ãã£ãããããã¾ã§ã®éãã³ã³ãã¤ã©ã®ãã°çºè¦ãå ¼ãã¦ãããã¤ããããç¨åº¦ã®å¤§ããã®ããã°ã©ã ãã³ã³ãã¤ã«ããã¦ã¿ããããã ãã®ãã¨ã«ã¤ãã¦æ¸ãã
benz
ããã¯wasabizã®ã¤ãã£ã¦ããschemeå¦çç³»ã§ãã picrinã®ç§»æ¤åããµãã»ããã
ãã®é ã¯UCCããã¾ã æµ®åå°æ°ç¹æ°ã®å®è£ éä¸ã ã£ãããcharãç°¡åã®ããã«32bitã§æ±ã£ã¦ãããã(Cã®è¦æ ¼çã«ã¯ä¸å¿ããã§ãOKã ãã©ããã®å¾8bitã«ä¿®æ£ãã)ãbenzå´ã§ãè²ã ãªå¯¾å¿ããã¦ããã£ãã wasabizã®è¨äºã詳ããã
benzã¯libcéä¾åãªã®ã§ãUCCå´ã§ã¯æä½éå¿ è¦ãªã¢ã¼ããã¯ãã£ä¾åé¨åã§ãããsetjmpã¨mallocãå®è£ ããã mallocã¯K&Rã«è¼ã£ã¦ããå®è£ ããã£ã¦ããã®ã ããä»ã¾ã§mallocã®å®è£ ãªãã¦èãããã¨ããªãã£ãã®ã§ãåå¼·ã«ãªã£ããK&Rã¯å大ã
çµæãschemeã¤ã³ã¿ã¼ããªã¿ãèªä½CPUä¸ã§åãããã¡ããã¨GCã¨ãããã¦ããã ããã¾ã§ã¯ããã¹ãç¨ã§æ¸ããããã°ã©ã ããåãã¦ããªãã£ãã®ã§ãã¨ã¦ãå¬ããã£ãã
min-rt.c
CPUå®é¨ã¨ããã°ãã¬ã¤ãã¬ã¼ã·ã³ã°ã¨ããããã§ãã¬ã¤ãã¬ã¼ã·ã³ã°ããã°ã©ã ã§ããmin-rtãå®è¡ãããã£ãã®ã ããããã¯MinCamlã§å®è£ ããã¦ããã ã¨ããããã§ãmin-rt.mlãèªåã§Cã«ç§»æ¤ãã¦ããããåãããã ããã«ã¯æµ®åå°æ°ç¹æ°ã¾ããã®å®è£ ã®ãã°ãã§ãã¯ã¨ããå½¹ç®ããã£ãã
å¤æ°ãã¬ã¸ã¹ã¿ã«å²ãå½ã¦ã¦ããªãåãMinCamlãæ¹é ããã³ã³ãã¤ã©ã«ããã¹ã¦ãå®è¡å½ä»¤æ°ã¯å¤ããªã£ããããããå®æ©ã§å®åããã
min-rt.cã¯å²ã¨ä¸å¯§ã«ç§»æ¤ããã¤ããã ããããæ¥å¹´åº¦ä»¥éã¨ããCPUå®é¨ã§Cã³ã³ãã¤ã©ã¤ãããã¨ããã£ããããã¹ãããã°ã©ã ã¨ãã¦ä½¿ããã¨ãããã
ï¼è¿½è¨ï¼ã³ã¡ã³ãã¨twitterã§æãã£ãã¨ãããmin-rtã®Cå®è£ ã¯ããã¨ãããã«æ¢ã«åå¨ãã¦ããã ããããã³ã¡ã³ããã¿ãã¨ããªãªã¸ãã«ãããããã®ã30年以ä¸åã§ãããããããããè²ããªè¨èªã§æ¸ãç´ããã¦ããããããæ´å²ãæãããï¼
xv6
ãªãã¸ããªã¯ãã¡ãã
ããã¤ãæ¬å½ã ã£ãã
ãã®ããã«ã¯ãã³ã³ãã¤ã©ã®ä»ã«
- ã³ã¢ã®å¯¾å¿(å²ãè¾¼ã¿ãMMUã®å®è£ ãé«éå)
- ã·ãã¥ã¬ã¼ã¿ã»ã¢ã»ã³ãã©ã®å¼·å
- xv6ã®ã½ã¼ã¹ã³ã¼ãç解ã¨x86ä¾åé¨åæ¸ãæã
ã¨ããä»äºãå¿ è¦ã§ãã£ãã
ãããã«ã¤ãã¦ã¯ãã³ã³ãã¤ã©ã®éçºã¨ä¸¦è¡ãã¦ãä»ã®çå¡ãã¡ãåæ ãã¦ãããªã£ã¦ããã å®åã¾ã§ã«å ·ä½çã«ã©ããªãã¨ãè¡ã£ããã«ã¤ãã¦ã¯è©³ãããã¨ã¯åãææ¡ã§ãã¦ããªãé¨åãããã®ã§ãä»ã®çå¡ãè¨äºããã¦ããããã¨ã«æå¾ ã
3æ1æ¥ã«ã·ãã¥ã¬ã¼ã¿ä¸ã§åä½ãã9æ¥ã«å®æ©ã§åä½ããã OSä¿ãã³ã¢ä¿ãç·è¡¨ã¿ãããªã®ãã¤ãã£ã¦ãäºå®éãã«ãããæ¶åãã¦ãã£ã¦æçµçã«å®åã«ãã£ã¦ãã£ã¦ãã¦ãã¨ã¦ãå¼·ãã£ãã
è¿½è¨ : OS移æ¤ç(Xç)ã®ä»ã®çå¡ã®è¨äº
- ã³ã¢ä¿ (UCCä¿ãå ¼ä»»)
- OSä¿
ä¸å¿ã©ããªãã¨ãã§ããããã«ãªã£ãããæ¸ãã¦ããã
ï¼åã¯ãªã¼ãã¼ã¨ãã§ããªããä¸äººã®çå¡ã¨ãã¦ã³ã³ãã¤ã©ãã¤ãã£ãã ããªã®ã§ãåãææã¨ãã¦æ¸ãã®ã¯æ°ãå¼ãããã©ã誰ããããªãã®ã¯ãããªãã®ã§ï¼
ã¨ããããããã¢ã¨ãã¦ã¯ããã®Makefileã§
make run
ã¨ããã°ã
uccã¨ã·ãã¥ã¬ã¼ã¿ã¨ã¢ã»ã³ãã©ã¨xv6æ¬ä½ãã¯ãã¼ã³ããã¦ãã¦ãUCCã§OSãã³ã³ãã¤ã«ããã
ã·ãã¥ã¬ã¼ã¿ä¸ã§OSãèµ·åãã¦ãã·ã§ã«ã®ããã³ãããã§ã¦ããã¯ãã
ls
ã¨ããã°ãå®è¡å¯è½ãªã¦ã¼ã¶ã¼ããã°ã©ã ãã¿ããã
UCCèªä½ã®ã³ã³ãã¤ã«ã®ããã«ãOCamlã¨ããå¿
è¦ã
Ubuntuã¨Macã§åä½ç¢ºèªæ¸ãã·ã§ã«ã®è¨å®ã«ãã£ã¦ã¯ãã¾ããããªããã¨ãããããã
ï¼è¿½è¨ï¼Macã§ã¯ã·ãã¥ã¬ã¼ã¿å
ã®termiosã®è¨å®ã®åé¡ã§å
¥åãã§ããªãã£ã½ãï¼
追è¨(7/1) id:nullpo_headãEmscriptenã使ã£ã¦ããã©ã¦ã¶ä¸ã§ãã¢ãåãããããã«ããã®ã§ãæ軽ã«è©¦ããããã«ãªã£ããï¼å¼·ãï¼
https://nullpo-head.github.io/emcc-gaia-simu/xv6.html
追è¨ããã¾ã§
ã¦ã¼ã¶ã¼ããã°ã©ã ã¨ãã¦ã¯ãxv6ã«å ããã¯ãã£ã¦ããlsã¨ãcatã¨ãgrepã®ä»ã«ãslã¨ã2048ãªã©ãã¦ã¼ã¶ã¼ããã°ã©ã ãã¤ãã£ã¦ãããã®ã§ããããã§éã¹ãã2048ã¯è²ãã¤ãã¦ãã¦æ®éã«æ¥½ããã ãã¨ãviã©ã¤ã¯ãªã¹ã¯ãªã¼ã³ã¨ãã£ã¿ãããã OSä¿ãããã
ç°¡åãªã¢ã»ã³ãã©ãç¨æããã®ã§ãOSä¸ã§ã¢ã»ã³ããªããã°ã©ãã³ã°ãã§ããããã«ãªã£ãã
libcã¯xv6èªåã®ãã®ã¯è²§å¼±ã ã£ãã®ã§ãèªåãã¡ã§å®è£ ãããã®ãã¤ãã£ãããã®ãããFILEæ§é ä½ã¨ãã¤ããã¦ããã ã¡ãªã¿ã«fopenã¯K&Rã«è¼ã£ã¦ããå®è£ ããã£ã¦ããã®ã ããä»ã¾ã§fopenã®å®è£ ãªãã¦èãããã¨ããªãã£ãã®ã§ãåå¼·ã«ãªã£ããK&Rã¯å大ãï¼ï¼åãï¼
ããã¦ãCPUå®é¨ã¨ããã°ã¬ã¤ãã¬ã¨ããããã§ãOSå´ããmin-rtãå¼ã³åºããããã«ãããã min-rt.cã¯ã¦ã¼ã¶ã¼ããã°ã©ã ã¨ãã¦ã¯å¤§ããããã®ã§ãããã¤ã¹ã¨ãã¦ã«ã¼ãã«ã«çµã¿è¾¼ãã ã ãã®çµæãOSä¸ã§ã¬ã¤ãã¬ã¼ã·ã³ã°ãã§ããããã«ãªã£ãã
OSä¸ã§åä½ãã¦ããã®ã§ãã¿ã¤ãã¼å²ãè¾¼ã¿ã¨ãã®å¦çãå«ã¾ããã®ã§ãå®è¡æéã¯çã®CPUä¸ã§åããã®ãããèªæã«æéããããã®ã ããå®æ©ã§ã¯ããã°ã©ã ãã¼ãã®æéãå«ãã¦ã2å以å ã«åä½ãããã³ã¢ãã¨ã¦ãåªç§ã ã£ãã
ã¬ã¤ã㬠on OS on FPGAã¯ãåºç¤ã®ãã¡ããã®å¤¢ã§ãã£ãããæ£ç´å®ç¾ããã¨ã¯æã£ã¦ããªãã£ãã ããããå®éã«ãããã§ããã®ã¯æçµçºè¡¨ä¼ã®æ°æéåã ã£ãã®ã§ãæ¬å½ã«å¬ããã£ãã
ããæ®ã
ãããæéããã£ã¨ãã£ãããããããã£ããã¨ã«ã¤ãã¦æ¸ãã
libcã®å¼·å
UCCã§ä½ãã§ãããèããéç¨ã§ãLuaãªã©ã®è¨èªå¦çç³»ã®ã³ã³ãã¤ã«ãã¦ã¿ãã®ã ããææ³ã¯UCCã®ãµãã¼ããã¦ãããã®ã§ååã§ãã£ãããã ããlibcã«ä¾åãã¦ãããããæ念ããã æ¢åã®libcã移æ¤ããã¨ããæããã£ãããã¢ã¼ããã¯ãã£ä¾åã®é¨åããããæéããããããã ã£ãã®ã§ã諦ããã libcããµãã¼ãããã°ããã£ã¨ããããªãã¨ãã§ããã ããã
ã»ã«ãã³ã³ãã¤ã«
UCCã¯OCamlã§ããããCã³ã³ãã¤ã©ãªã®ã§ãã»ã«ãã³ã³ãã¤ã«ã¯ã§ããªãã ã§ããããã³ã³ãã¤ã©èªèº«ãCã§å®è£ ããã¦ãã¦ãã»ã«ãã³ã³ãã¤ã«ãã§ããã°ãOSä¸ã§Cè¨èªããã°ã©ãã³ã°ãã§ããã¯ãã§ããã
OCamlã¯è¨èªå¦çç³»ãä½ãè¨èªã¨ãã¦ã¯åªãã¦ããã¨æãããUCCãOCamlã§å®è£ ããã®ã¯æªãé¸æã§ã¯ãªãã£ãã¨æãã æ¬è³ªçã§ãªãã¨ããã§æ©ãã ããã°ãåãè¾¼ãã ããããã¨ã¯å°ãªãã£ãããå®è£ éãå°ãªãã¦æ¸ãã ã ã§ããããæéãååã«ãã£ãããäºä»£ç®ã®ã³ã³ãã¤ã©ãCã§å®è£ ãã¦ãããããããªãã
linuxã®ç§»æ¤
ããã¯UCCã®ã¨ãããããOS移æ¤çå ¨ä½ã®éæã ä»å移æ¤ããxv6ã¯æè²ç¨OSã¨ãããã¨ã§ãã³ã³ãã¯ãã§ãã£ãã ããã«æ¯ã¹ã¦å¤§ããlinuxãèªä½CPUä¸ã§åããããå¬ããããã¨ããæãã
ã¡ãªã¿ã«æçµçºè¡¨ã¯ããã£ããã©ãFPGAåºæ¿ã¯ã¾ã åãããã¦ãããããCPUå®é¨å»¶é·æ¦ã£ã¦ãã¨ã§ãããã¯ãããããããªãã
ææ³
CPUå®é¨ã¯ãã¤ãããªã£ããã¨ããã£ãããå ¨ä½ã¨ãã¦ããªã楽ãããã å¦ç§ã«å ¥ã£ãå½åã¯ãæ å ±ç§å¦ã®ãã¡ãã¢ã«ã´ãªãºã ã¨ãã¼ã¿æ§é ã¨ãã®ãã³ã³ãã¥ã¼ã¿ãã©ã使ããã¨ãããã£ã¨ä¸ã®ã¬ã¤ã¤ã¼ã®é¨åã«ããèå³ããªãã£ãããèå³ã®å¹ ãåºãã£ãã
OS移æ¤çã¯å
¨å¡ã§8人ãããã ã£ãããå²ã¨ãã¾ããã¼ã ã¨ãã¦æ©è½ãã¦ããããã«æããã
ã³ã¢ããOSã®ç§»æ¤ä½æ¥ããã·ãã¥ã¬ã¼ã¿ã»ã¢ã»ã³ãã©ã®ã©ããæ¬ ãã¦ãåããªãã£ããããªã®ã§ãã¿ããªããããªãã
ãããªã«æ¬æ ¼çãªå
±åéçºã®çµé¨ã¯ã¯ããã¦ã ã£ãã®ã§ãã¨ã¦ãè¯ãçµé¨ã«ãªã£ãã
ç¹ã«ãUCCãä¸ç·ã«éçºããä»ã®äºäººã¯ãã¨ã¦ãå¼·ã人ãã¡ã§ãè²ããªãã¨ãæãã£ãããæ¬å½ã«ãããããã£ãã
ã¬ã³ã¬ã³é²æãã¾ããããè¯ãç°å¢ã§ãã£ããªãã
ã¾ããCè¨èªã«ã¤ãã¦ããã¨ã¦ãç解ãæ·±ã¾ã£ãã
ã³ã³ãã¤ã©å®è£
å§ããã¨ãã¯ãCè¨èªã¯ã¯ããã¦è¦ããããã°ã©ãã³ã°è¨èªã§ããã2å¹´åãããã¤ãã£ã¦ãããããã£ã¦ãã¤ããã ã£ããã©ãå
¨ããããªãã¨ã¯ãªãç¥ããªããã¨ã°ã£ããã ã£ãã
K&Rã«ã¯å¤§å¤ãä¸è©±ã«ãªã£ããï¼ç¹ã«ä»é²ã®ç« ï¼
ãã¨å ¨ç¶é¢ä¿ãªãããããããã®ããã°ã®æåã®è¨äºã§ããã æ£ç´ãè¨äºããã®ãããã£ããã«ãªã£ã¦ãã¾ããããªäºæããã¦ããã ããã¯ãããªãã®ã§ãä»å¾ããªããæ¸ããã°ãããªãã
ããã