ãã®ããŒãã§ã¯ã Vec ã String ã HashMapãªã©ã®äœ¿çšãããã¯è§£é€ããããã«ãã¡ã¢ãªãããŒãžã£ãŒãäœæããŸãã ãã®çŽåŸã«ãFAT32ãã¡ã€ã«ã·ã¹ãã ãå®è£
ããEMMCã®ãã©ã€ããŒïŒSDã«ãŒããšéä¿¡ããããã®ãã®ïŒãæ¥ç¶ããŸãã æåŸã«ãã·ã§ã«ã«cd ã pwd ã cat ã lsã®æ°ããã³ãã³ããããã€ã衚瀺ãããŸãã
ãŒãã©ã
æåã®ã©ãïŒ è¥ãååãšå€ãåå
æçšæ§
ãã§ãŒãº0ïŒã¯ããã«
ãŸããæåããç°å¢ã«äœãå€ãã£ãŠããªãããšã確èªããŸãã
- ããã«LinuxãBSDãŸãã¯macOS
- 64ãããã§ã
- USBããŒãããããŸã
ããã«ããããã€ã³ã¹ããŒã«ãããŸãïŒ git ã wget ã tar ã screen ã makeããã³æåŸã®ã·ãªãŒãºã«ãã£ããã¹ãŠã®ãã®ã ç§ãã¡ã¯å®å®æ§ã確信ããåé²ããŸãã
å¿
èŠãªã³ãŒããååŸãã
ãã®ãªããžããªãã cs140eãšããååã®ããïŒãŸãã¯ãããã«ãããã®ïŒã«cs140eããŸãã
git clone https://web.stanford.edu/class/cs140e/assignments/2-fs/skeleton.git 2-fs
çµå±ã®ãšãããå
éšã«ã¯æ¬¡ã®ãããªãã®ãããã¯ãã§ãã
cs140e âââ 0-blinky âââ 1-shell âââ 2-fs âââ os
ããã§ãã³ãŒãã®äžéšãããosãªããžããªãããã®éšåã§äœ¿çšãããã³ãŒããšããŒãžããå¿
èŠããããŸãã
cd os git fetch git checkout 2-fs git merge master
ããŒãžã®ç«¶åã解決ããå¿
èŠãããå ŽåããããŸãã æ¬¡ã®ãããªãã®ã衚瀺ãããå ŽåããããŸãã
Auto-merging kernel/src/kmain.rs CONFLICT (content): Merge conflict in kernel/src/kmain.rs Automatic merge failed; fix conflicts and then commit the result.
èªåçã«å€±æããŸããã æã«ããå¿
èŠããããŸãã ããã解決ããã«ã¯ã kmain.rsãæåã§å€æŽããå¿
èŠããããŸãã 以åã®ã·ãªãŒãºããã®ãã¹ãŠã®å€æŽãå¿
ãä¿åããŠãã ããã ç«¶åã解決ããã«ã¯ã git addããã³git commitã䜿çšããŠåºå®ãã¡ã€ã«ã远å ããå¿
èŠããããŸãã ããŒãžã®ç«¶åã®è§£æ±ºã«é¢ããäžè¬çãªæ
å ±ãããã³äžè¬çãªgitã«é¢ããæ
å ±ã¯ã githowto.comããã¥ã¢ã«ã«ãããŸã ã ãã®ãã¥ãŒããªã¢ã«ãå®è¡ã§ããŸãã äœã§ãéå®ããŸãã
ãã¡ãŒã ãŠã§ã¢ã®æŽæ°
2-fs turnipããmake fetchã䜿çšããŠãã¡ãŒã ãŠã§ã¢ãåããŠã³ããŒãããå¿
èŠããããŸãã ããŒã èªäœããã¹ãŠãããŠã³ããŒãããŠè§£åããŸãã files/ãµããã£ã¬ã¯ããªããMicroSDã«ãŒãã®ã«ãŒãã«ãã¡ã€ã«ãé
眮ããã ãã§ãã ã€ãŸãããã¡ã€ã«firmware/bootcode.bin ã firmware/config.txt ã firmware/fixup.datããã³firmware/start.elf ã kernel8.imgãšããŠåã®éšåã®ããŒãããŒããŒã䜿çšããå Žåããã®è¡ãconfig.txtã«è¿œå ããå¿
èŠãããããšãå¿ããªãã§ãã ããïŒ
kernel_address=0x4000000
ttywriteãã€ã³ã¹ããŒã«ãã
ããã§ã os/kernelã®Makefile远å ã®installã¿ãŒã²ããã远å ãããŸããã ã«ãŒãã«ãåéããåã®éšåã®ttywriteã䜿çšããŠttywriteã«çŽæ¥éä¿¡ããŸãã ãããã£ãŠã kernel8.imgã«kernel8.img以åã®ã·ãªãŒãºã§æžãããããŒãããŒããŒãå«ãŸããŠããå Žåããã®ãŸãã«ããŒãããŒããŒã¯ãã¡ã€ã«ãåãå
¥ããŠã«ãŒãã«ã«ããŒãããŸãã ãããå®è¡make installã¯ãããã§ã«ãŒãã«ã³ãŒãã䜿çšããŠmake installãå®è¡make installå¿
èŠããããŸãã
åæã«ã Makefileããã®ãã®ã¿ãŒã²ããã¯ãååã ãã§ttywriteçŽæ¥åŒã³åºããŸãã ã€ãŸã ttywriteã¯ã PATHç°å¢å€æ°ãæãå Žæã®ããããã«ãªããã°ãªããŸããã ãããã®å Žæã®1ã€ã«ttywriteããã«ã1 1-shell/ttywrite ã cargo installãå®è¡ã§ããŸãã åœç€Ÿã®ãŠãŒãã£ãªãã£ãåéããé©åãªå Žæã«ã³ããŒããŸãã ãã¹ãŠãæ£ããå Žåã ttywrite --helpãåŒã³åºããšãã«ãã衚瀺ãããŸãã
ããã©ã«ãã§ã¯ã make installã¯ããã€ã¹åã«/dev/tty.SLAB_USBtoUARTã䜿çšããŸãã Makefileãç·šéããŠãå¿
èŠãªãã®ã瀺ããŸãã ã€ãŸã ã¢ããã¿ã«ã¯ã©ã®ããã€ã¹ããããŸããïŒ PI_TTYãšãã倿°ããããŸãã ç°ãªãæå³ãäžããŠãã ããã
ALLOCATOR.initialize()ã¯ãããã¯ãåŒãèµ·ãããŸãïŒ
ã·ã§ã«ã¯åŒãç¶ãæ©èœããã¯ãã§ãã ãã ãã make installã¿ãŒã²ããããã¹ãããããšãããšãã·ã§ã«ãæ©èœããŠããªãããšãããããŸãã ã»ãšãã©ã®å Žåãåé¡ã¯ALLOCATOR.initialize()åŒã³åºãã«ãããŸãã ã¡ã¢ãªã¢ãã±ãŒã¿ãŒã¯ãããŸããã èŠåãªãã§å®è¡ããããšãåã«ãããã¯ã«ãªãã¹ã¿ãã®ã¿ã å°ãåŸã§ãã®è¿·æãªäºå®ãä¿®æ£ããŸãã ãšããããããã®è¡ãã³ã¡ã³ãã¢ãŠãããã ãã§ãå€ããå°ãªããããã§ãæ©èœããŸãã
ãã§ãŒãº1ïŒã¡ã¢ãªã©ã€ã³

