ãã¼ãããã®OSèªä½å ¥éãã Rust ã§ãã (第9ç« )
æ¹é éã®å¤ãç« ã ã¨æéãããã£ã¦ãã¾ãã¾ãããããããã¨ç¶ãã¦ããã¾ãã
- ã·ãªã¼ãºæåã®è¨äº: 「ゼロからのOS自作入門」を Rust でやる (第1章~第4章) - gifnksmの雑多なメモ
- åå: 「ゼロからのOS自作入門」を Rust でやる (第7章) - gifnksmの雑多なメモ
- 次å: 「ゼロからのOS自作入門」を Rust でやる (第10章~第12章) - gifnksmの雑多なメモ
- é¢é£è¨äºä¸è¦§: ゼロからのOS自作入門 カテゴリーの記事一覧 - gifnksmの雑多なメモ
第9ç«
ãã¦ã¹ã«ã¼ã½ã«ãåããã¨èæ¯ãã³ã³ã½ã¼ã«ã®æåãæ¶ãã¦ãã¾ãåé¡ã解決ããããã«ãéãåããå¦ç (ã¬ã¤ã¤ã¼) ãå°å ¥ããç« ã§ãã
éãåããã®å®è£ (day09a)
以ä¸ãå®è£ ãã¾ããã
- ãã¦ã¹ã«ã¼ã½ã«ããã¹ã¯ãããèæ¯ãªã©åå¥ã®æç»è¦ç´ ãæå³ãã
Window
æ§é ä½ã¨ãWindow
ã¸ã®æç»æ©è½ãæããWindowDrawer
æ§é ä½ã®è¿½å - éãåããã®åã
ã®é層ãæå³ãã
Layer
æ§é ä½ Layer
ã®éãåããé åºã Frame Buffer ã¸ã®æç»ãå¶å¾¡ããLayerManger
æ§é ä½Console
æ§é ä½ã®åä½å¤æ´ (LayerManager
ã®åæåã¾ã§ã¯ç´æ¥ãã¬ã¼ã ãããã¡ã«æç»ãåæåå¾ã¯Window
ã«æç»ããã¬ã¼ã ãããã¡ã¸ã®æç»ã¯LayerManager
ãè¡ã)
å®æ½ãã¦ãããã¨ã¯ C++ çã¨åæ§ãªã®ã§ãããå®è£ ã®è©³ç´°ãç°ãªãã¾ãã å ·ä½çã«ã¯ä»¥ä¸ã®å·®ç°ãããã¾ãã
- C++ ç:
LayerManager
ãã°ãã¼ãã«å¤æ°ã¨ãã¦å®ç¾©ãå Window ã®æ´æ°å¦çããç´æ¥ã¡ã½ãããå®è¡ - Rust ç: å
Window
ã®æ´æ°å¦çããã³LayerManager
ã®å¦çã¯ããããå°ç¨ã®CoTask
ã§å®æ½ãWindow
ã®æ´æ°å¦çã«ããç»é¢ã®åæç»ãå¿ è¦ã«ãªã£ãå ´åãLayerManager
ã®CoTask
ã¸ã¨ã¤ãã³ããéç¥ãããããåããLayerManager
ã®ã¿ã¹ã¯ãæç»ãè¡ã
ä¸è¨ãå®ç¾ããããã«ã sync::mpsc::{Sender, Receiver}
ã®ãã㪠async/await 対å¿ãããã¥ã¼ãä½æãã¾ããã
(ãã¦ã¹ã«ã¼ã½ã«ç§»åã®æã«ä½æãããã®ãå
±éçã«ä½¿ããæ§é ä½ã¨ãã¦å®ç¾©ããªããã¾ãã)
tokio ã® mpsc ãã¥ã¼ ã®å®è£
ã¯è¤éãªã®ã§ãã®ãããªæ§é ä½ãå®ç¾©ããã®ã¯é£ããã¨æã£ã¦ããã®ã§ãããæ©è½ãçµãã°ç°¡åã«å®è£
ãããã¨ãã§ãã¾ããã
ä¾ãã°ãä»åä½æãããã¥ã¼ã§ã¯ tokio ã® Receiver
or Sender
ã® drop å¾ã« send
/recv
ã Err
ã§å¾©å¸°ãããæ©è½ãªã©ã¯å®è£
ãã¦ãã¾ããã
EmergencyConsole
ã®è¿½å
éãåããå¦çã®å°å
¥ã«ãã LayerManager
åæåå¾ã¯ã Console
ã«æ¸ãè¾¼ãã æååã®æç»ã¯ LayerManager
ã® CoTask
ãè¡ãããã«ãªãã¾ããã
Console
ã¸æ¸ãè¾¼ãã æååãç»é¢ã«è¡¨ç¤ºãããããã«ã¯ async/await ã®ã©ã³ã¿ã¤ã (Executor
) ãå CoTask
ãæ£å¸¸ã«åä½ãã¦ããå¿
è¦ãããã¾ãã
é常ã®å¦ç㧠Console
ã使ãéãã¯åé¡ãªãã®ã§ããããããã¯ãã³ãã©ã¼ãä¾å¤ãã³ãã©ã¼ã®ä¸ã§æååãåºåãããå ´åãããã§ã¯åé¡ãããã¾ãã
ãã³ãã©ã¼å®è¡ä»¥éã¯ããã°ã©ã ã®å®è¡ãåæ¢ãã¦ãã¾ãã©ã³ã¿ã¤ã ãåä½ããªãããç»é¢ã«æååãæç»ãããªãããã§ãã
ãã®åé¡ã«å¯¾å¦ããããããããã¯ãã³ãã©ã¼ãä¾å¤ãã³ãã©ã¼ããã®æåå表示ã®ãã EmergencyConsole
ãå°å
¥ãã¾ããã
Console
ãæ¹é ãã¦ãè¯ãã£ãã®ã§ããããããã¯ãã³ãã©ã¼ãä¾å¤ãã³ãã©ã¼ããè¤éãªå¦çãè¡ãã¨æ£ããåä½ããªãå¯è½æ§ããã£ããããã·ã³ãã«ãªå¥æ§é ä½ã¨ãã¦è¿½å ãã¾ããã
EmergencyConsole
ã§ã¯ãã¬ã¼ã ãããã¡ãå©ç¨ãã¦ç»é¢æç»ããã®ã§ããããã³ãã©ã¼å¼åºãæã®ç¶æ³ã«ãã£ã¦ã¯ãã¬ã¼ã ãããã¡ã®ããã¯ãåããã¦ãããæ®éã«ããã¯ãã¨ãã¨ãããããã¯ãã¦ãã¾ãå¯è½æ§ãããã¾ãã
ããã«å¯¾å¦ããããã EmergencyConsole
ããããã¯åå¾ããå ´åã¯ãæ¢åã®ããã¯ãå¼·å¶çã«ã¢ã³ããã¯ããä¸ã§ããã¯ãåå¾ããããã«ãã¦ãã¾ãã
ã¿ã¤ãã¼ã®å®è£ (day09b)
æ§è½æ¸¬å®ã®ããã« Local APIC ã¿ã¤ãã¼ã使ããããã«ããç¯ã§ãã
å®è£ ã«ã¤ãã¦ã¯ç¹ã«ã³ã¡ã³ãã¯ãªãã§ãã
ã·ã£ãã¦ãããã¡ã®è¿½å (day09c)
å¾æ¥å¦çã§ã¯ãã¬ã¼ã ãããã¡ã¸ã®æç»æã«æ¯å Color
æ§é ä½ãããã¬ã¼ã ãããã¡ã® byte é
åãã©ã¼ãããã¸ã® pixel æ¯ã«å¤æãã¦ãã¾ãããç»é¢ãµã¤ãºã大ããã¨ããã®å¦çã®è² è·ã¯å¤§ãããªãã¾ãã
ãããæ¹åããããããã¬ã¼ã ãããã¡ã¨åããã©ã¼ãããã§ãã¼ã¿ãä¿æããã·ã£ãã¦ãããã¡ãå Window
ã«æããã ãã¬ã¼ã ãããã¡ã¸ã®æç»æã¯ãã®ã·ã£ãã¦ãããã¡ã®å
容ãã³ãã¼ (memcpy
) ãããããªæ¹å¼ã¸ã¨å¤æ´ãã¾ããã
ããã«ãã Color
æ§é ä½ãã byte é
åãã©ã¼ãããã¸ã®å¤æãæç»ã®åº¦ã«æ¯åè¡ããããã¨ããªããªããæ§è½ãæ¹åããã¾ãã
C++ çã¨ã¯ç°ãªãã ShadowBuffer
ã¨ããå°ç¨æ§é ä½ãç¨æãã¦ãã¾ã (ãã®å¾ã®ã³ãããã§å¤æ´ããã¾ãã)ã
ã³ã³ã½ã¼ã«ã®ã¹ã¯ãã¼ã«é度ã測å®ãã (day09d)
ã³ã³ã½ã¼ã«ã®ã¹ã¯ãã¼ã«é度ã測å®ããããã¿ã¤ãã¼ãè¨å®ãã¦ãã¾ãã
C++ çã¨ã¯ç°ãªããå®éã®æç»å¦ç㯠LayerManager
ã® CoTask
ã§è¡ãããã®ã§ãæé測å®å¦çãå½è©² CoTask
ã«è¿½å ãã¦ãã¾ãã
ã¾ããã©ã® CoTask
ããã®æç»ä¾é ¼ããåºå¥ããããã CoTask
éã§ããã¨ãããã¡ãã»ã¼ã¸ã«æç»æé測å®å¯¾è±¡ãå¦ããæå³ãããã©ã°ã追å ãã¦ãã¾ãã
ShadowBuffer
㨠FrameBuffer
ã®å®è£
å
±éå
å
ã®ç¯ã§ ShawdorBuffer
㯠FrameBuffer
ã¯å¥ã®æ§é ä½ã¨ãã¦å®è£
ãã¦ãã¾ããã
両è
å
±ç»é¢ã®æç»ãè¡ãã¨ããç¹ã¯å
±éã§ãæç»å¯¾è±¡ã Vec<u8>
ã FrameBuffer
ããéãã ãã§ãã
å®è£
å
±éåã®ãã Vec<u8>
㨠FrameBuffer
ãæ½è±¡åãã Buffer
ãã¬ã¤ããè¨ãã Buffer
ãã¬ã¤ããå®è£
ããåã«å¯¾ãã¦æç»ãã BufferDrawer
ã¨ããæ§é ä½ãå°å
¥ãã¾ããã
ã³ã³ã½ã¼ã«ã®æ§è½æ¹å (day09e)
ã³ã³ã½ã¼ã«ã®ã¹ã¯ãã¼ã«æãã³ã³ã½ã¼ã«ã®æç»ç¯å²å
¨ä½ã«å¯¾ãã¦æåã®åæç»ãè¡ã£ã¦ãã¾ããã
æåã®æç»ã®ããã«ã¯åæåã®åå½¢ã«å¿ãã¦ãããåä½ã§æç»ããå¿
è¦ããããé常ã«æéããããã¾ãã
ããããæç»ç¯å²å
¨ä½ãä¸æ¹åã«ç§»åããããã¨ã§åç´ãª memcpy
ã§æ¸ãããã«ãå¦çãé«éåãã¾ããã
ã¾ã¨ã
éãåããå¦çãå®è£ ãããã¦ã¹ã«ã¼ã½ã«ãåããã¦ãèæ¯ãæ¶ãããã¨ããªããªãã¾ããã ã¾ããéãåããå¦çã®æ§è½æ¹åã«ããããã¦ã¹ã«ã¼ã½ã«ã®æç»èªä½ãé«éã«ãªã£ãæ°ããã¾ãã
ã¾ãã C++ å®è£ ããªããªãã« Rust ãããå®è£ ã¸ã¨å¤æ´ã§ãã¦ããã®ã§ã¯ãªãã§ããããã ãã®èª¿åã§æ¬¡ç« ãé²ãã§ããããã§ãã
- ã·ãªã¼ãºæåã®è¨äº: 「ゼロからのOS自作入門」を Rust でやる (第1章~第4章) - gifnksmの雑多なメモ
- åå: 「ゼロからのOS自作入門」を Rust でやる (第7章) - gifnksmの雑多なメモ
- 次å: 「ゼロからのOS自作入門」を Rust でやる (第10章~第12章) - gifnksmの雑多なメモ
- é¢é£è¨äºä¸è¦§: ゼロからのOS自作入門 カテゴリーの記事一覧 - gifnksmの雑多なメモ