ãã®èšäºã§ã¯ãã³ã¢ã«ããŒãžã¡ã¢ãªãµããŒããå®è£
ããæ¹æ³ã説æããŸãã ãŸããç©çããŒãžããŒãã«ã®ãã¬ãŒã ãã«ãŒãã«ã§äœ¿çšã§ããããã«ããŸããŸãªæ¹æ³ãæ€èšãããããã®é·æãšçæã«ã€ããŠèª¬æããŸãã æ¬¡ã«ãã¢ãã¬ã¹å€ææ©èœãšæ°ãããããã³ã°ãäœæããæ©èœãå®è£
ããŸãã
GitHubã§å
¬éããããã®äžé£ã®èšäºã ã質åãåé¡ãããå Žåã¯ã察å¿ãããã±ãããããã§éããŠãã ããã èšäºã®ãã¹ãŠã®ãœãŒã¹
ã¯ãã®ã¹ã¬ããã«ãããŸã ã
ããŒãžã³ã°ã«é¢ããå¥ã®èšäºïŒ
ãã®ãµã€ã¯ã«ã«åŸããšã1ææ«ã«èšäºãããŒãžã¡ã¢ãªïŒäžçŽã¬ãã«ãã衚瀺ãããŸãã ããããååž°çãªããŒãžããŒãã«ã«ã€ããŠã¯æ¹å€ãåããŸããã ãããã£ãŠããã¬ãŒã ã«ã¢ã¯ã»ã¹ããããã®å¥ã®ã¢ãããŒãã䜿çšããŠãèšäºãæžãçŽãããšã«ããŸããããããæ°ãããªãã·ã§ã³ã§ãã ãã®èšäºã§ã¯ãååž°çãªããŒãžããŒãã«ã®æ©èœã«ã€ããŠèª¬æããŠããŸãããããã·ã³ãã«ã§åŒ·åãªå®è£
ã䜿çšããŠããŸãã 以åã®èšäºã¯åé€ããŸããããå€ãèšäºãšããŠããŒã¯ããæŽæ°ããŸããã
æ°ãããªãã·ã§ã³ããæ¥œãã¿ãã ããïŒå
容
ã¯ããã«
ååã®èšäºãããããŒãžã³ã°ã¡ã¢ãªã®åçãš
x86_64
4ã¬ãã«ããŒãžããŒãã«ã®ä»çµã¿ã«ã€ããŠåŠã³ãŸããã ãŸããããŒããŒãã«ãŒãã«ã®ããŒãžããŒãã«éå±€ãæ¢ã«èšå®ããŠãããããã«ãŒãã«ã¯ä»®æ³ã¢ãã¬ã¹ã§å®è¡ãããŸãã ããã«ãããç©çã¡ã¢ãªãã©ã³ãã ã«å€æŽããã®ã§ã¯ãªããã¡ã¢ãªãžã®äžæ£ã¢ã¯ã»ã¹ã«ããããŒãžãã©ãŒã«ããçºçãããããã»ãã¥ãªãã£ãåäžããŸãã
ãã®èšäºã¯ãç©çã¡ã¢ãªã«ä¿åãããŠãããã«ãŒãã«ãæ¢ã«ä»®æ³ã¢ãã¬ã¹ã§å®è¡ãããŠãããããã«ãŒãã«ããããŒãžããŒãã«ã«ã¢ã¯ã»ã¹ã§ããªããªããŸããã ããã§ãããã¯ãç¶ç¶ããã«ãŒãã«ããããŒãžããŒãã«ã®ãã¬ãŒã ã«ã¢ã¯ã»ã¹ããããã®ããŸããŸãªãªãã·ã§ã³ãæ€èšããŸãã ããããã®é·æãšçæã«ã€ããŠèª¬æããã³ã¢ã«é©ãããªãã·ã§ã³ãéžæããŸãã
ããŒãããŒããŒã®ãµããŒããå¿
èŠãªã®ã§ãæåã«æ§æããŸãã æ¬¡ã«ãä»®æ³ã¢ãã¬ã¹ãç©çã¢ãã¬ã¹ã«å€æããããã«ãããŒãžããŒãã«ã®éå±€å
šäœãå®è¡ãã颿°ãå®è£
ããŸãã æåŸã«ãããŒãžããŒãã«ã«æ°ãããããã³ã°ãäœæããæ¹æ³ãšãæªäœ¿çšã®ã¡ã¢ãªãã¬ãŒã ãèŠã€ããŠæ°ããããŒãã«ãäœæããæ¹æ³ãåŠç¿ããŸãã
äŸåé¢ä¿ã®æŽæ°
ãã®èšäºã§ã¯ãäŸåé¢ä¿ã«
bootloader
ããŒãžã§ã³0.4.0以éããã³
x86_64
ããŒãžã§ã³0.5.2以éãç»é²ããå¿
èŠããããŸãã
Cargo.toml
ã®äŸåé¢ä¿ãæŽæ°ã§ããŸãã
[dependencies] bootloader = "0.4.0" x86_64 = "0.5.2"
ãããã®ããŒãžã§ã³ã®å€æŽã«ã€ããŠ
ã¯ãããŒãããŒããŒãã°ãš
x86_64ãã°ãåç
§ããŠãã ããã
ããŒãžããŒãã«ãžã®ã¢ã¯ã»ã¹
ã«ãŒãã«ããããŒãžããŒãã«ã«ã¢ã¯ã»ã¹ããããšã¯ãèŠããã»ã©ç°¡åã§ã¯ãããŸããã åé¡ãçè§£ããã«ã¯ãåã®èšäºã®4ã¬ãã«ã®ããŒãã«éå±€ãããäžåºŠèŠãŠãã ããã
éèŠãªããšã¯ãåããŒãžãšã³ããªã次ã®ããŒãã«ã®
ç©çã¢ãã¬ã¹ãæ ŒçŽããããšã§ãã ããã«ããããããã®ã¢ãã¬ã¹ã®å€æãåé¿ããããããããã©ãŒãã³ã¹ãäœäžããç¡éã«ãŒããçºçãããããªããŸãã
åé¡ã¯ãä»®æ³ã¢ãã¬ã¹ã§ãæ©èœãããããã«ãŒãã«ããç©çã¢ãã¬ã¹ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããªãããšã§ãã ããšãã°ãã¢ãã¬ã¹
4 KiB
ã«ã¢ã¯ã»ã¹ãããšã4çªç®ã®ã¬ãã«ã®ããŒãžã®ããŒãã«ãæ ŒçŽãããŠãã
ç©çã¢ãã¬ã¹ã§ã¯ãªãã
ä»®æ³ã¢ãã¬ã¹
4 KiB
ã«ã¢ã¯ã»ã¹ã§ããŸãã
4 KiB
ç©çã¢ãã¬ã¹ã«ã¢ã¯ã»ã¹ããå Žåã¯ãããã«å€æãããä»®æ³ã¢ãã¬ã¹ã䜿çšããå¿
èŠããããŸãã
ãããã£ãŠãããŒãžããŒãã«ã®ãã¬ãŒã ã«ã¢ã¯ã»ã¹ããã«ã¯ããããã®ãã¬ãŒã ã«ããã€ãã®ä»®æ³ããŒãžããããããå¿
èŠããããŸãã ãã®ãããªãããã³ã°ãäœæããæ¹æ³ã¯ããã€ããããŸãã
ã¢ã€ãã³ãã£ãã£ãŒãããã³ã°
ç°¡åãªè§£æ±ºçã¯ã
ãã¹ãŠã®ããŒãžããŒãã«ãåäžã«è¡šç€ºããããš
ã§ã ã
ãã®äŸã§ã¯ãåããã¬ãŒã 衚瀺ãèŠãããŸãã ããŒãžããŒãã«ã®ç©çã¢ãã¬ã¹ã¯ãåæã«æå¹ãªä»®æ³ã¢ãã¬ã¹ãªã®ã§ãã¬ãžã¹ã¿CR3ããéå§ããŠããã¹ãŠã®ã¬ãã«ã®ããŒãžããŒãã«ã«ç°¡åã«ã¢ã¯ã»ã¹ã§ããŸãã
ãã ãããã®æ¹æ³ã§ã¯ä»®æ³ã¢ãã¬ã¹ç©ºéãä¹±éã«ãªãã空ãã¡ã¢ãªã®å€§ããªé£ç¶ããé åãèŠã€ããããšãé£ãããªããŸãã ããšãã°ã
ã¡ã¢ãªå
ã®ãã¡ã€ã«ã
衚瀺ããããã«ãäžã®å³ã§1000 KiBã®ä»®æ³ã¡ã¢ãªé åãäœæãããš
ããŸã ã
28 KiB
ãªãŒãžã§ã³ããéå§ããããšã¯ã§ããŸãã
28 KiB
ãã§ã«å æãããŠããããŒãžã«
1004 KiB
ã§ãã ãããã£ãŠãããšãã°
1008 KiB
ãªã©ã®é©åãªå€§ããªãã©ã°ã¡ã³ããèŠã€ãããŸã§ãããã«æ€çŽ¢ããå¿
èŠããããŸãã ã»ã°ã¡ã³ãåãããã¡ã¢ãªãšåããã©ã°ã¡ã³ããŒã·ã§ã³ã®åé¡ããããŸãã
ããã«ã察å¿ããããŒãžããŸã 䜿çšãããŠããªãç©çãã¬ãŒã ãèŠã€ããå¿
èŠããããããæ°ããããŒãžããŒãã«ã®äœæã¯ã¯ããã«è€éã§ãã ããšãã°ããã¡ã€ã«ã®å Žåãã¢ãã¬ã¹
1008 KiB
ããå§ãŸã1000 KiBã®
ä»®æ³ã¡ã¢ãªã®é åãäºçŽããŸããã åãããã«è¡šç€ºã§ããªããããç©çã¢ãã¬ã¹ã
1000 KiB
ãã¬ãŒã ã¯äœ¿çšã§ããªããªããŸããã
åºå®ãªãã»ããããã
ä»®æ³ã¢ãã¬ã¹ç©ºéãä¹±éã«ãªãã®ãé¿ããããã«ãããŒãžããŒãã«ã
å¥ã®ã¡ã¢ãªé åã«è¡šç€ºã§ããŸãã ãããã£ãŠãåãããã«ãããã³ã°ãã代ããã«ãä»®æ³ã¢ãã¬ã¹ç©ºéã«åºå®ãªãã»ããã§ãã¬ãŒã ããããã³ã°ããŸãã ããšãã°ããªãã»ããã¯10 TiBã§ãã

