ãã®ããŒãã§ã¯ã 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 :