ãã®ãã§ãŒãºã§ã¯ã2ã€ã®ã¡ã¢ãªã¢ãã±ãŒã¿ãŒãå®è£
ããŸãã æãåçŽãªãã³ãã¢ãã±ãŒã¿ãŒãšããè€éãªãã³ã¢ãã±ãŒã¿ãŒã ããŒãäžã®ã¡ã¢ãªå²ãåœãŠãæ©èœããããã«å¿
èŠãªã®ã¯ãå®éã«ã¯ããã ãã§ãã ã€ãŸãã Vec ã Box ãããã³StringåŒãç¶ãæ©èœããŸãã 䜿çšå¯èœãªã¡ã¢ãªã®éã倿ããããã«ãARMã¿ã°ïŒ ATAGS ïŒã䜿çšããŸãã ããã«ã panic!åŒã³åºããããšãã«æçµçã«åŒã³åºãããpanic_fmt颿°ã®å
éšãå®è£
ããå¿
èŠãããpanic! ã
ãµããã§ãŒãºAïŒãããã¯ïŒ
panic_fmtã®å®è£
ããå§ããŸãããã kernel/src/lang_items.rs ã
èšèªã¢ã€ãã
Rustã³ã³ãã€ã©ãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒRaspberry Piãªã©ïŒã䜿çšããªãç®çã§ããã°ã©ã ãã³ã³ãã€ã«ããããã«æ§æãããŠããå Žåãã³ã³ãã€ã©ã¯ããã€ãã®æ©èœãèŠæ±ããŸãã ç§ãã¡ã¯èªåã®æã§ããããæžãå¿
èŠããããŸãã ãã®ãããªãã®ã¯èšèªé
ç®ãšåŒã°ããŸãã ãããã®èŠçŽ ã¯ãç¹å®ã®æ¡ä»¶äžã§ã³ã³ãã€ã©ãåŒã³åºãã眮ãæãã颿°ã§ãã ãã®ãããªé¢æ°ã¯ãããããåºæ¬èšèªã«å¯ŸããŠå®çŸ©ã§ããŸãã ãããè¡ãã«ã¯ããã®ãããªé¢æ°ã«#[lang_item]屿§ã§æ³šéãä»ããå¿
èŠããããŸãã
Rustã§ã¯çŸåšããããã®é¢æ°ã®ãã¡2ã€ã ããå¿
èŠã§ãã
panic_fmt: (fmt: ::std::fmt::Arguments, file: &str, line: u32, col: u32) -> ! panic!åŒã³åºããããšãã«åŒã³åºããpanic! ã åŒæ°panic! ãã©ã¡ãŒã¿fmtãšããŠæž¡ãããŸãã ããã«ã panic!ãåŒã³åºãããå Žæã®ãã¡ã€ã«åãè¡ããã³åçªå·panic! ã ããã¯ãããããfile ã line ãããã³colã§ããeh_personality ïŒãã®é¢æ°ã¯ãç¹å®ã®OSãŸãã¯ABIã«äŸåããŸãã å¿
èŠã«å¿ããŠã ã¹ã¿ãã¯ã®ã¢ã³ã¯ã€ã³ãæãŸãã¯ã¢ããŒãåŸã«åŒã³åºãããŸã ã éåžžãããã¯ãã¹ãŠpanic!çºçãpanic! ãŸãã¯ã¹ããªãŒã ãçµäºããŸãã ãã®é¢æ°ã¯å®è£
ããŸããã
ãããã®é¢æ°ã¯äž¡æ¹ãšãkernel/src/lang_items.rsã§ãã§ã«å®£èšãããŠãkernel/src/lang_items.rs ã 颿°panic_fmtã远å ããŠãæçšãªãã®ã衚瀺ããå¿
èŠããããŸãã
panic_fmtå®è£
次ã«ããã®é¢æ°ã远å ããŸãã å®è£
ã§ã¯ãéä¿¡ãããæ
å ±ãã³ã³ãœãŒã«ã«åºåããŠãããç¡éã«ãŒãloop ã ãšããã§ã fmt::Argumentsã¯Displayãã¬ã€ããå®è£
ããŸãã ãããã£ãŠã kprintln!("{}", fmt) ïŒã䜿çšã§ããŸãã å人çã«å¥œããªããã«çµè«ãåºããŸãã ããšãã°ãLinuxã«ãŒãã«ã®ãããã¯ããã€ã³ã¹ãã¬ãŒã·ã§ã³ãåããããšãã§ããŸã ã
( ( ) ) ) ( ( ( ` .-""^"""^""^"""^""-. (//\\//\\//\\//\\//\\//) ~\^^^^^^^^^^^^^^^^^^/~ `================` The pi is overdone. ---------- PANIC ---------- FILE: src/kmain.rs LINE: 40 COL: 5 index out of bounds: the len is 3 but the index is 4
次ã«ãããçš®ã®ã«ãŒãã«ãããã¯ã§panic_fmtå®è£
panic_fmtãã¹ãããŸãã make installã䜿çšããŠã³ã³ãã€ã«ããããŒãããŒããŒãä»ããŠå®è¡ã§ããããšãæãåºããŠãã ããã ã¯ãã ALLOCATOR.initialize()ãpanic! ã©ããäžã ãããã£ãŠãå®è¡ãããšããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããã¯ãã§ãã
ããã«å ããŠãå€ãã®æ¹æ³ã§ãããã¯ãåŒãèµ·ããããã«ããŠãã ããã Using panic!() ãä»ã®åæ§ã®ãã¯ãã䜿çšããŸãã ãããŠäœãä»ã®ãã®ã å®è£
ãèªåã§æ©èœããŠããããšã確å®ãªå Žåã¯ã次ã®ãã§ãŒãºã«é²ã¿ãŸãã
ãã®ãµããã§ãŒãºã§ã¯ãraspberryãã¡ãŒã ãŠã§ã¢ãæäŸããARMã¿ã°ïŒATAGSïŒã«å¯ŸããŠã€ãã¬ãŒã¿ãŒãå®è¡ããŸãã å埩åã䜿çšããŠã䜿çšå¯èœãªã¡ã¢ãªã®éãæ±ºå®ããŸãã äž»ãªäœæ¥ã¯ã pi/src/atagsãškernel/src/allocator/mod.rs ã
ARMã¿ã°
ATAGSãŸãã¯ARMã¿ã°ã¯ãããŸããŸãªæ
å ±ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã«ãŒãã«ã«è»¢éããããã«ãARMããŒãããŒããŒãšãã¡ãŒã ãŠã§ã¢ã§äœ¿çšãããã¡ã«ããºã ã§ãã Linuxã¯ãATAGSã䜿çšããããã«æ§æããããšãã§ããŸãã
Malinkaã¯ãã¢ãã¬ã¹0x100ããå§ãŸãATAGæ§é äœã®é
åãé
眮ããŸãã ãã®å Žåãåã¿ã°ã¯8ãããã®ããããŒã§å§ãŸããŸãã
struct AtagHeader { dwords: u32, tag: u32, }
dwordsãã£ãŒã«ãã«ã¯ãã¿ã€ãã«èªäœãå«ãã¿ã°å
šäœã®ãµã€ãºãå«ãŸããŸãã ããã«ã¯ãŒãïŒããã«ã¯ãŒããã€ãŸã32ãããã¯ãŒãïŒã®ãµã€ãºã æå°ãµã€ãºã¯2 ïŒããããŒã®ãµã€ãºïŒã§ãã tagãã£ãŒã«ãã«ã¯ãã¿ã€ãATAGãå«ãŸããŸãã ATAGSãã«ãã«ã¯ãããã®çŽ12ããããŸãã Malinkaã¯ãã®ãã¡ã®4ã€ã ãã䜿çšããŸãã 圌ãã¯ç§ãã¡ã«ãšã£ãŠè峿·±ãã§ãïŒ
| å | ã¿ã€ãïŒ tag ïŒ | 倧ãã | 説æ |
|---|
| ã³ã¢ | 0x54410001 | 5ãŸãã¯2ïŒç©ºã®ãªã¹ãã®å ŽåïŒ | ã¹ã¿ãŒã¿ãŒãšããŠäœ¿çš |
| ãªã | 0x00000000 | 2 | çµãããæå³ãã |
| æãåº | 0x54410002 | 4 | ç©çã¡ã¢ãªã®äžéšã説æããŸã |
| CMDLINE | 0x54410009 | éã | ã«ãŒãã«ã«åŒæ°ãæž¡ã |
ã¿ã°ã®ã¿ã€ãã«ãã£ãŠãããããŒã®åŸã®ããŒã¿ã®è§£éæ¹æ³ã決ãŸããŸãã ååã«é¢é£ä»ããããŠãããªã³ã¯ãã¯ãªãã¯ãããšã詳现ã確èªã§ããŸãã ããšãã°ã MEMã¿ã°ã«ã¯æ¬¡ã®ãããªãã®ãå«ãŸããŸãã
struct Mem { size: u32, start: u32 }
ã¿ã°ã¯ããããã®éãåããããšãªãé£ç¶ããŠã¡ã¢ãªå
ã«ãããŸãã ãã®ãªã¹ãã¯ã COREã¿ã°ã§å§ãŸããŸãã ãããŠããã®ãªã¹ãã®æåŸã®ã¿ã°ã¯NONEã§ãã ä»ã®ãã¹ãŠã¯ä»»æã®é åºã«ããããšãã§ããŸãã æ¬¡ã®ã¿ã°ãã©ãããå§ãŸãã®ããdwordsã¯ã dwordsã®å
容ã調ã¹ãå¿
èŠããããŸãã ã°ã©ãã£ã«ã«ã«ã¯ããã¹ãŠæ¬¡ã®ããã«ãªããŸãã

çµåãšå®å
š

ATAGã¿ã°ã®çã®æ§é ã¯ã pi/src/atags/raw.rsãã¡ã€ã«ã§å®£èšãããŠããŸãã åæã«ãããã§union䜿çšãããŸãã Rustã®çµåã¯ãNeat Cã®çµåãšã»ãšãã©åãã§ãã äžéšã®ãã£ãŒã«ããã¡ã¢ãªãå
±æããæ§é ãå®çŸ©ããŸãã
pub struct Atag { dwords: u32, tag: u32, kind: Kind } pub union Kind { core: Core, mem: Mem, cmd: Cmd }
ã€ãŸããé¢é£ä»ãã«ãããæ£ããéžæãèæ
®ããã«ãä»»æã®æ§é ãã¡ã¢ãªã«æžã蟌ãããšãã§ããŸãã Rustã§ã¯ãç¹å®ã®ãŠããªã³ãã£ãŒã«ããžã®ã¢ã¯ã»ã¹ã¯å®å
šã§ã¯ãªãããšãããããŸããã
å€ãã®å Žæã«æ¢ã«unsafeã©ãããŒããããŸãã å°ãªããšããèªåã§åäŒã«é£çµ¡ããæ¹æ³ã«ã€ããŠå¿é
ããå¿
èŠã¯ãããŸããã ãã ããã©ã€ãã©ãªã®ãšã³ããŠãŒã¶ãŒã«é¢é£ä»ããæž¡ãããšã¯ãå§ãã§ããŸããã ãã®ããããã¡ã€ã«pi/src/atags/atag.rsã«ã¯å¥ã®Atagæ§é ããããŸãã ãã®æ§é ã¯ãã¢ã¯ã»ã¹ã«å¯ŸããŠå®å
šã«å®å
šã§ãã å€éšã³ãŒãã«æž¡ãã®ã¯ç§ãã¡ã§ãã atagã¢ãžã¥ãŒã«ã远å ãããšãå
éšè¡šçŸãšãã®æ§é ã®éã®å€æãèšè¿°ããŸãã
é¢é£ä»ãããšã³ããŠãŒã¶ãŒã«æž¡ãã®ã¯ãªãæªãèãã§ããïŒ [ãšã³ããŠãŒã¶ãŒå®å
š]
å®å
šã§ãªãæ§é ç©ã®å®å
šãªã€ã³ã¿ãŒãã§ã€ã¹ãäœæããããã«å€ãã®åªåãããŸããã ããã¯ãRustã§è€æ°å衚瀺ãããŸãã æšæºã©ã€ãã©ãªããã®å¥œäŸã§ãã å®å
šãªã¬ã€ã€ãŒãäœæããçšéã¯äœã§ããïŒ ãã®ã¢ãããŒããNeat Cãªã©ã®èšèªã«ç¿»èš³ã§ããŸããïŒ
ã³ãã³ãã©ã€ã³åŒæ°
CMDLINEã¿ã°ã«ã¯ç¹ã«æ³šæãå¿
èŠã§ãã ãã®ã¿ã°ã¯æ¬¡ã®ããã«å®£èšãããŸãã
struct Cmd {
ã³ã¡ã³ãã«ãããšã cmdãã£ãŒã«ãã«ã¯æååã®æåã®ãã€ããå«ãŸããŠããŸãã èšãæãããšã &cmdã¯Cã«äŒŒãæååãžã®ãã€ã³ã¿ãŒã§ãããæçµçã«ã¯ãŒããã€ãã§çµäºããŸãã ãã®ã¿ã°ã®å®å
šãªããŒãžã§ã³ã¯Cmd(&'static str)ã§ãã rawããŒãžã§ã³ããå®å
šãªããŒãžã§ã³ã«å€æããå Žåããã®è¡ã®ãµã€ãºã決å®ããå¿
èŠããããŸãã ã€ãŸã nullã¿ãŒãããŒã¿ïŒã³ãŒã0æåïŒãèŠã€ããŸãã ãã®åŸãã¢ãã¬ã¹ãšãµã€ãºã䜿çšããŠããããslice::from_raw_parts()ã䜿çšããŠã¹ã©ã€ã¹ã«å€æã§ããŸãã æ¬¡ã«ããã®ã¹ã©ã€ã¹ã¯ã str::from_utf8()ãŸãã¯str::from_utf8_unchecked()ã䜿çšããŠæååã«å€æã§ããŸãã æ¢ã«ã©ã1ã§äœ¿çšããŠããŸãã
ãŸãã ããã§ã pi/src/atagsããatagsã¢ãžã¥ãŒã«ãå®è£
ããããã«å¿
èŠãªãã®ããã¹ãŠpi/src/atags ã atags/raw.rsããraw::Atag::next()ãatags/raw.rsããatags/raw.rs ãã®ã¡ãœããã¯ãçŸåšã®ATAGã®æ¬¡ã®ATAGã®ã¢ãã¬ã¹ã決å®ããŸãã ããã§ã¯ã unsafeã³ãŒãã«é Œããªããã°ãªãunsafe ã æ¬¡ã«ã rawæ§é ããå®å
šãªæ§é ã«å€æããããã®ãã«ããŒã¡ãœãããšããããã£ãå®è£
ããŸããããã¯atags/atag.rs From<&'a raw::Cmd> for Atagããå Žåãå°ãunsafeã§unsafeã³ãŒãã䜿çšããFrom<&'a raw::Cmd> for AtagãFrom<&'a raw::Cmd> for AtagãŸãã Atags ã atags/mod.rsã«ããatags/mod.rsã®Iterator traitãå®è£
ãatags/mod.rs ããã§ã¯ãå°ãunsafeã³ãŒããå¿
èŠã«ãªãå ŽåããããŸãã
ãã³ãïŒ
3è¡ã®ã³ãŒãã§Atags::next()ã¡ãœãããå®è£
ã§ããŸãïŒå°ãªããšã詊ããŠã¿ãŠãã ããïŒïŒã
x: &Tãã*const u32倿ã§ããŸãx as *const T as *const u32ã§ãã
x: *const Tãã&Tãžã®é倿ã¯ã &*xå®è¡ã§ããŸãã
addïŒïŒ subïŒïŒãŸãã¯offsetã䜿çšããŠãçã®ãã€ã³ã¿ãŒã§ç®è¡æŒç®ãå®è¡ã§ããŸãã
ATAGSã®ç¬èªã®å®è£
ããã¹ãããŸãã ã€ãã¬ãŒã¿ãä»ããŠãã¹ãŠã®å€ãååŸãããã¹ãŠãã³ã³ãœãŒã«ã«åºåããŠã¿ãŠãã ããã kernel/src/kmain.rsçŽæ¥ç§»åãkernel/src/kmain.rs ã NONE以å€ã®3ã€ã®ã¿ã°ã®ãã¡å°ãªããšã1ã€ã衚瀺ãããã¯ãã§ãã åæã«ãåATAGã®å®è£
ãæåŸ
ã©ããã§ããããšã確èªããŠãã ããã å®è£
ãå®äºããããæ¬¡ã®ãµããã§ãŒãºã«é²ã¿ãŸãã
ãã³ã ïŒæ§é ã®ããçŸããåºåãã³ã³ãœãŒã«ã«åºåããã«ã¯ã `{ïŒïŒïŒ}ã䜿çšããŸãã
ã¿ã€ãCMDLINEã¿ã°ã«ã¯äœãCMDLINEãŸããïŒ [atag-cmdline]
ãããã®ã¿ã°ã«å€ã¯ãããŸããïŒ ãã¡ãŒã ãŠã§ã¢ããã©ã®ãããªè°è«ããããŸãããïŒ ã©ãããæ¥ããšæããŸãããã©ã®ããã«äœ¿çšã§ããŸããïŒ
MEMã¿ã°ã«åŸã£ãŠäœ¿çšå¯èœãªã¡ã¢ãªéã¯ã©ããããã§ããïŒ [atag-mem]
MEMã¿ã°ã§å ±åããã䜿çšå¯èœãªã¡ã¢ãªã®æ£ç¢ºãªéå§ã¢ãã¬ã¹ãšãµã€ãºã¯äœã§ããïŒ ããã¯ãã¹ãŠãã©ãºããªãŒãæã£ãŠãã1ã®ã¬ãã€ãã®ã¡ã¢ãªã«ã©ããããè¿ãã§ããïŒ
ãµããã§ãŒãºCïŒãŠã©ãŒã ã¢ãã
ãã®ãµããã§ãŒãºã§ã¯ã2ã€ã®ã¡ã¢ãªã¢ãã±ãŒã¿ã®åŸç¶ã®æžã蟌ã¿ã«å¿
èŠãªãã¹ãŠãæºåããŸãã ã¢ãã¬ã¹ã2ã®ã¹ãä¹ã«æãã颿°align_upããã³align_downãå®è£
ããŸãã ããã«ãã·ã¹ãã ã¡ã¢ãªããéå§ã¢ãã¬ã¹ãšçµäºã¢ãã¬ã¹ãè¿ãmemory_map颿°ãå®è£
ããŸãã ãã®é¢æ°ã¯äž¡æ¹ã®ã¢ãã±ãŒã¿ãŒã«ãã£ãŠäœ¿çšãããå²ãåœãŠã«äœ¿çšå¯èœãªã¡ã¢ãªãŒéãæ±ºå®ããŸãã
ã¢ã©ã€ã¡ã³ã
ã¡ã¢ãªå
ã®ã¢ãã¬ã¹ã¯ãNã§å®å
šã«åå²ããããšãNãã€ãã§ã¢ã©ã€ã³ããããšåŒã°ããŸã N ã€ãŸããã¢ãã¬ã¹k k % n == 0ãçã«ãªããŸãã éåžžãèšæ¶ã調æŽããããšãå¿é
ããå¿
èŠã¯ãããŸããã ãã ããçŸåšã¯ã·ã¹ãã ããã°ã©ãã§ãã ãã®ãããã¯ãžã®æ³šç®ãé«ãŸã£ãŠããã®ã¯ãããŒããŠã§ã¢ããããã³ã«ãããã³ãã®ä»ãã¹ãŠããã¢ã©ã€ã¡ã³ãã«é¢ããŠéåžžã«ç¹å®ã®ããããã£ãèŠå®ããŠãããšããäºå®ã«é¢é£ããŠããŸãã ããšãã°ã32ãããARMã¢ãŒããã¯ãã£ã§ã¯ãã¹ã¿ãã¯ãã€ã³ã¿ãŒã8ãã€ãã«ã¢ã©ã€ã¡ã³ããããŠããå¿
èŠããããŸãã AArch64ã¢ãŒããã¯ãã£ïŒãã®å ŽåïŒã§ã¯ãã¹ã¿ãã¯ãã€ã³ã¿ãŒã«16ãã€ãã®ã¢ã©ã€ã¡ã³ããå¿
èŠã§ãã x86-64ã§ãã»ãŒåãããšãå¿
èŠã§ãã ã¡ã¢ãªã®ããŒãžã®ã¢ãã¬ã¹ã¯ã4ãããã€ãã«æããå¿
èŠããããŸãã ããã«å€ãã®ç°ãªãäŸããããŸããããããªãã§ã¯ã§ããªãããšã¯ãã§ã«ããã£ãŠããŸãã
Cute Cã§ã¯ãlibCããã¢ãã±ãŒã¿ã«ãã£ãŠè¿ãããã¡ã¢ãªã¢ãã¬ã¹ã¯ã32ãããã·ã¹ãã ã§ã¯8ãã€ãã64ãããã·ã¹ãã ã§ã¯16ãã€ãã§ããããšãä¿èšŒãããŸãã ããã«ãåŒã³åºãå
ã¯ãè¿ãããã¡ã¢ãªã¢ãã¬ã¹ã®ã¢ã©ã€ã¡ã³ããæç¢ºã«å¶åŸ¡ããããšã¯ã§ãããèªåã§åŠçããå¿
èŠããããŸãã ãã®ããã«ãããšãã°ãPOSIXæšæºã®posix_memalign颿°ããããŸãã
Neat Cã§ãã®ãããªã¢ã©ã€ã¡ã³ãããããã£ãéžæãããã®ã¯ãªãã§ããïŒ [libc-align]
mallocã·ã¹ãã 颿°ã®ã¢ã©ã€ã¡ã³ãã«8ãã€ããŸãã¯16ãã€ãã®ä¿èšŒãéžæããŠããæ ¹æ ã¯ãããŸããã æšæºCã©ã€ãã©ãªã§ãã®ãããªä¿èšŒãéžæãããã®ã¯ãªãã§ããïŒ
Cute Cã§ã¯ã malloc()ããã³free()宣èšã¯æ¬¡ã®ããã«ãªããŸãã
void *malloc(size_t size); void free(void *pointer);
Rustã¯ãäœå®å
šã¬ãã«ã§allocãšdeallocã䜿çšããŸããããã¯æ¬¡ã®ããã«ãªããŸãã
åŒã³åºãã³ãŒãã¯æŽåã瀺ãå Žåãããããšã«æ³šæããŠãã ããã ãã®çµæãåŒã³åºãå
ã®ã³ãŒãã§ã¯ãªãã¢ãã±ãŒã¿ãŒããæŽåããããã€ã³ã¿ãŒãè¿ãããã«æ³šæããå¿
èŠããããŸãã æ¬¡ã®ãµããã§ãŒãºã§ã¡ã¢ãªã¢ãã±ãŒã¿ãå®è£
ããå Žåãæ»ãã¢ãã¬ã¹ãæ£ããæŽåãããŠããããšã確èªããå¿
èŠããããŸãã
ããã«ã deallocãšã¯ç°ãªãdeallocã§ã¯ãåŒã³åºãåŽãallocãšãŸã£ããåãLayoutæž¡ãå¿
èŠãããããšã«æ³šæããŠdealloc ã ãããã£ãŠãå€éšã³ãŒãã¯ãç¹å®ã®å²ãåœãŠãããã¡ã¢ãªã®ãµã€ãºãšã¢ã©ã€ã³ã¡ã³ãã®æ ŒçŽã«æ³šæããå¿
èŠããããŸãã
ãã®ããã«Rustã責任ãã¢ãã±ãŒã¿ãŒãšåŒã³åºãã³ãŒããšã«åããŠãããšæãã®ã¯ãªãã§ããïŒ [onus]
ãã¥ãŒããªã¢ãã±ãŒã¿ã§ã¯ãè¿ãããšãã§ããã¡ã¢ãªã¢ãã¬ã¹ã®ã¢ã©ã€ã¡ã³ãã«é¢ããå¶éãå°ãªããªããŸãã ãã ããåæã«ãå²ãåœãŠãããã¹ããŒã¹ã®ãµã€ãºãä¿æããå¿
èŠããããŸãã Rustã§ã¯ããŸã£ããéã§ãã ãªãRustã¯å察ã®éãéžãã ãšæããŸããïŒ ããã¯ã¢ãã±ãŒã¿ãŒãšåŒã³åºãã³ãŒãã«ã©ã®ãããªå©ç¹ããããŸããïŒ
align_up ïŒ align_upããã³align_down
次ã®ãµããã§ãŒãºã§ã¢ãã±ãŒã¿ãŒãå®è£
ããå Žåãæ¬¡ãŸãã¯åã®ã¢ã©ã€ã¡ã³ããããã¢ãã¬ã¹ãå€å¥ããã®ã«åœ¹ç«ã¡ãŸãã ã€ãŸã ã¢ãã¬ã¹u次ã®>=ãŸãã¯<= u ã2ã®çޝä¹ã§æŽåãããŸãã align_upããã³align_downãæ¢ã«ïŒãã¡ããå®çŸãããŠãalign_up ïŒããalign_down ã ãããã¯kernel/src/allocator/util.rs ã ãããã¯ããããæ¬¡ã®ããã«å®£èšãããŸãïŒ
ãããã®æ©èœãä»ãããªãªãŒã¹ããŠãã ããã kernelãã£ã¬ã¯ããªããmake testãŸãã¯cargo teståŒã³åºãmake testã«ããããã®ããã»ã¹ã®æ£åœæ§ã確èªã§ãkernel ã ãã¹ãèªäœã¯kernel/src/allocator/tests.rs ã ãã®éšåã®ãã¹ãŠãæ£ããå Žåã align_utilãã¹ãŠã®ãã¹ãã«align_utilã¯ãã§ãã
泚æ ïŒ kprint{ln}!ãã¹ãäžkprint{ln}! print{ln}!åŒã³åºãã«ãªããŸãprint{ln}! ãã¹ãŠãæ©èœããã¯ãã§ãã
ãã³ãïŒ
å®è£
ã¯1è¡ãŸãã¯2è¡ãå æããŸãã
align_upãšalign_downã¯äºãã«éåžžã«äŒŒãŠããŸãã
ã¹ã¬ããã»ãŒã
libCã®malloc()ããã³å®è£
ãã2ã€ã®ã¡ã¢ãªã¢ãã±ãŒã¿ã¯ã°ããŒãã«ã§ãã ã€ãŸã ãã€ã§ãã©ãã§ãåŒã³åºãããšãã§ããŸãã ä»»æã®ã¹ããªãŒã ã«å«ããã ãããã£ãŠãã¢ãã±ãŒã¿ãŒã¯ã¹ã¬ããã»ãŒãã§ãªããã°ãªããŸããã Rustã¯ã¹ã¬ããã®å®å
šæ§ãéåžžã«éèŠããŠããŸãã ãã®ãããã·ã¹ãã ã«äžŠè¡æ§ãåŠçããã¡ã«ããºã ïŒã¹ã¬ãããªã©ïŒããŸã ãªãå Žåã§ããã¢ãã±ãŒã¿ãŒãå®è£
ããããšã¯å°é£ã§ãã
ã¹ã¬ããã»ãŒãã¡ã¢ãªã¢ãã±ãŒã¿ãŒã®ãããã¯ã¯éåžžã«åºç¯å²ã§ãã ãã®ãããã¯ã«ã€ããŠã¯ãå€ãã®ç ç©¶ãèŠã€ãããŸãã çŸæç¹ã§ã¯ããã®ãããã¯ã«ã€ããŠã¯è§ŠããŸããã Mutexã¡ã¢ãªMutexãã©ããããã ãã§ãã ãã®ã©ãããŒã¯æ¢ã«kernel/src/allocator/mod.rs ä»ãããã®ã³ãŒãããã¹ãŠèªãã§ãã ããã Allocç¹æ§ã®å®è£
ãããã«ããããšã«æ³šæããŠãã ããã ããã«ãããRustã¯ãããéåžžã«æå¹ãªã¢ãã±ãŒã¿ãŒã§ããããšãç¥ãããšãã§ããŸãã , #[global_allocator] ( kmain.rs ). #[global_allocator] â , , Rust- Vec , String Box . ã€ãŸã alloc() dealloc() , .
Alloc Allocator kernel/src/allocator/mod.rs imp::Allocator , mutex . imp . . #[path = "bump.rs"] , Rust-, . #[path] . bump- bump.rs . bin- bin.rs .
: memory_map
kernel/src/allocator/mod.rs â memory_map . Allocator::initialize() , kmain() . initialize() imp::Allocator .
memory_map . , . ã€ãŸã , ATAGS. , . binary_end . , _end ( layout.ld ).
memory_map , Atags B binary_end . , . - String::from("Hi!") . . , panic!() bump-. memory_map , bump- â . , .
D: Bump-

. Bump-. kernel/src/allocator/bump.rs .
Bump- . alloc current . . current ( ). , . dealloc .
, , , 1 , 512 . , .

, kernel/src/allocator/bump.rs . ã€ãŸã new() , alloc() dealloc() bump::Allocator . align_up align_down , . -. make test cargo test kernel . allocator::bump_* .
. , , !
saturating_add saturating_sub .
- , kmain() . :
let mut v = vec![]; for i in 0..1000 { v.push(i); kprintln!("{:?}", v); }
â .
alloc ? [bump-chain]
bump::Allocator::alloc() . ? : , v.push(i) bump::Allocator::alloc() .
E: Bin-

: bin-. kernel/src/allocator/bin.rs .
Bin- , . ( ) , . . â . , . .
, , . k - 2 2^n n , 3 k ( 2^3 , 2^4 ⊠2^k ). , 2^3 , 2^3 . 2^3 2^4 2^4 :
- bin 0 (
2^3 ) (0, 2^3] - bin 1 (
2^4 ) (2^3, 2^4] - bin 2 (
2^5 ) (2^4, 2^5] - bin k (
2^k ) (2^(k - 1), 2^k] - ...
(intrusive) . kernel/src/allocator/linked_list.rs . kernel/src/allocator/bin.rs LinkedList , .
?
next ( previous ) . . .
LinkedList::new() . push() . ( ), pop() . peek() . :
let mut list = LinkedList::new(); unsafe { list.push(address_1); list.push(address_2); } assert_eq!(list.peek(), Some(address_2)); assert_eq!(list.pop(), Some(address_2)); assert_eq!(list.pop(), Some(address_1)); assert_eq!(list.pop(), None);
LinkedList . iter() . . iter_mut() . Node , . value() pop() .
let mut list = LinkedList::new(); unsafe { list.push(address_1); list.push(address_2); list.push(address_3); } for node in list.iter_mut() { if node.value() == address_2 { node.pop(); } } assert_eq!(list.pop(), Some(address_3)); assert_eq!(list.pop(), Some(address_1)); assert_eq!(list.pop(), None);
LinkedList . , push() . LinkedList .
? [ll-alloc]
â . , , ?
, , . , . . , . . . .
:
- . , ( ). bin- .
- . , - . bin- , . .
, .
å®è£
bin- kernel/src/allocator/bin.rs . ( , bin- ) . . . - . make test cargo test . bump.rs bin.rs #[path] kernel/src/allocator/mod.rs . ãŸãã€ãŸã bump-, bin, .
bin- â .
? [bin-about]
. :
? [bin-frag]
! , ? ( ) .

UPD :