ãã®ç¯å²ã®ä»®æ³ã¡ã¢ãªãããŒãžããŒãã«ã®è¡šç€ºå°çšã«å²ãåœãŠãããšã«ãããåäžã®è¡šç€ºã®åé¡ãåé¿ã§ããŸãã ä»®æ³ã¢ãã¬ã¹ç©ºéã®ãã®ãããªå€§ããªé åã®äºçŽã¯ãä»®æ³ã¢ãã¬ã¹ç©ºéãç©çã¡ã¢ãªã®ãµã€ãºãããã¯ããã«å€§ããå Žåã«ã®ã¿å¯èœã§ãã
x86_64
ã48ãããã¢ãã¬ã¹ç©ºéã256 TiBã§ãããã
x86_64
ããã¯åé¡ã§ã¯ãããŸããã
ãã ãããã®æ¹æ³ã«ã¯ãåããŒãžããŒãã«ãäœæãããšãã«æ°ãããããã³ã°ãäœæããå¿
èŠããããšããæ¬ ç¹ããããŸãã ããã«ãä»ã®ã¢ãã¬ã¹ç©ºéã®ããŒãã«ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããŸãããããã¯ãæ°ããããã»ã¹ãäœæãããšãã«åœ¹ç«ã¡ãŸãã
å®å
šãªç©çã¡ã¢ãªãããã³ã°
ãããã®åé¡ã¯ãããŒãžããŒãã«ãã¬ãŒã ã ãã§ãªãã
ãã¹ãŠã®ç©çã¡ã¢ãªã衚瀺ããããšã§è§£æ±ºã§ããŸãã

ãã®ã¢ãããŒãã«ãããã«ãŒãã«ã¯ãä»ã®ã¢ãã¬ã¹ã¹ããŒã¹ã®ããŒãžããŒãã«ãã¬ãŒã ãå«ãä»»æã®ç©çã¡ã¢ãªã«ã¢ã¯ã»ã¹ã§ããŸãã ä»®æ³ã¡ã¢ãªã®ç¯å²ã¯ä»¥åãšåããµã€ãºã§äºçŽãããŠããŸãããäžèŽããªãããŒãžã¯æ®ã£ãŠããŸããã
ãã®ã¢ãããŒãã®æ¬ ç¹ã¯ãç©çã¡ã¢ãªã衚瀺ããããã«è¿œå ã®ããŒãžããŒãã«ãå¿
èŠã«ãªãããšã§ãã ãããã®ããŒãžããŒãã«ã¯ã©ããã«æ ŒçŽããå¿
èŠããããããç©çã¡ã¢ãªã®äžéšã䜿çšããŸããããã¯ãå°éã®RAMãæèŒããããã€ã¹ã§ã¯åé¡ã«ãªãå¯èœæ§ããããŸãã
ãã ããx86_64ã§ã¯ãããã©ã«ããµã€ãºã®4 KiBã®ä»£ããã«ã
巚倧㪠2 MiB
ããŒãžã䜿çšããŠè¡šç€ºã§ããŸãã ãããã£ãŠã32 GiBã®ç©çã¡ã¢ãªã衚瀺ããã«ã¯ãããŒãžããšã«132 KiBã®ã¿ãå¿
èŠã§ãã1ã€ã®ç¬¬3ã¬ãã«ããŒãã«ãš32ã®ç¬¬2ã¬ãã«ããŒãã«ã®ã¿ã§ãã 巚倧ãªããŒãžã¯ãåç倿ãããã¡ïŒTLBïŒã§äœ¿çšãããšã³ããªãå°ãªããããããå¹ççã«ãã£ãã·ã¥ãããŸãã
äžæçãªè¡šç€º
ç©çã¡ã¢ãªãéåžžã«å°ãªãããã€ã¹ã®å Žåã
ããŒãžããŒãã«ã«ã¢ã¯ã»ã¹ããå¿
èŠãããå Žåã«ã®ã¿
äžæçã«
ããŒãžããŒãã«ã衚瀺ã§ããŸãã äžæçãªæ¯èŒã®å Žåãæåã®ã¬ãã«ã®ããŒãã«ã®ã¿ã®åäžã®è¡šç€ºãå¿
èŠã§ãã
ãã®å³ã§ã¯ãã¬ãã«1ããŒãã«ãä»®æ³ã¢ãã¬ã¹ç©ºéã®æåã®2 MiBã管çããŸãã ããã¯ãã¬ãã«4ã3ãããã³2ã®ããŒãã«ã®ãã«ãšã³ããªãä»ããŠCR3ã¬ãžã¹ã¿ããã¢ã¯ã»ã¹ãå®è¡ãããããã«å¯èœã§ããã€ã³ããã¯ã¹
8
ã®ã¬ã³ãŒãã¯ã
32 KiB
ä»®æ³ããŒãžã
32 KiB
ã®ç©çãã¬ãŒã ã«å€æããããã«ãã£ãŠã¬ãã«1ããŒãã«èªäœãèå¥ããŸããããã¯ãå³ã®æ°Žå¹³ç¢å°ã§ç€ºãããŠããŸãã
ã¬ãã«1ã®åäžã«ãããã³ã°ãããããŒãã«ã«æžã蟌ãããšã«ãããã«ãŒãã«ã¯æå€§511åã®æéæ¯èŒïŒ512ããIDãããã³ã°ã«å¿
èŠãªã¬ã³ãŒããæžç®ïŒãäœæã§ããŸãã äžèšã®äŸã§ã¯ãã«ãŒãã«ã¯2ã€ã®æéæ¯èŒãäœæããŸãã
- ã¬ãã«1ã®ããŒãã«ã®ãã«ã¬ã³ãŒãã
24 KiB
ãã¬ãŒã ãšäžèŽãããŸãã ããã«ããã 0 KiB
ä»®æ³ããŒãžãããç¹ç·ã®ç¢å°ã§ç€ºãããŠããããŒãžã¬ãã«2ããŒãã«ã®ç©çãã¬ãŒã ãžã®äžæçãªãããã³ã°ãäœæãããŸãã - ã¬ãã«1ã®ããŒãã«ã®9çªç®ã®ã¬ã³ãŒãã
4 KiB
ãã¬ãŒã ãšäžèŽãããŸãã ããã«ããã 36 KiB
ä»®æ³ããŒãžãããç¹ç·ã®ç¢å°ã§ç€ºãããŠããããŒãžã¬ãã«4ããŒãã«ã®ç©çãã¬ãŒã ãžã®äžæçãªãããã³ã°ãäœæãããŸãã
ããã§ãã«ãŒãã«ã¯
0 KiB
ã§å§ãŸãããŒãžã«æžã蟌ãããšã§ã¬ãã«2ã®ããŒãã«ã«ã¢ã¯ã»ã¹ã§ãã
33 KiB
ã§å§ãŸãããŒãžã«æžã蟌ãããšã§ã¬ãã«4ã®ããŒãã«ã«ã¢ã¯ã»ã¹ã§ããŸãã
ãããã£ãŠãäžæãããã³ã°ã䜿çšããããŒãžããŒãã«ã®ä»»æã®ãã¬ãŒã ãžã®ã¢ã¯ã»ã¹ã¯ã次ã®ã¢ã¯ã·ã§ã³ã§æ§æãããŸãã
- åãããã«è¡šç€ºãããã¬ãã«1ã®è¡šã§ç¡æã®ãšã³ããªãèŠã€ããŸãã
- ãã®ãšã³ããªããã¢ã¯ã»ã¹ããããŒãžããŒãã«ã®ç©çãã¬ãŒã ã«ãããããŸãã
- ãšã³ããªã«é¢é£ä»ããããä»®æ³ããŒãžãä»ããŠãã®ãã¬ãŒã ã«ã¢ã¯ã»ã¹ããŸãã
- ã¬ã³ãŒããæªäœ¿çšã«æ»ããäžæãããã³ã°ãåé€ããŸãã
ãã®ã¢ãããŒãã§ã¯ãåã512ã®ä»®æ³ããŒãžãåžžã«äœ¿çšããããããä»®æ³ã¢ãã¬ã¹ç©ºéã¯ã¯ãªãŒã³ãªãŸãŸã§ãã äžå©ãªç¹ã¯ãç¹ã«æ°ããæ¯èŒã§ã¯ããŒãã«ã®ããã€ãã®ã¬ãã«ã倿Žããå¿
èŠããããããå€å°ã®ç
©éãã§ããã€ãŸãã説æããããã»ã¹ãæ°åç¹°ãè¿ãå¿
èŠããããŸãã
ååž°ããŒãžããŒãã«
远å ã®ããŒãžããŒãã«ããŸã£ããå¿
èŠãšããªãå¥ã®è峿·±ãã¢ãããŒãã¯ã
ååž°çãªãããã³ã°ã§ãã
èãæ¹ã¯ã第4ã¬ãã«ã®ããŒãã«ããã®ã¬ã³ãŒããããèªäœã«å€æããããšã§ãã ãããã£ãŠãä»®æ³ã¢ãã¬ã¹ç©ºéã®äžéšãå®éã«äºçŽããçŸåšããã³å°æ¥ã®ãã¹ãŠã®ããŒãã«ãã¬ãŒã ããã®ç©ºéã«ãããã³ã°ããŸãã
ãããã©ã®ããã«æ©èœããããçè§£ããããã«äŸãèŠãŠã¿ãŸãããïŒ
èšäºã®åé ã®äŸãšã®å¯äžã®éãã¯ããã®ããŒãã«èªäœã«ããç©çãã¬ãŒã
4 KiB
ã«ãããã³ã°ããããã¬ãã«4ããŒãã«ã®ã€ã³ããã¯ã¹
511
ãæã€è¿œå ã®ã¬ã³ãŒãã§ãã
CPUããã®ã¬ã³ãŒããåŠçãããšããCPUã¯ã¬ãã«3ã®ããŒãã«ãåç
§ãããã¬ãã«4ã®ããŒãã«ãåã³åç
§ããŸãããã¯ãèªåèªèº«ãåŒã³åºãååž°é¢æ°ã«äŒŒãŠããŸãã ããã»ããµã¯ãã¬ãã«4ããŒãã«ã®åã¬ã³ãŒããã¬ãã«3ããŒãã«ãæããŠãããšæ³å®ããããšãéèŠã§ãããããã¬ãã«4ããŒãã«ãã¬ãã«3ããŒãã«ãšããŠæ±ããŸããããã¯ãx86_64ã®ãã¹ãŠã®ã¬ãã«ã®ããŒãã«ãåãæ§é ãæã€ããã§ãã
å®éã®å€æãéå§ããåã«ååž°ã¬ã³ãŒãã1å以äžè¿œè·¡ããããšã«ãããããã»ããµãééããã¬ãã«ã®æ°ã广çã«æžããããšãã§ããŸãã ããšãã°ãååž°ã¬ã³ãŒãã1åãã©ã£ãŠã¬ãã«3ã®ããŒãã«ã«ç§»åãããšãããã»ããµã¯ã¬ãã«3ã®ããŒãã«ãã¬ãã«2ã®ããŒãã«ã§ãããšå€æããŸããç©çã¡ã¢ãªå
ã®ãã¬ãŒã ã ããã¯ãããã»ããµãããããã¬ãŒã ã§ãããšèªèããŠãããããã¬ãã«1ããŒãžããŒãã«ã®èªã¿åããšæžã蟌ã¿ãã§ããããã«ãªã£ãããšãæå³ããŸãã æ¬¡ã®å³ã¯ããã®ãããªç¿»èš³ã®5ã€ã®ã¹ãããã瀺ããŠããŸãã
åæ§ã«ã倿ãéå§ããåã«ååž°çãªãšã³ããªã2åãã©ã£ãŠãå®äºããã¬ãã«ã®æ°ã2ã€ã«æžããããšãã§ããŸãã
ãã®æé ãã¹ãããããšã«èŠãŠãããŸãããã ãŸããCPUã¯ã¬ãã«4ã®ããŒãã«ã®ååž°çãšã³ããªã«åŸãããããã¬ãã«3ã®ããŒãã«ã«å°éãããšèããæ¬¡ã«ååž°çã¬ã³ãŒãã远跡ããã¬ãã«2ã«å°éãããšèããŸããããããå®éã«ã¯ã¬ãã«4ã®ãŸãŸã§ããã¬ãã«3ã®ããŒãã«ã«ãªããŸããããã§ã«ã¬ãã«1ã®ããŒãã«ã«ãããšèããŸããæåŸã«ãã¬ãã«2ã®ããŒãã«ã®æ¬¡ã®ãšã³ããªãã€ã³ãã§ãããã»ããµã¯ç©çã¡ã¢ãªãã¬ãŒã ã«ã¢ã¯ã»ã¹ãããšå€æããŸãã ããã«ãããã¬ãã«2ã®ããŒãã«ãèªã¿æžãã§ããŸãã
ã¬ãã«3ããã³4ã®ããŒãã«ã«ãã¢ã¯ã»ã¹ããŸããã¬ãã«3ã®ããŒãã«ã«ã¢ã¯ã»ã¹ããã«ã¯ãååž°çãªãšã³ããªã3åå®è¡ããŸããããã»ããµã¯ãã¬ãã«1ã®ããŒãã«ã«æ¢ã«ãããšå€æããæ¬¡ã®ã¹ãããã§CPUããããã³ã°ãã¬ãŒã ãšèŠãªãã¬ãã«3ã«å°éããŸãã ã¬ãã«4ã®ããŒãã«èªäœã«ã¢ã¯ã»ã¹ããã«ã¯ãããã»ããµãã¬ãã«4ã®ããŒãã«èªäœããããã³ã°ããããã¬ãŒã ãšããŠåŠçãããŸã§ãååž°ã¬ã³ãŒãã4åãã©ãã ãã§ãïŒäžå³ã®éè²ïŒã
æŠå¿µã¯æåã¯çè§£ããã®ãé£ããã§ãããå®éã«ã¯ããªãããŸãæ©èœããŸãã
ã¢ãã¬ã¹èšç®
ãããã£ãŠãååž°ã¬ã³ãŒãã1å以äžè¿œè·¡ããããšã§ããã¹ãŠã®ã¬ãã«ã®ããŒãã«ã«ã¢ã¯ã»ã¹ã§ããŸãã 4ã¬ãã«ã®ããŒãã«ã®ã€ã³ããã¯ã¹ã¯ä»®æ³ã¢ãã¬ã¹ããçŽæ¥æŽŸçããããããã®ã¡ãœããã«ã¯ç¹å¥ãªä»®æ³ã¢ãã¬ã¹ãäœæããå¿
èŠããããŸãã èŠããŠããããã«ãããŒãžããŒãã«ã€ã³ããã¯ã¹ã¯æ¬¡ã®ããã«ã¢ãã¬ã¹ããæœåºãããŸãã
ç¹å®ã®ããŒãžã衚瀺ããã¬ãã«1ã®ããŒãã«ã«ã¢ã¯ã»ã¹ãããšããŸãã äžèšã§åŠãã ããã«ãååž°çãªã¬ã³ãŒãã1åééããŠããã4çªç®ã3çªç®ã2çªç®ã®ã¬ãã«ã®ã€ã³ããã¯ã¹ã調ã¹ãå¿
èŠããããŸãã ãããè¡ãã«ã¯ããã¹ãŠã®ã¢ãã¬ã¹ãããã¯ã1ãããã¯å³ã«ç§»åããååž°ã¬ã³ãŒãã®ã€ã³ããã¯ã¹ãã¬ãã«4ã®åæã€ã³ããã¯ã¹ã®å Žæã«èšå®ããŸãã
ãã®ããŒãžã®ã¬ãã«2ã®ããŒãã«ã«ã¢ã¯ã»ã¹ããã«ã¯ããã¹ãŠã®ã€ã³ããã¯ã¹ãããã¯ã2ãããã¯å³ã«ç§»åããååž°ã€ã³ããã¯ã¹ãäž¡æ¹ã®ãœãŒã¹ãããã¯ã®å ŽæïŒã¬ãã«4ããã³ã¬ãã«3ïŒã«èšå®ããŸãã
ã¬ãã«3ã®ããŒãã«ã«ã¢ã¯ã»ã¹ããã«ã¯ãåãããšãè¡ããŸãããã§ã«3ã€ã®ã¢ãã¬ã¹ãããã¯ãå³ã«ã·ããããŸãã
æåŸã«ãã¬ãã«4ã®ããŒãã«ã«ã¢ã¯ã»ã¹ããããã«ããã¹ãŠã4ãããã¯å³ã«ã·ããããŸãã
ããã§ã4ã€ã®ã¬ãã«ãã¹ãŠã®ããŒãžããŒãã«ã®ä»®æ³ã¢ãã¬ã¹ãèšç®ã§ããŸãã ã€ã³ããã¯ã¹ã«ããŒãžããŒãã«ãšã³ããªã®ãµã€ãºã§ãã8ãæããããšã§ãç¹å®ã®ããŒãžããŒãã«ãšã³ããªãæ£ç¢ºã«æãã¢ãã¬ã¹ãèšç®ããããšãã§ããŸãã
次ã®è¡šã¯ãããŸããŸãªã¿ã€ãã®ãã¬ãŒã ã«ã¢ã¯ã»ã¹ããããã®ã¢ãã¬ã¹ã®æ§é ã瀺ããŠããŸãã
ã®ä»®æ³ã¢ãã¬ã¹ | ã¢ãã¬ã¹æ§é ïŒ 8鲿° ïŒ |
---|
ããŒãž | 0o_SSSSSS_AAA_BBB_CCC_DDD_EEEE |
ã¬ãã«1ããŒãã«ã®ãšã³ã㪠| 0o_SSSSSS_RRR_AAA_BBB_CCC_DDDD |
ã¬ãã«2ããŒãã«ã®ãšã³ã㪠| 0o_SSSSSS_RRR_RRR_AAA_BBB_CCCC |
ã¬ãã«3ããŒãã«ã®ãšã³ã㪠| 0o_SSSSSS_RRR_RRR_RRR_AAA_BBBB |
ã¬ãã«4ããŒãã«ã®ãšã³ã㪠| 0o_SSSSSS_RRR_RRR_RRR_RRR_AAAA |
ããã§ã
ã¯ã¬ãã«4ã€ã³ããã¯ã¹ã
ã¯ã¬ãã«3ã
ã¯ã¬ãã«2ã
DDD
ã¯è¡šç€ºããããã¬ãŒã ã®ã¬ãã«1ã€ã³ããã¯ã¹ã
EEEE
ã¯ãã®ãªãã»ããã§ãã
RRR
ã¯ãååž°ã¬ã³ãŒãã®ã€ã³ããã¯ã¹ã§ãã ã€ã³ããã¯ã¹ïŒ3æ¡ïŒã¯ã8ïŒããŒãžããŒãã«ãšã³ããªã®ãµã€ãºïŒãä¹ç®ããŠãªãã»ããïŒ4æ¡ïŒã«å€æãããŸãã ãã®ãªãã»ããã«ãããçµæã®ã¢ãã¬ã¹ã¯å¯Ÿå¿ããããŒãžããŒãã«ãšã³ããªãçŽæ¥ãã€ã³ãããŸãã
SSSS
ã¯ã笊å·ä»ãæ°åã®æ¡åŒµãããã§ããã€ãŸãããããã¯ãã¹ãŠããã47ã®ã³ããŒã§ããããã¯ã
åã®èšäºã§èª¬æããx86_64ã¢ãŒããã¯ãã£ã®æå¹ãªã¢ãã¬ã¹ã«å¯Ÿããç¹å¥ãªèŠä»¶ã§ãã
ã¢ãã¬ã¹ã¯
8鲿°ã§ã ãå8鲿°ã®æåã¯3ãããã衚ããããç°ãªãã¬ãã«ã§ããŒãã«ã®9ãããã®ã€ã³ããã¯ã¹ãæç¢ºã«åé¢ã§ããŸãã ããã¯ãåæåã4ãããã衚ã16é²ã·ã¹ãã ã§ã¯äžå¯èœã§ãã
éã³ãŒã
ãããåäœæŒç®ã䜿çšããŠãRustã³ãŒãã§ãã®ãããªã¢ãã¬ã¹ãæ§ç¯ã§ããŸãã
ãã®ã³ãŒãã¯ãã€ã³ããã¯ã¹
0o777
ïŒ511ïŒãæã€ã¬ãã«4ã®æåŸã®ã¬ã³ãŒãã®ååž°ãããã³ã°ãååž°çã«äžèŽããããšã
0o777
ãšããŠããŸãã çŸåšãããã¯åœãŠã¯ãŸããªããããã³ãŒãã¯ãŸã æ©èœããŸããã ããŒããŒã«ååž°çãããã³ã°ãèšå®ããããæç€ºããæ¹æ³ã«ã€ããŠã¯ã以äžãåç
§ããŠãã ããã
ãããåäœã®æäœãæåã§å®è¡ãã代ããã«ã
x86_64
ã¯ã¬ãŒãã®
RecursivePageTable
ã¿ã€ãã䜿çšã§ããŸããããã¯ãããŸããŸãªããŒãã«æäœã®å®å
šãªæœè±¡åãæäŸããŸãã ããšãã°ã次ã®ã³ãŒãã¯ãä»®æ³ã¢ãã¬ã¹ã察å¿ããç©çã¢ãã¬ã¹ã«å€æããæ¹æ³ã瀺ããŠããŸãã
ç¹°ãè¿ããŸããããã®ã³ãŒãã«ã¯æ£ããååž°ãããã³ã°ãå¿
èŠã§ãã ãã®ãããã³ã°ã§ã¯ãæåã®ã³ãŒãäŸã®ããã«ãæ¬ èœããŠãã
level_4_table_addr
èšç®ãããŸãã
ååž°çãããã³ã°ã¯ãåäžã®ããŒãã«ãä»ãã匷åãªãããã³ã°ã瀺ãè峿·±ãæ¹æ³ã§ãã å®è£
ã¯æ¯èŒçç°¡åã§ãæå°éã®ã»ããã¢ããïŒ1ã€ã®ååž°çãšã³ããªã®ã¿ïŒã§æžããââããããã¯æåã®å®éšã«é©ããŠããŸãã
ãã ããæ¬¡ã®ãããªæ¬ ç¹ããããŸãã
- 倧éã®ä»®æ³ã¡ã¢ãªïŒ512 GiBïŒã ããã¯ã倧ããª48ãããã¢ãã¬ã¹ç©ºéã§ã¯åé¡ã«ãªããŸããããæé©ã§ãªããã£ãã·ã¥åäœã«ã€ãªããå¯èœæ§ããããŸãã
- çŸåšã¢ã¯ãã£ããªã¢ãã¬ã¹ç©ºéãžã®ã¢ã¯ã»ã¹ã®ã¿ãç°¡åã«æäŸããŸãã ä»ã®ã¢ãã¬ã¹ã¹ããŒã¹ãžã®ã¢ã¯ã»ã¹ã¯ãååž°ãšã³ããªã倿Žããããšã§åŒãç¶ãå¯èœã§ãããåãæ¿ãã«ã¯äžæçãªäžèŽãå¿
èŠã§ãã ãããè¡ãæ¹æ³ã«ã€ããŠã¯ã以åã®ïŒå»æ¢ãããïŒèšäºã§èª¬æããŸããã
- x86ããŒãžããŒãã«åœ¢åŒã«å€§ããäŸåããä»ã®ã¢ãŒããã¯ãã£ã§ã¯åäœããªãå ŽåããããŸãã
ããŒãããŒããŒã®ãµããŒã
äžèšã®ãã¹ãŠã®ã¢ãããŒãã§ã¯ãããŒãžããŒãã«ãšå¯Ÿå¿ããèšå®ã倿Žããå¿
èŠããããŸãã ããšãã°ãç©çã¡ã¢ãªãåãããã«ãããã³ã°ãããã第4ã¬ãã«ã®ããŒãã«ã®ã¬ã³ãŒããååž°çã«ãããã³ã°ããŸãã åé¡ã¯ãããŒãžããŒãã«ã«ã¢ã¯ã»ã¹ããã«ãããã®èšå®ãè¡ãããšãã§ããªãããšã§ãã
ã ãããããŒãããŒããŒã®å©ããå¿
èŠã§ãã 圌ã¯ããŒãžããŒãã«ã«ã¢ã¯ã»ã¹ã§ãããããå¿
èŠãªãã£ã¹ãã¬ã€ãäœæã§ããŸãã çŸåšã®å®è£
ã§ã¯ã
bootloader
ã¯ã¬ãŒãã¯ã
ã«ãŒãŽé¢æ°ã䜿çšããäžèšã®2ã€ã®ã¢ãããŒãããµããŒãããŠã
ãŸã ã
map_physical_memory
颿°ã¯ãä»®æ³ã¢ãã¬ã¹ç©ºéã®ã©ããã«å®å
šãªç©çã¡ã¢ãªããããããŸãã ãããã£ãŠãã«ãŒãã«ã¯ãã¹ãŠã®ç©çã¡ã¢ãªã«ã¢ã¯ã»ã¹ããç©çã¡ã¢ãªå
šäœã衚瀺ããã¢ãããŒããé©çšã§ããŸãã
recursive_page_table
颿°ã䜿çšããŠãããŒããŒã¯ç¬¬4ã¬ãã«ã®ããŒãžããŒãã«ãšã³ããªãååž°çã«è¡šç€ºããŸãã ããã«ãããã«ãŒãã«ã¯ãååž°ããŒãžããŒãã«ãã»ã¯ã·ã§ã³ã§èª¬æãããŠããæ¹æ³ã«åŸã£ãŠåäœã§ããŸãã
ã«ãŒãã«ã§ã¯ãã·ã³ãã«ã§ãã©ãããã©ãŒã ã«äŸåããªãããã匷åãªã¢ãããŒãã§ãããããæåã®ãªãã·ã§ã³ãéžæããŸãïŒããŒãžããŒãã«ã ãã§ãªããä»ã®ãã¬ãŒã ã«ãã¢ã¯ã»ã¹ã§ããŸãïŒãããŒãããŒããŒããã®ãµããŒãã®ããã«ãäŸåé¢ä¿ã«é¢æ°ã远å ããŸãmap_physical_memory
ïŒ [dependencies] bootloader = { version = "0.4.0", features = ["map_physical_memory"]}
ãã®æ©èœãæå¹ãªå ŽåãããŒãããŒããŒã¯ç©çã¡ã¢ãªå
šäœãæªäœ¿çšã®ä»®æ³ã¢ãã¬ã¹ã®ç¯å²ã«ãããããŸããããç¯å²ã®ä»®æ³ã¢ãã¬ã¹ãã«ãŒãã«ã«æž¡ãããã«ãããŒãããŒããŒã¯ããŒãæ
å ±ã®æ§é ãæž¡ããŸããããŒãæ
å ±
ã¯ã¬ãŒãbootloader
ã¯ãã«ãŒãã«ã«æž¡ããããã¹ãŠã®æ
å ±ãšãšãã«BootInfoã®æ§é ãå®çŸ©ããŸããæ§é ã¯ãŸã 確å®äžã§ãããããsemverãšäºææ§ã®ãªãå°æ¥ã®ããŒãžã§ã³ã«ã¢ããã°ã¬ãŒãããéã«ãšã©ãŒãçºçããå¯èœæ§ããããŸããçŸåšãæ§é ã«ã¯2ã€ã®ãã£ãŒã«ãããããŸãïŒmemory_map
ããã³physical_memory_offset
ïŒ- ãã®ãã£ãŒã«ãã«
memory_map
ã¯ã䜿çšå¯èœãªç©çã¡ã¢ãªã®æŠèŠã衚瀺ãããŸããã·ã¹ãã ã§äœ¿çšå¯èœãªç©çã¡ã¢ãªã®éãšãVGAãªã©ã®ããã€ã¹çšã«äºçŽãããŠããã¡ã¢ãªã®é åãã«ãŒãã«ã«éç¥ããŸããã¡ã¢ãªã«ãŒãã¯ãBIOSãŸãã¯UEFIãã¡ãŒã ãŠã§ã¢ããèŠæ±ã§ããŸãããèµ·åããã»ã¹ã®æåã®æ®µéã§ã®ã¿èŠæ±ã§ããŸãããã®ãããã«ãŒãã«ã¯ãã®æ
å ±ãåä¿¡ã§ããªããªããããããŒããŒãæäŸããå¿
èŠããããŸããã¡ã¢ãªã«ãŒãã¯ããã®èšäºã®åŸåã§åœ¹ç«ã¡ãŸãã
physical_memory_offset
ç©çã¡ã¢ãªãããã³ã°ã®ä»®æ³éå§ã¢ãã¬ã¹ãå ±åããŸãããã®ãªãã»ãããç©çã¢ãã¬ã¹ã«è¿œå ãããšã察å¿ããä»®æ³ã¢ãã¬ã¹ãååŸãããŸããããã«ãããã«ãŒãã«ããä»»æã®ç©çã¡ã¢ãªã«ã¢ã¯ã»ã¹ã§ããŸãã
ããŒããŒã¯ãæ§é äœBootInfo
ã&'static BootInfo
颿°ã®åŒæ°ãšããŠã«ãŒãã«ã«æž¡ããŸã_start
ã远å ããŠãã ããïŒ
ã³ã³ãã€ã©ã¯ãšã³ããªãã€ã³ã颿°ã®æ£ããã·ã°ããã£ã¿ã€ããç¥ããªããããæ£ããåŒæ°ã¿ã€ããæå®ããããšãéèŠã§ãããšã³ããªãã€ã³ããã¯ã
颿°_start
ã¯ããŒãããŒããŒããå€éšã§åŒã³åºãããããã颿°ã®çœ²åã¯ç¢ºèªãããŸãããããã¯ãã³ã³ãã€ã«ãšã©ãŒãªãã§ä»»æã®åŒæ°ãåãå
¥ããããšãèš±å¯ã§ããããšãæå³ããŸãããããã¯ã¯ã©ãã·ã¥ã«ã€ãªããããæªå®çŸ©ã®ã©ã³ã¿ã€ã åäœãåŒãèµ·ãããŸãããšã³ããªãã€ã³ã颿°ãåžžã«æ£ãã眲åãæã€ããã«ããããã«ãã¯ã¬ãŒãbootloader
ã¯ãã¯ããæäŸããŸãentry_point
ããã®ãã¯ãã䜿çšããŠé¢æ°ãæžãæããŸãïŒ
ãšã³ããªã»ãã€ã³ãã䜿çšããå¿
èŠããªããªã£ãextern "C"
ããno_mangle
ç§ãã¡ã®ããã«ãã¯ãå®çŸ©æ¬åœã®äžäœã¬ãã«ã®ãšã³ããªãã€ã³ããšããŠ_start
ã颿°ã¯kernel_main
å®å
šã«éåžžã®Rust颿°ã«ãªã£ããããä»»æã®ååãéžæã§ããŸããéèŠãªããšã¯ãåã«ãã£ãŠãã§ãã¯ãããããšã§ãããã®ãããããšãã°åŒæ°ã远å ããããåã倿ŽãããããŠééã£ã眲åã䜿çšãããšãã³ã³ãã€ã«ãšã©ãŒãçºçããŸããå®è£
ããã§ç©çã¡ã¢ãªã«ã¢ã¯ã»ã¹ã§ããæçµçã«ã·ã¹ãã ã®å®è£
ãéå§ã§ããŸãããŸããã«ãŒãã«ãå®è¡ãããŠããçŸåšã®ã¢ã¯ãã£ãããŒãžããŒãã«ãæ€èšããŸãã2çªç®ã®ã¹ãããã§ã¯ããã®ä»®æ³ã¢ãã¬ã¹ããããã³ã°ãããŠããç©çã¢ãã¬ã¹ãè¿ã倿颿°ãäœæããŸããæåŸã®ã¹ãããã§ã¯ãããŒãžããŒãã«ã倿ŽããŠæ°ãããããã³ã°ãäœæããŸããæåã«ãã³ãŒãã«æ°ããã¢ãžã¥ãŒã«ãäœæããŸãmemory
ã
ã¢ãžã¥ãŒã«ã®å Žåã空ã®ãã¡ã€ã«ãäœæããŸãsrc/memory.rs
ãããŒãžããŒãã«ãžã®ã¢ã¯ã»ã¹
åã®èšäºã®æåŸã§ãã«ãŒãã«ãåäœããããŒãžã®ããŒãã«ã調ã¹ãããšããŸããããregisterãæãç©çãã¬ãŒã ã«ã¢ã¯ã»ã¹ã§ããŸããã§ããCR3
ããã®å Žæããäœæ¥ãç¶ããããšãã§ããŸãã颿°active_level_4_table
ã¯ã4çªç®ã®ã¬ãã«ã®ããŒãžã®ã¢ã¯ãã£ããªããŒãã«ãžã®ãªã³ã¯ãè¿ããŸãã
æåã«ãã¬ãžã¹ã¿ãã4çªç®ã®ã¬ãã«ã®ã¢ã¯ãã£ãããŒãã«ã®ç©çãã¬ãŒã ãèªã¿åããŸãCR3
ãæ¬¡ã«ãç©ççãªéå§ã¢ãã¬ã¹ãååŸããã远å ããŠä»®æ³ã¢ãã¬ã¹ã«å€æããŸãphysical_memory_offset
ãæåŸã«ã*mut PageTable
ã¡ãœããã«ãã£ãŠã¢ãã¬ã¹ãçã®ãã€ã³ã¿ãŒã«å€æããas_mut_ptr
ããããå®å
šã«ãªã³ã¯ãäœæããŸã&mut PageTable
ã&mut
代ãã&
ã«ãªã³ã¯ãäœæããŸããèšäºã®åŸåã§ãããã®ããŒãžããŒãã«ã倿Žããããã§ããRustã¯ããã£å
šäœunsafe fn
ã1ã€ã®å€§ããªå®å
šã§ãªããããã¯ãšèŠãªããŠãããããå®å
šã§ãªããããã¯ãããã«æ¿å
¥ããå¿
èŠã¯ãããŸãããããã«ãããåã®è¡ã§èª€ã£ãŠå®å
šã§ãªãæäœãå°å
¥ãããå¯èœæ§ãããããããªã¹ã¯ãé«ãŸããŸãããŸããå®å
šã§ãªãæäœã®æ€åºãå°é£ã«ãªããŸããRustã®ãã®åäœã倿Žããããã«ãRFCããã§ã«äœæãããŠããŸããããã§ããã®é¢æ°ã䜿çšããŠã第4ã¬ãã«ã®ããŒãã«ã®ã¬ã³ãŒããåºåã§ããŸãã
physical_memory_offset
æ§é äœã®å¯Ÿå¿ãããã£ãŒã«ããæž¡ãBootInfo
ãŸããæ¬¡ã«ã颿°ã䜿çšiter
ããŠããŒãžããŒãã«ãšã³ããªãšã³ã³ãããŒã¿enumerate
ãå埩åŠçããi
åèŠçŽ ã«ã€ã³ããã¯ã¹ã远å ããŸãã 512ãšã³ããªãã¹ãŠãç»é¢ã«åãŸããªãããã空ã§ãªããšã³ããªã®ã¿ã衚瀺ãããŸããã³ãŒããå®è¡ãããšã次ã®çµæ
ã衚瀺ãããŸããããŸããŸãªç¬¬3ã¬ãã«ã®ããŒãã«ã«ãããããã空ã§ãªãã¬ã³ãŒããããã€ã衚瀺ãããŸããã«ãŒãã«ã³ãŒããã«ãŒãã«ã¹ã¿ãã¯ãç©çã¡ã¢ãªã®å€æãããã³ããŒãæ
å ±ã«å¥ã
ã®é åãå¿
èŠãªãããã¡ã¢ãªã®å€ãã®é åã䜿çšãããŸããããŒãžããŒãã«ã調ã¹ãŠç¬¬3ã¬ãã«ã®ããŒãã«ãèŠãã«ã¯ã衚瀺ããããã¬ãŒã ãä»®æ³ã¢ãã¬ã¹ã«ååºŠå€æããŸãã
2çªç®ãš1çªç®ã®ã¬ãã«ã®ããŒãã«ã衚瀺ããã«ã¯ã3çªç®ãš2çªç®ã®ã¬ãã«ã®ã¬ã³ãŒãã«å¯ŸããŠããã®ããã»ã¹ãããããç¹°ãè¿ããŸãããæ³åã®ãšãããã³ãŒãã®éã¯éåžžã«æ¥éã«å¢å ããŠãããããå®å
šãªãªã¹ãã¯å
¬éããŸãããããã»ããµãã¢ãã¬ã¹ã倿ããæ¹æ³ãçè§£ããã®ã«åœ¹ç«ã€ãããããŒãã«ãæåã§ç§»åããããšã¯è峿·±ãã§ãããã ããéåžžã¯ç¹å®ã®ä»®æ³ã¢ãã¬ã¹ã«å¯ŸããŠ1ã€ã®ç©çã¢ãã¬ã¹ã®ã¿ã衚瀺ããããšã«é¢å¿ãããããããã®ããã®é¢æ°ãäœæããŸããããã¢ãã¬ã¹å€æ
ä»®æ³ã¢ãã¬ã¹ãç©çã¢ãã¬ã¹ã«å€æããã«ã¯ããããã³ã°ããããã¬ãŒã ã«å°éãããŸã§4ã¬ãã«ã®ããŒãžããŒãã«ã調ã¹ãå¿
èŠããããŸãããã®ã¢ãã¬ã¹å€æãå®è¡ãã颿°ãäœæããŸãããïŒ
å®å
štranslate_addr_inner
ã§ãªãã³ãŒãã®éãå¶éããå®å
šãªé¢æ°ãåç
§ããŸããäžèšã®ããã«ãRustã¯èº«äœå
šäœãunsafe fn
倧ããªå®å
šã§ãªããããã¯ãšèŠãªããŠããŸãã 1ã€ã®å®å
šãªé¢æ°ãåŒã³åºãããšã«ãããåæäœãåã³æç€ºçã«ãunsafe
ãŸããç¹å¥ãªå
éšé¢æ°ã«ã¯å®éã®æ©èœããããŸãã
颿°active_level_4_table
ãåå©çšãã代ããã«ãregisterãã第4ã¬ãã«ã®ãã¬ãŒã ãåèªã¿åããCR3
ãŸããããã«ããããããã¿ã€ãã®å®è£
ãç°¡åã«ãªãããã§ããå¿é
ããªãã§ãã ãããç§ãã¡ã¯ããã«è§£æ±ºçãæ¹åããŸãããã®æ§é VirtAddr
ã¯ã4ã€ã®ã¬ãã«ã®ããŒãžã®ããŒãã«ã§ã€ã³ããã¯ã¹ãèšç®ããã¡ãœããããã§ã«æäŸããŠããŸãããã¹ãŠã®ããŒãã«ãã«ãŒãã§ããããããããã®ã€ã³ããã¯ã¹ãå°ããªé
åã«æ ŒçŽãfor
ãŸããã«ãŒãã®å€åŽã§ã¯ãåŸã§ç©çã¢ãã¬ã¹ãèšç®ããããã«èšªããæåŸã®ãã¬ãŒã ãèŠããŠããŸããframe
å埩äžã®ããŒãžããŒãã«ã®ãã¬ãŒã ãšãæåŸã®å埩ã®åŸãã€ãŸãã¬ãã«1ã¬ã³ãŒããééããåŸã®é¢é£ãã¬ãŒã ãæããŸããã«ãŒãå
ã§ãå床é©çšããŸãphysical_memory_offset
ãã¬ãŒã ãããŒãžããŒãã«ãªã³ã¯ã«å€æããŸããæ¬¡ã«ãçŸåšã®ããŒãžããŒãã«ã®ã¬ã³ãŒããèªã¿åãã颿°PageTableEntry::frame
ã䜿çšããŠäžèŽãããã¬ãŒã ãååŸããŸããã¬ã³ãŒãããã¬ãŒã ã«ãããã³ã°ãããŠããªãå Žåããè¿ãNone
ãŸããã¬ã³ãŒãã«å·šå€§ãª2 MiBãŸãã¯1 GiBããŒãžã衚瀺ãããå ŽåããããŸã§ã®ãšãããããã¯ã«ãªããŸããããã§ãããã€ãã®ã¢ãã¬ã¹ã§ç¿»èš³é¢æ°ããã§ãã¯ããŸãããïŒ
ã³ãŒããå®è¡ãããšã次ã®çµæãåŸãããŸãã
äºæ³ã©ãããåããããã³ã°ã§ãã¢ãã¬ã¹ã¯0xb8000
åãç©çã¢ãã¬ã¹ã«å€æãããŸããã³ãŒãããŒãžãšã¹ã¿ãã¯ããŒãžã¯ãããŒããŒãã«ãŒãã«ã®åæãããã³ã°ãã©ã®ããã«äœæãããã«å¿ããŠãä»»æã®ç©çã¢ãã¬ã¹ã«å€æãããŸãããããã³ã°physical_memory_offset
ã¯ç©çã¢ãã¬ã¹ãæãå¿
èŠ0
ããããŸããã倿ã¯å¹çã®ããã«å€§ããªããŒãžã䜿çšãããã倱æããŸããããŒããŒã®å°æ¥ã®ããŒãžã§ã³ã§ã¯ãã«ãŒãã«ãšã¹ã¿ãã¯ããŒãžã«åãæé©åãé©çšãããå¯èœæ§ããããŸããMappedPageTableã䜿çšãã
ä»®æ³ã¢ãã¬ã¹ã®ç©çã¢ãã¬ã¹ãžã®å€æã¯ãOSã®ã«ãŒãã«ã®å
žåçãªã¿ã¹ã¯ã§ãããããã£ãŠãã¯ã¬ãŒãx86_64
ã¯ãããæœè±¡åããŸããããã¯æ¢ã«å·šå€§ãªããŒãžãšããã€ãã®ä»ã®æ©èœããµããŒãããŠããŸããtranslate_addr
ããã以å€ã®å Žåã¯ãç¬èªã®å®è£
ã«å€§ããªããŒãžã®ãµããŒãã远å ãã代ããã«äœ¿çšããŸããæœè±¡åã®åºç€ã¯ãããŒãžããŒãã«ã®ããŸããŸãªå€æé¢æ°ãå®çŸ©ãã2ã€ã®ç¹æ§ã§ãã- ãã®ç¹æ§
Mapper
ã¯ãããŒãžã§æ©èœããæ©èœãæäŸããŸããããšãã°ãtranslate_page
ãã®ããŒãžãåããµã€ãºã®ãã¬ãŒã ã«map_to
倿ããããŒãã«ã«æ°ãããããã³ã°ãäœæããŸãã
- ãã®ç¹æ§ã¯ããã¹ãŠã®ããŒãžãµã€ãºã®
MapperAllSizes
é©çšMapper
ãæå³ããŸãããŸããtranslate_addr
ãŸãã¯ãªã©ã®ç°ãªããµã€ãºã®ããŒãžã§æ©èœããæ©èœãæäŸããŸãtranslate
ã
ç¹æ§ã¯ã€ã³ã¿ãŒãã§ãŒã¹ã®ã¿ãå®çŸ©ããŸãããå®è£
ã¯æäŸããŸãããçŸåšããµãã©ãã¯x86_64
ã¯ãç¹æ§ãå®è£
ãã2ã€ã®ã¿ã€ããæäŸããŸãïŒMappedPageTable
ãšRecursivePageTable
ãæåã®æ¹æ³ã§ã¯ãããŒãžããŒãã«ã®åãã¬ãŒã ãã©ããã«è¡šç€ºããå¿
èŠããããŸãïŒããšãã°ããªãã»ããä»ãïŒã2çªç®ã®ã¿ã€ãã¯ã4çªç®ã®ã¬ãã«ã®ããŒãã«ãååž°çã«è¡šç€ºãããå Žåã«äœ¿çšã§ããŸãããã¹ãŠã®ç©çã¡ã¢ãªãã«ããããããŠããphysical_memory_offset
ãããMappedPageTableã¿ã€ãã䜿çšã§ããŸããåæåããã«init
ã¯ãã¢ãžã¥ãŒã«ã«æ°ãã颿°ãäœæããŸãmemory
ïŒ use x86_64::structures::paging::{PhysFrame, MapperAllSizes, MappedPageTable}; use x86_64::PhysAddr;
MappedPageTable
ã¯ããŒãžã£ãŒåã«å
±éããŠããããã颿°ããçŽæ¥æ»ãããšã¯ã§ããŸããããã®åé¡ãæ§ææ§é ã§åé¿ããŸãimpl Trait
ã远å ã®å©ç¹ã¯RecursivePageTable
ã颿°ã®ã·ã°ããã£ã倿Žããã«ã«ãŒãã«ãåãæ¿ããããšãã§ããããšã§ãããã®é¢æ°ã§MappedPageTable::new
ã¯ãã¬ãã«4ã®ããŒãžããŒãã«ãžã®å¯å€ãªã³ã¯ãšphys_to_virt
ãç©çãã¬ãŒã ãããŒãžããŒãã«ãã€ã³ã¿ãŒã«å€æããã¯ããŒãžã£ãŒãšãã2ã€ã®ãã©ã¡ãŒã¿ãŒãå¿
èŠã§ã*mut PageTable
ãæåã®ãã©ã¡ãŒã¿ãŒã§ã¯ã颿°ãåå©çšã§ããŸãactive_level_4_table
ã 2ã€ç®ã¯physical_memory_offset
ã倿ã®å®è¡ã«äœ¿çšããã¯ããŒãžã£ãŒãäœæããŸãããŸãããããactive_level_4_table
ãã©ã€ããŒã颿°ã«ãinit
ãŸããããããã¯ãããã®ã¿åŒã³åºãããããã§ããã¡ãœããã䜿çšããã«ã¯MapperAllSizes::translate_addr
ç¬èªã®é¢æ°ã®ä»£ããã«memory::translate_addr
ã以äžã®æ°è¡ã倿Žããå¿
èŠããããŸãkernel_main
ã
éå§åŸã以åãšåãå€æçµæã衚瀺ãããŸããã巚倧ããŒãžã®ã¿ãæ©èœãã
ããã«ãªããŸãããäºæ³ã©ãããä»®æ³ã¢ãã¬ã¹ã¯physical_memory_offset
ç©çã¢ãã¬ã¹ã«å€æãããŸã0x0
ãtypeã®å€æé¢æ°ã䜿çšMappedPageTable
ãããšã巚倧ãªããŒãžã®ãµããŒããå®è£
ããå¿
èŠããªããªããŸãããŸãmap_to
ãæ¬¡ã®ã»ã¯ã·ã§ã³ã§äœ¿çšãããããªä»ã®ããŒãžæ©èœã«ãã¢ã¯ã»ã¹ã§ããŸãããã®æ®µéã§ã颿°memory::translate_addr
ã¯å¿
èŠãªããªããŸãããå¿
èŠã«å¿ããŠåé€ã§ããŸããæ°ãããããã³ã°ãäœæãã
ãããŸã§ã®ãšãããããŒãžããŒãã«ã®ã¿ãèŠãŠããŸããããäœã倿ŽããŠããŸããã以åã«è¡šç€ºãããŠããªãããŒãžã®æ°ãããããã³ã°ãäœæããŸããããtraitã®é¢æ°ã䜿çšãããããæåã«ãã®é¢æ°ãæ€èšããŸããããã¥ã¡ã³ãã«ã¯ã4ã€ã®åŒæ°ãå¿
èŠã§ãããšæžãããŠããŸãã衚瀺ããããŒãžãããŒãžããããããããã¬ãŒã ãããŒãžããŒãã«ãšãã¬ãŒã ãã£ã¹ããªãã¥ãŒã¿ãæžãããã®ãã©ã°ã®ã»ããããã®ããŒãžã®ãããã³ã°ã«ã¯ãããã¯ã¢ããã¹ãã¬ãŒãžãšããŠæªäœ¿çšã®ãã¬ãŒã ãå¿
èŠãšãã远å ããŒãã«ã®äœæãå¿
èŠã«ãªãå Žåãããããããã¬ãŒã ã¢ãã±ãŒã¿ãŒãå¿
èŠã§ããmap_to
Mapper
frame_allocator
æ©èœ create_example_mapping
å®è£
ã®æåã®ã¹ãããã¯ãcreate_example_mapping
ãã®ããŒãžã0xb8000
VGAããã¹ããããã¡ãŒã®ç©çãã¬ãŒã ã«ãããããæ°ãã颿°ãäœæããããšã§ãããã®ãã¬ãŒã ãéžæããã®ã¯ããã£ã¹ãã¬ã€ãæ£ããäœæããããã©ãããç°¡åã«ç¢ºèªã§ããããã§ããæè¿è¡šç€ºããããŒãžã«æžã蟌ã¿ãç»é¢ã«è¡šç€ºããããã©ããã確èªããã ãã§ãã颿°create_example_mapping
ã¯æ¬¡ã®ããã«ãªããŸãã
page
ããããããããŒãžã«å ããŠã颿°ã¯mapper
ããã³ã®ã€ã³ã¹ã¿ã³ã¹ãäºæããŸãframe_allocator
ãåã¯ãã¡ãœãããæäŸããmapper
ç¹æ§Mapper<Size4KiB>
ãå®è£
ããŸãmap_to
ãSize4KiB
ç¹æ§Mapper
ã¯ç¹æ§ã«å
±éã§ãããããäžè¬çãªãã©ã¡ãŒã¿ãŒãå¿
èŠã§ããããã¯PageSize
ãæšæºã®4 KiBããŒãžãš2 MiBãš1 GiBã®å·šå€§ããŒãžã®äž¡æ¹ã§æ©èœããããã§ãã 4ã€ã®KiBããŒãžã®ã¿ãäœæããããMapper<Size4KiB>
ãèŠä»¶ã®ä»£ããã«äœ¿çšã§ããŸãMapperAllSizes
ãæ¯èŒã®ããã«ããã©ã°ãèšå®ããŸãPRESENT
ãããã¯ããã¹ãŠã®æå¹ãªãšã³ããªã«å¿
èŠãªWRITABLE
ã®ã§ã衚瀺ãããããŒãžãæžã蟌ã¿å¯èœã«ããããã®ãã©ã°ã§ããææŠããmap_to
å®å
šã§ãªãïŒç¡å¹ãªåŒæ°ã䜿çšãããšã¡ã¢ãªã»ãã¥ãªãã£ã«éåããå¯èœæ§ãããããããããã¯ã䜿çšããå¿
èŠããããŸãunsafe
ãå¯èœãªãã¹ãŠã®ãã©ã°ã®ãªã¹ãã«ã€ããŠã¯ãåã®èšäºã®ãããŒãžããŒãã«åœ¢åŒãã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã颿°map_to
ã¯å€±æããå¯èœæ§ãããããããè¿ããŸãResult
ãããã¯ä¿¡é Œæ§ã®äœãã³ãŒãã®äŸã«ãããªãããexpect
ããšã©ãŒçºçæã«ãããã¯ãèµ·ããããã«äœ¿çšããŸããæåããå Žåã颿°ã¯MapperFlush
ã¡ãœããã䜿çšããŠãæè¿è¡šç€ºãããããŒãžãåç翻蚳ãããã¡ãŒïŒTLBïŒããç°¡åã«ã¯ãªã¢ããã¿ã€ããè¿ããŸãflush
ãåæ§ã«Result
ããã®ã¿ã€ãã¯[ #[must_use]
] 屿§ãé©çšããŸã誀ã£ãŠäœ¿çšãå¿ããå Žåã«èŠåãçºè¡ãããæ¶ç©ºã® FrameAllocator
åŒã³åºãã«ã¯create_example_mapping
ãæåã«ãäœæããå¿
èŠããããŸãFrameAllocator
ãäžèšã®ããã«ãæ°ãããã£ã¹ãã¬ã€ãäœæããè€éãã¯ã衚瀺ããä»®æ³ããŒãžã«ãã£ãŠç°ãªããŸããæãåçŽãªã±ãŒã¹ã§ã¯ãããŒãžã®ã¬ãã«1ããŒãã«ããã§ã«ååšãã1ã€ã®ã¬ã³ãŒããäœæããã ãã§ããæãé£ããã±ãŒã¹ã§ã¯ãããŒãžã¯ã¬ãã«3ããŸã äœæãããŠããªãã¡ã¢ãªé åã«ãããããæåã«ã¬ãã«3ã2ãããã³1ã®ããŒãžããŒãã«ãäœæããå¿
èŠããããŸããç°¡åãªã±ãŒã¹ããå§ããŠãæ°ããããŒãžããŒãã«ãäœæããå¿
èŠããªããšä»®å®ããŸãããã®ããã«ã¯ãåžžã«æ»ããã¬ãŒã ãã£ã¹ããªãã¥ãŒã¿ã§ååNone
ã§ããEmptyFrameAllocator
ãã¹ãçšã«ãã®ãããªè¡šç€ºé¢æ°ãäœæããŸãã
次ã«ãæ°ããããŒãžããŒãã«ãäœæããã«è¡šç€ºã§ããããŒãžãèŠã€ããå¿
èŠããããŸããããŒããŒã¯ä»®æ³ã¢ãã¬ã¹ç©ºéã®æåã®ã¡ã¬ãã€ãã«ããŒããããããããã®é åã«ã¯æå¹ãªã¬ãã«1ã®ããŒãã«ãããããšãããããŸã0x1000
ã颿°ããã¹ãããã«ã¯ãæåã«ããŒãž0x1000
ã衚瀺ããæ¬¡ã«ã¡ã¢ãªã®å
容ã衚瀺ããŸãã
ãŸããã®ããŒãžã®ãããã³ã°ãäœæããã€ã³ã¹ã¿ã³ã¹ãšãžã®å¯å€ãªã³ã¯ã䜿çšããŠ0x1000
颿°create_example_mapping
ãåŒã³åºããŸããããã«ãããããŒãžãVGAããã¹ããããã¡ãã¬ãŒã ã«ãããããããããç»é¢ã«è¡šç€ºãããŠããå
容ã衚瀺ãããŸããæ¬¡ã«ãããŒãžãçã®ãã€ã³ã¿ãŒã«å€æããå€ãoffsetã«æžã蟌ã¿ãŸãã VGAãããã¡ãŒã®äžçªäžã®è¡ã¯æ¬¡ã®ããã«ç»é¢ããçŽæ¥ã·ããããããããããŒãžã®äžéšã«ã¯æžã蟌ã¿ãŸãããçœãèæ¯ã«æååãNewïŒãã«äžèŽããå€ãæžã蟌ã¿ãŸãããVGAããã¹ãã¢ãŒããã®èšäºã§åŠãã ããã«ãVGAãããã¡ãŒãžã®æžã蟌ã¿ã¯æ®çºæ§ã§ããå¿
èŠããããããã¡ãœããã䜿çšããŸããmapper
frame_allocator
0x1000
400
println
0x_f021_f077_f065_f04e
write_volatile
QEMUã§ã³ãŒããå®è¡ãããšã次ã®çµæã衚瀺ãããŸãã
ããŒãžãžã®æžã蟌ã¿åŸ0x1000
ãç»é¢ã«ãNewïŒããšããç¢æã衚瀺ãããŸãããããã§ãããŒãžããŒãã«ã«æ°ãããããã³ã°ãæ£åžžã«äœæãããŸãããç
§åçšã®ã¬ãã«1ã®ããŒãã«ãæ¢ã«ååšããããããã®ç
§åã¯æ©èœããŸãã0x1000
ãã¬ãã«1ã®ããŒãã«ããŸã ååšããªãããŒãžã«äžèŽãããããšãããšãmap_to
ãã¬ãŒã ãå²ãåœãŠEmptyFrameAllocator
ãŠæ°ããããŒãã«ãäœæããããšããããã颿°ã¯å€±æããŸããæ¬¡ã®0xdeadbeaf000
代ããã«ããŒãžã衚瀺ããããšãããšããããçºçããããšãããããŸã0x1000
ã
ãããéå§ããããšã次ã®ãšã©ãŒã¡ãã»ãŒãžã§ãããã¯ãçºçããŸãã panicked at 'map_to failed: FrameAllocationFailed', /âŠ/result.rs:999:5
ããŒãžã¬ãã«1ã®ããŒãã«ããŸã ãªãããŒãžã衚瀺ããã«ã¯ãæ£ããããŒãã«ãäœæããå¿
èŠããããŸãFrameAllocator
ãããããã©ã®ãã¬ãŒã ãç¡æã§ãã©ã®ãããã®ç©çã¡ã¢ãªãå©çšå¯èœã§ããããã©ããã£ãŠç¥ãã®ã§ããããïŒãã¬ãŒã éžæ
æ°ããããŒãžããŒãã«ã®å Žåãæ£ãããã¬ãŒã ãã£ã¹ããªãã¥ãŒã¿ãäœæããå¿
èŠããããŸããäžè¬çãªã¹ã±ã«ãã³ããå§ããŸãããïŒ
ãã£ãŒã«ãframes
ã¯ãä»»æã®ãã¬ãŒã å埩åã§åæåã§ããŸããããã«ãããalloc
ã¡ãœãããžã®åŒã³åºããç°¡åã«å§ä»»ã§ããŸãIterator::next
ãåæåã«ã¯ãããŒãããŒããŒãæ§é ã®äžéšãšããŠè»¢éBootInfoFrameAllocator
ããã¡ã¢ãªã«ãŒãã䜿çšããŸããããŒãæ
å ±ã»ã¯ã·ã§ã³ã§èª¬æããããã«ãã¡ã¢ãªã«ãŒãã¯BIOS / UEFIãã¡ãŒã ãŠã§ã¢ã«ãã£ãŠæäŸãããŸããããŒãããã»ã¹ã®æåã®æ®µéã§ã®ã¿èŠæ±ã§ãããããããŒãããŒããŒã¯å¿
èŠãªé¢æ°ãæ¢ã«åŒã³åºããŠããŸããã¡ã¢ãªã«ãŒãã¯ãåã¡ã¢ãªé åã®éå§ã¢ãã¬ã¹ãé·ããããã³ã¿ã€ãïŒããšãã°ãæªäœ¿çšãäºçŽæžã¿ãªã©ïŒãå«ãæ§é ã®ãªã¹ãã§æ§æãããŸããæªäœ¿çšé åãããã¬ãŒã ãçæããã€ãã¬ãŒã¿ãäœæããããšã«ãããæå¹ãªã€ãã¬ãŒã¿ãäœæã§ããŸããmemory_map
BootInfo
MemoryRegion
BootInfoFrameAllocator
åæåBootInfoFrameAllocator
ã¯æ°ãã颿°ã§è¡ãããŸãinit_frame_allocator
ïŒ
ãã®é¢æ°ã¯ãã³ã³ãããŒã¿ãŒã䜿çšããŠãåæãããMemoryMap
ãäœ¿çšæžã¿ç©çãã¬ãŒã ã®ã€ãã¬ãŒã¿ãŒã«å€æããŸãã- ãŸããã¡ãœãããåŒã³åºããŠ
iter
ã¡ã¢ãªã«ãŒããã€ãã¬ãŒã¿ã«å€æããŸãMemoryRegion
ãæ¬¡ã«ãã¡ãœããã䜿çšããŠãfilter
äºçŽæžã¿ãŸãã¯ã¢ã¯ã»ã¹ã§ããªãé åãã¹ãããããŸããããŒããŒã¯ãäœæãããã¹ãŠã®ãããã³ã°ã«å¯ŸããŠã¡ã¢ãªã«ãŒããæŽæ°ãããããã«ãŒãã«ã䜿çšãããã¬ãŒã ïŒã³ãŒããããŒã¿ããŸãã¯ã¹ã¿ãã¯ïŒãŸãã¯ããŒãã«é¢ããæ
å ±ãä¿åããããã®ãã¬ãŒã ã¯ããã§ã«InUse
ãŸãã¯åæ§ã«ããŒã¯ãããŠããŸãããããã£ãŠããã¬ãŒã ãä»ã®å Žæã§Usable
䜿çšãããŠããªãããšã確èªã§ããŸãã
map
range Rust .
- :
into_iter
, 4096- step_by
. 4096 (= 4 ) â , . , . flat_map
map
, Iterator<Item = u64>
Iterator<Item = Iterator<Item = u64>>
.
PhysFrame
, Iterator<Item = PhysFrame>
. BootInfoFrameAllocator
.
ããã§kernel_main
ãBootInfoFrameAllocator
代ããã«ã€ã³ã¹ã¿ã³ã¹ãæž¡ãããã«é¢æ°ã倿Žã§ããŸãEmptyFrameAllocator
ã
ä»åã¯ãã¢ãã¬ã¹ãããã³ã°ãæåããç»é¢ã«é»ãšçœã®ãNewïŒããåã³è¡šç€ºãããŸããèåŸã§ããã®ã¡ãœããmap_to
ã¯æ¬¡ã®ããã«æ¬ èœããŠããããŒãžããŒãã«ãäœæããŸãã- éä¿¡ããããã¬ãŒã ããæªäœ¿çšã®ãã¬ãŒã ãéžæã
frame_allocator
ãŸãã
- æ°ãã空ã®ããŒãžããŒãã«ãäœæãããŒããã¬ãŒã ã
- äžäœã¬ãã«ã®ããŒãã«ãšã³ããªããã®ãã¬ãŒã ã«ãããããŸãã
- è¡šã®æ¬¡ã®ã¬ãã«ã«ç§»åããŸãã
颿°create_example_mapping
ã¯åãªããµã³ãã«ã³ãŒãã§ãããä»»æã®ããŒãžã®æ°ãããããã³ã°ãäœæã§ããããã«ãªããŸãããããã¯ãä»åŸã®èšäºã§ã¡ã¢ãªãå²ãåœãŠãŠãã«ãã¹ã¬ãããå®è£
ããããã«å¿
èŠã«ãªããŸãããŸãšã
ãã®èšäºã§ã¯ãIDãããã³ã°ãå®å
šãªç©çã¡ã¢ãªã®ãããã³ã°ãäžæãããã³ã°ãååž°ããŒãžããŒãã«ãªã©ãããŒãžããŒãã«ã®ç©çãã¬ãŒã ã«ã¢ã¯ã»ã¹ããããŸããŸãªæ¹æ³ã«ã€ããŠåŠã³ãŸãããã·ã³ãã«ã§åŒ·åãªæ¹æ³ãšããŠãç©çã¡ã¢ãªå
šäœã衚瀺ããããšã«ããŸãããããŒãžããŒãã«ã«ã¢ã¯ã»ã¹ããã«ã«ãŒãã«ããç©çã¡ã¢ãªããããããããšã¯ã§ããªããããããŒãããŒããŒã®ãµããŒããå¿
èŠã§ããã©ãã¯bootloader
ã¯ã远å ã®è²šç©æ©èœã«ããå¿
èŠãªãããã³ã°ãäœæããŸããå¿
èŠãªæ
å ±&BootInfo
ãããšã³ããªãã€ã³ã颿°ã®åŒæ°ãšããŠã«ãŒãã«ã«æž¡ããŸãããã®å®è£
ã§ã¯ãæåã«ããŒãžããŒãã«ãæåã§èª¿ã¹ãç¿»èš³é¢æ°ãäœæããŠãããMappedPageTable
ã¯ã¬ãŒãã®ã¿ã€ãã䜿çšããŸããx86_64
ããŸããããŒãžããŒãã«ã§æ°ãããããã³ã°ãäœæããæ¹æ³ãšFrameAllocator
ãããŒãããŒããŒã«ãã£ãŠéä¿¡ãããã¡ã¢ãªã«ãŒãã«ãããã³ã°ãäœæããæ¹æ³ãåŠã³ãŸãããæ¬¡ã¯ïŒ
次ã®èšäºã§ã¯ãã«ãŒãã«çšã®ããŒãã¡ã¢ãªé åãäœæããŸããããã«ãããã¡ã¢ãªãå²ãåœãŠãããŸããŸãªã¿ã€ãã®ã³ã¬ã¯ã·ã§ã³ã䜿çšã§ããããã«ãªããŸãã