ãã¡ã€ã«ã·ã¹ãã ãäœæããŸãã ãã¡ã€ã«ã·ã¹ãã ã¯ããèªäœãæžã蟌ã¿ãŸããã ã©ãã®ãã®ååã§ã¯ãFAT32ãã¡ã€ã«ã·ã¹ãã ãå®è£
ããSDã«ãŒããã©ã€ããŒãããã«åºå®ããã€ã³ã¿ã©ã¯ãã£ãã·ã§ã«ãä»ããŠå°ãããåãããŸãã
ãŒãã©ã
æåã®ã©ãïŒ è¥ãååãšå€ãåå
æãè¥ãéšå ã ã«ããã®äžã§ç¶ããã
ãã§ãŒãº2ïŒ32ãããè質
ãã®ãã§ãŒãºã§ã¯ãFAT32ãã¡ã€ã«ã·ã¹ãã ãå®è£
ããŸãã çŸæç¹ã§ã¯æä»çã«èªã¿åãå°çšã§ãã äž»ãªäœæ¥ã¯ã 2-fs/fat32
ãŸãã
ãã£ã¹ã¯ãšãã¡ã€ã«ã·ã¹ãã
ãã£ã¹ã¯äžã®ããŒã¿ã¯ã1ã€ä»¥äžã®ãã¡ã€ã«ã·ã¹ãã ã«ãã£ãŠç®¡çãããŸãã ã¡ã¢ãªã¢ãã±ãŒã¿ãšåæ§ã«ããã¡ã€ã«ã·ã¹ãã ã¯ã¡ã¢ãªã®ç®¡çãå²ãåœãŠãããã³è§£æŸãè¡ããŸãã å¯äžã®éãã¯ãããã¯é«éRAMã§ã¯ãªããäœéã§äžæ®ââçºæ§ã®ã¡ã¢ãªã§ããããšã§ãã ã€ãŸãããã¹ãŠã®å€æŽã¯å°æ¥ãã€ã§ãä¿åãããŸãã ã³ã³ãã¥ãŒã¿ãŒã®åèµ·ååŸãå«ãã å€ãã®ç°ãªããã¡ã€ã«ã·ã¹ãã ããããŸãã Linuxã«ã¯ãEXT4ããããŸãã MacOSã«ã¯HFS +ãšAPFSããããŸãã Windowsã«ã¯NTFSããããŸãã äžéšã®ãã¡ã€ã«ã·ã¹ãã ã¯ãäžåºŠã«è€æ°ã®OSã«å®è£
ãããŸãã FAT32ã¯ãã®ãããªãã®ã§ãã LinuxãmacOSãWindowsãå«ããã¹ãŠã®äž»èŠãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«å®è£
ãããŠããŸãã å
ã
ã¯ãDOSã®åŸã®ããŒãžã§ã³ãšWindowsã®åã®ããŒãžã§ã³ã§äœ¿çšãããŠããŸããã FAT32ã®äž»ãªå©ç¹ã¯ãã©ãã«ã§ãããããšã§ãã ããã¯ãæãã¯ãã¹ãã©ãããã©ãŒã ãªãã¡ã€ã«ã·ã¹ãã ã®1ã€ã§ãã
ãã£ã¹ã¯äžã«è€æ°ã®ãã¡ã€ã«ã·ã¹ãã ãé
眮ã§ããããã«ããããã«ããã®åããã£ã¹ã¯ãããŒãã£ã·ã§ã³ã«åå²ã§ããŸãã åã»ã¯ã·ã§ã³ã¯ãç°ãªããã¡ã€ã«ã·ã¹ãã çšã«åå¥ã«ãã©ãŒãããã§ããŸãã ãã£ã¹ã¯ãããŒãã£ã·ã§ã³åå²ããããã«ããã£ã¹ã¯ã¯ãã©ã®ã»ã¯ã·ã§ã³ãéå§ããããããŠã³ããŒããããå Žæãããã³ãã®ã»ã¯ã·ã§ã³ã䜿çšãããã¡ã€ã«ã·ã¹ãã ã®ã¿ã€ããç¹å®ã®å Žæã«æžã蟌ã¿ãŸãã 1ã€ã®äžè¬çãªã·ã¹ãã ã¯ããã¹ã¿ãŒããŒãã¬ã³ãŒãããŸãã¯åã«MBRã§ãã MBRã«ã¯ãã»ã¯ã·ã§ã³ã説æãã4ã€ã®ãšã³ããªã®ããŒãã«ãå«ãŸããŠããŸãã ãã ããäžéšã®ã»ã¯ã·ã§ã³ã¯äœ¿çšæžã¿ãšããŠå®£èšãããªãå ŽåããããŸãã GPTã®ãããªè¥å¹²æ°ããããŒãã£ã·ã§ã³ã¹ããŒã ããããŸããããã¯ãç¹ã«4ã€ä»¥äžã®ããŒãã£ã·ã§ã³ããµããŒãããŸãã
ãã®å²ãåœãŠã§ã¯ã1ã€ã®FAT32ããŒãã£ã·ã§ã³ãå«ããã£ã¹ã¯ããMBRãèªã¿åãã³ãŒããå®è£
ããŸãã ãã®çµã¿åããã¯ãã©ãºããªãŒã«ãã£ãŠäœ¿çšãããŸããMBRãšFAT32ã䜿çšãããŸãã
ãã£ã¹ã¯ã®ããŒãã£ã·ã§ã³åå²
次ã®å³ã¯ãMBRãšFAT32ã䜿çšãããã£ã¹ã¯ããŒãã£ã·ã§ã³ã®ç©çã¬ã€ã¢ãŠãã瀺ããŠããŸãã

FATæ§é PDFã«ã¯ããããã®æ§é ã®ãµã€ãºãšå
容ã«é¢ããå¿
èŠãªæ
å ±ããã¹ãŠå«ãŸããŠããŸãã æäœéå¿
èŠãªèª¬æãšãšãã«ã ãã¡ã€ã«ã·ã¹ãã ãå®è£
ãããšãã«ããã¥ã¡ã³ãã䜿çšããŸãã ããã«ã察å¿ãããŠã£ãããã£ã¢ã®èšäºã調ã¹ãããšã圹ç«ã¡ãŸã ã
ãã¹ã¿ãŒããŒãã¬ã³ãŒã
MBRã¯åžžã«ãã£ã¹ã¯ã®ãŒãã»ã¯ã¿ãŒã«ãããŸãã MBRã«ã¯4ã€ã®ããŒãã£ã·ã§ã³ãšã³ããªãå«ãŸããŸãã ãããã®åãšã³ããªã«ã¯ãã»ã¯ã·ã§ã³ã®ã¿ã€ããã»ã¯ã¿ãŒå
ã®ã»ã¯ã·ã§ã³ã®ãªãã»ãããããã³ãã®ã»ã¯ã·ã§ã³ãããŒãå¯èœãã©ãããªã©ã®ããŸããŸãªãã©ã°ãå«ãŸããŸãã CHSïŒã·ãªã³ããŒãããããã»ã¯ã¿ãŒïŒãªã©ã®ä»ã®ãã¹ãŠã®ãã£ãŒã«ãã¯å®å
šã«ç¡èŠã§ããŸãã ããã¯ãã»ãšãã©ã®ææ°ã®å®è£
ãè¡ãããšã§ãã FAT32ã®ããŒãã£ã·ã§ã³ã¿ã€ãã0xB
ãŸãã¯0xB
ããããšã泚ç®ã«å€ããŸãã
æ¡åŒµBIOSãã©ã¡ãŒã¿ãããã¯
FAT32ããŒãã£ã·ã§ã³ã®æåã®ã»ã¯ã¿ãŒã«ã¯ãBIOSãã©ã¡ãŒã¿ãŒã®æ¡åŒµãããã¯ãå«ãŸããŠããŸãã é åèªEBPBã ãã®ãããã¯èªäœã¯ãBIOSãŸãã¯BPBãã©ã¡ãŒã¿ãŒãããã¯ã§å§ãŸããŸãã äžç·ã«ãFATãã¡ã€ã«ã·ã¹ãã ã«å¿
èŠãªãã¹ãŠã®ã¬ã€ã¢ãŠããªãã·ã§ã³ã決å®ããŸãã
EBPBã«ã¯ãç¹å¥ãªæ³šæãæã䟡å€ã®ããé åã1ã€ãããŸãã äºçŽæžã¿ã»ã¯ã¿ãŒã®æ°ã決å®ãããã®ã ããã¯ãFATãèŠã€ããã»ã¯ã¿ãŒã®FAT32ã»ã¯ã·ã§ã³ã®å
é ããã®ãªãã»ããã§ãã æåŸã®FATã®çŽåŸã«ãã¯ã©ã¹ã¿ãŒã®ããŒã¿ãå«ãé åããããŸãã æ¬¡ã«ãFATãããŒã¿é åãã¯ã©ã¹ã¿ãŒãããã«è©³ããèŠãŠãããŸããããã ãã§ãã
ã¯ã©ã¹ã¿ãŒ
FATãã¡ã€ã«ã·ã¹ãã ã«ä¿åãããŠãããã¹ãŠã®ããŒã¿ã¯ã¯ã©ã¹ã¿ãŒã«åå²ãããŸãã EBPBã«ã¯ãã¯ã©ã¹ã¿ãŒå
ã®åã¯ã©ã¹ã¿ãŒã®ã»ã¯ã¿ãŒæ°ã確èªã§ãããã£ãŒã«ãããããŸãã ã¯ã©ã¹ã¿ãŒã®çªå·ä»ãã¯2ããå§ãŸããŸããå³ãããããããã«ãã¯ã©ã¹ã¿ãŒ2ã®ããŒã¿ã¯ããŒã¿é åã®å
é ã«ãããŸãã ã¯ã©ã¹ã¿ãŒ3ã®ããŒã¿ã¯ãã¯ã©ã¹ã¿ãŒ2ã®çŽåŸã«é
眮ãããŸãã
ãã¡ã€ã«å²ãåœãŠããŒãã«
FATã¯ãã¡ã€ã«ã¢ãã±ãŒã·ã§ã³ããŒãã«ã®ç¥ã§ãã ãã¡ã€ã«é
åžããŒãã«ã FATãšããååã«åºã¥ããŠãããã¯FATã¬ã³ãŒãã®ããŒãã«ïŒé
åïŒã§ãã FAT32ã§ã¯ããã®ãããªåæžã蟌ã¿ã®ãµã€ãºã¯32ãããã§ãã ãã®ããŒãã«å
šäœã®ãµã€ãºã¯ãEPBPã®FATãããã®ã»ã¯ã¿ãŒãšã»ã¯ã¿ãŒãããã®ãã€ããã£ãŒã«ãã«ãã£ãŠæ±ºãŸããŸãã åé·æ§ã®ããã«ããã¡ã€ã«ã·ã¹ãã ã«è€æ°ã®FATãååšããå ŽåããããŸãïŒèãªãããã¯ã¢ããã®ååã§ïŒïŒã ããŒãã«ã®æ°ã¯EPBPã§ã確èªã§ããŸãã FATã®ãã£ãŒã«ãçªå·ãåç
§ããŠãã ããã
0ãš1ã®çªå·ãä»ããããã¬ã³ãŒãã«å ããŠãåFATã¬ã³ãŒããã¯ã©ã¹ã¿ãŒã®ç¶æ
ãæ±ºå®ããŸãã æ³š2ã¯ã¯ã©ã¹ã¿ãŒ2ã®ã¹ããŒã¿ã¹ã瀺ããŸããããªã³ã¯3ã¯ã¯ã©ã¹ã¿ãŒ3ã®ã¹ããŒã¿ã¹ã決å®ããŸãã åã¯ã©ã¹ã¿ãŒã«ã¯ç¬èªã®FATã¬ã³ãŒãããããŸãã
ãšã³ããª0ãš1ãæãå¯èœæ§ãé«ãã§ãã
- ãšã³ããª0ïŒ
0xFFFFFFFN
ãããã¯IDã§ãã - ã¬ã³ãŒã1ïŒã¯ã©ã¹ã¿ãŒãã§ãŒã³ã®çµäºïŒEOCïŒããŒã«ãŒã
ããã2ã€ã®ã¬ã³ãŒãã«å ããŠãä»ã®ãã¹ãŠã®ã¬ã³ãŒãã¯ããŒã¿é åã®ç¹å®ã®ã¯ã©ã¹ã¿ãŒã«å¯Ÿå¿ããŠããŸãã FATã¬ã³ãŒãã¯ãã«ãµã€ãºã§32ãããã§ããã䜿çšãããã®ã¯28ãããã®ã¿ã§ãã äžäœ4ãããã¯ç¡èŠãããŸãã ãŸããå€ã¯æ¬¡ã®ãšããã§ãã
0x?0000000
ïŒæªäœ¿çšã®ã¯ã©ã¹ã¿ãŒã空ã«ããŸãã0x?0000001
ïŒäºçŽæžã¿ã0x?0000002
0x?FFFFFEF
ïŒããŒã¿ã¯ã©ã¹ã¿ãŒã ç¹å®ã®å€ã¯ããã§ãŒã³å
ã®æ¬¡ã®ã¯ã©ã¹ã¿ãŒã§ãã0x?FFFFFF0
0x?FFFFFF6
ïŒäºçŽæžã¿ã0x?FFFFFF7
ïŒäºçŽæžã¿ãŸãã¯ç Žæããã¯ã©ã¹ã¿ãŒã0x?FFFFFF8
0x?FFFFFFF
ïŒãã§ãŒã³ã®æåŸã®ã¯ã©ã¹ã¿ãŒã EOCããŒã«ãŒã§ãªããã°ãªããŸããã
ã¯ã©ã¹ã¿ãŒãã§ãŒã³
ã¯ã©ã¹ã¿ãŒã¯ã¯ã©ã¹ã¿ãŒã®ãã§ãŒã³ã圢æããŸãã ããã¯ãæ¬è³ªçã«ã¯ã©ã¹ã¿ãŒã®ãªã³ã¯ãªã¹ãã§ãã ã¯ã©ã¹ã¿ãŒãããŒã¿ã«äœ¿çšãããå Žåããã®å€ã«ã¯æ¬¡ã®ã¯ã©ã¹ã¿ãŒãžã®ãªã³ã¯ãå«ãŸãããããã§ãŒã³ã®çµããã瀺ãEOCããŒã«ãŒã«ãªããŸãã
äŸãšããŠã8ã€ã®FATã¬ã³ãŒããå«ããã£ãŒããèããŸãã

ã¯ã©ã¹ã¿ãŒã¯è²ã§è²åããããŠãããããã©ã®ãã§ãŒã³ã«å±ããŠããããç°¡åã«ææ¡ã§ããŸãã æåã®2ã€ã®ãšã³ããªã¯IDãšEOCã§ãã ã¬ã³ãŒã2ã¯ã察å¿ããã¯ã©ã¹ã¿ãŒãããŒã¿ã¯ã©ã¹ã¿ãŒã§ããããã®ãã§ãŒã³ïŒç·è²ïŒã1ã¯ã©ã¹ã¿ãŒã®ãµã€ãºã§ããããšã瀺ããŠããŸãã ã¬ã³ãŒã3ã¯ãã¯ã©ã¹ã¿ãŒ3ã«ããŒã¿ãå«ãŸããŠããããã§ãŒã³ã®æ¬¡ïŒéïŒãã¯ã©ã¹ã¿ãŒ5ã«ãªããã¯ã©ã¹ã¿ãŒ6ããã®ãã§ãŒã³ãåæããããšã瀺ããŸãã åæ§ã«ãã¯ã©ã¹ã¿ãŒ7ãšã¯ã©ã¹ã¿ãŒ5ã¯ãã§ãŒã³ã圢æããŸãïŒèµ€ïŒã ã¯ã©ã¹ã¿ãŒçªå·8ã¯ç¡æã§äœ¿çšãããŠããŸããã
ã«ã¿ãã°ãšèšé²
ã¯ã©ã¹ã¿ãŒãã§ãŒã³ã¯ããã¡ã€ã«ãŸãã¯ãã£ã¬ã¯ããªã®ããŒã¿ã§ãã ãã£ã¬ã¯ããªã¯ããã¡ã€ã«åãšä»ã®ãã¹ãŠã®ã¡ã¿ããŒã¿ãå«ãç¹å¥ãªãã¡ã€ã«ã®æ¬è³ªã§ãã ã¬ãžã§ããå
ã«ã¯ãã«ã¿ãã°ãšã³ããªã®é
åããããŸãã åãšã³ããªã«ã¯ãååãéå§ã¯ã©ã¹ã¿ãããã³ãã®ãšã³ããªããã£ã¬ã¯ããªãåãªããã¡ã€ã«ããå«ãŸããŸãã
ä»ã®ãã£ã¬ã¯ããªã®ãšã³ããªã«é¢é£ä»ããããŠããªãç¹å¥ãªãã£ã¬ã¯ããªã1ã€ãããŸãã ã«ãŒããã£ã¬ã¯ããªã ã«ãŒããã£ã¬ã¯ããªã®éå§ã¯ã©ã¹ã¿ãŒã¯ãEBPBã«ãããŸãã ããã«ãããä»ã®ãã¹ãŠã®ãã¡ã€ã«ãšãã£ã¬ã¯ããªã®å Žæãç¹å®ã§ããŸãã
æŽå²çãªçç±ã«ãããç©çãã£ã¬ã¯ããªã®åãšã³ããªã¯ã2ã€ã®ç°ãªãæ¹æ³ã§è§£éã§ããŸãã 屿§ãã£ãŒã«ãã¯ããããã®ã¡ãœããã®ãããããæããŸãã ããã2ã€ã®ããªãšãŒã·ã§ã³ã¯æ¬¡ã®ãšããã§ãã
- éåžžã®ã«ã¿ãã°ãšã³ããªã ïŒéåžžã®ãã£ã¬ã¯ããªãšã³ããªïŒ
- é·ããã¡ã€ã«åã®ãšã³ããªã ïŒé·ããã¡ã€ã«åã®ãšã³ããªïŒ
11æåããé·ããã¡ã€ã«åã䜿çšããããã«ãé·ããã¡ã€ã«åïŒLFNïŒãFAT32ã«è¿œå ãããŸãã ãšã³ããªã®ååã11æåãè¶
ããå ŽåãLFNãšã³ããªãåã«ä»ããŸãã ãã ãããããã®ã¬ã³ãŒãã¯ç©ççã«ãœãŒããããŠããŸããã 代ããã«ãã·ãŒã±ã³ã¹ã決å®ããããã®ãã£ãŒã«ããå«ãŸããŠããŸãã ãããã£ãŠãLFNã¬ã³ãŒãã®ç©ççãªé åºã¯ä¿¡é Œã§ããŸããã
ã ãã
ç¶è¡ããåã«ãFATæ§é ãçè§£ããå¿
èŠããããŸãã ãã®åŸã次ã®è³ªåã«çããŠãã ããã
æåã®ã»ã¯ã¿ãŒã«MBRæ§é ãå«ãŸããŠãããã©ããã確èªããæ¹æ³ã¯ïŒ [mbr-magic]
ãã£ã¹ã¯ã®æåã®ã»ã¯ã¿ãŒã«MBRãå«ãŸããŠããªãå ŽåããããŸãã MBRãååšãããã©ããã確èªããã«ã¯ã©ãããã°ããã§ããïŒ
FAT32ã¯ã©ã¹ã¿ãŒã®æå€§æ°ã¯ããã€ã§ããïŒ [æå€§ã¯ã©ã¹ã¿ãŒ]
FAT32ã®èšèšã«ã¯ãããã€ãã®å¶éããããŸãã FAT32ã®ã¯ã©ã¹ã¿ãŒã®æå€§æ°ãšããããã®å¶éã¯ã©ãããæ¥ãŸããïŒ FAT16ã䜿çšããå Žåãåãå¶éãŸãã¯ä»ã®å¶éããããŸããïŒ
åäžãã¡ã€ã«ã®æå€§ãµã€ãºã¯ïŒ [æå€§ãã¡ã€ã«ãµã€ãº]
æå€§ãã¡ã€ã«ãµã€ãºã«å¶éã¯ãããŸããïŒ ãããããªããæå€§ãã¡ã€ã«ãµã€ãºã¯äœã§ããããã®å¢çãæ±ºå®ãããã®ã¯äœã§ããïŒ
ãã³ã ïŒãã£ã¬ã¯ããªå
ã®ãšã³ããªã®æ§é ãèŠãŠãã ããã
LFNã¬ã³ãŒãããããã©ããã倿ããæ¹æ³ [lfn-identity]
ãã£ã¬ã¯ããªå
ã®ãšã³ããªãããèŠããšãLFNãç®ã®åã«ããã®ããéåžžã®ãšã³ããªã«ããã®ããæ£ç¢ºã«å€æããã®ã¯ã©ã®ãã€ãã§ããïŒ å
·äœçã«ã¯ããããã®ãã€ãã¯äœã§ãã©ã®ãããªå€ãå¿
èŠã§ããïŒ
/a/b/c.txt
[ããã¥ã¢ã«æ€çŽ¢] ãèŠã€ããã«ã¯ã©ãããã°ããã§ãã
EBPBã念é ã«çœ®ããŠã /a/b/c.txt
ãã¡ã€ã«ã®åæã¯ã©ã¹ã¿ãŒãèŠã€ããããã«å®è¡ãããã¹ãŠã®æé ã説æããŸãã
ã³ãŒãæ§é
ãã¡ã€ã«ã·ã¹ãã ãæžãããšã¯éåžžã«å¥åŠãªããšã§ãã FAT32ã¯ããããèªãã ãã§ãããäŸå€ã§ã¯ãããŸããã 2-fs/fat32
æäŸãããã³ãŒãã¯åºæ¬çã«åºæ¬æ§é ãæäŸããŸãããå€ãã®èšèšäžã®æ±ºå®ãšå®è£
ã®å€§éšåã¯å®å
šã«ããªãã®ãã®ã§ãã
次ã«ããã§ã«æºåãæŽã£ãŠãããã®ã«ã€ããŠèª¬æããŸãã fat32/src
ãã£ã¬ã¯ããªããã³ãŒããèªã¿åããŸãã
ãã¡ã€ã«ã·ã¹ãã ã®ç¹æ§
ããã§ã traits
ã¢ãžã¥ãŒã«ãèŠã€ããããšãã§ããŸãã ãšã³ããªãã€ã³ãã¯traits/mod.rs
ããã«ã¯ãçŽ7ã€ã®ç¹æ§ãš1ã€ã®æ§é ããããŸãã ãã¡ã€ã«ã·ã¹ãã ãå®è£
ããå Žåãããããã¹ãŠå®è£
ããŸãã
ã»ãšãã©ã®ç¹æ§ã®æ¶ç©ºã®å®è£
ãæäŸããDummy
æ§é ã1ã€ãããŸãã ãã®ã¿ã€ãã¯ã¹ã¿ããšããŠäœ¿çšã§ããŸãã ã³ãŒããããèŠããšããã®ã¹ã¿ãã¯ããã€ãã®å Žæã§äœ¿çšãããŠããŸãã ãã¶ãããªãã¯äŸ¿å©ã«ãªãã§ãããã
次ã®é åºã§traits/
ããã³ãŒããèªãããšããå§ãããŸãã
traits/block_device.rs
ããã®BlockDevice
ã ãã¡ã€ã«ã·ã¹ãã ã¯ããžã§ããªãã¯ã«ãã£ãŠç©ç/ä»®æ³ã¹ãã¬ãŒãžããåé¢ãããŸãã ã€ãŸãããã¡ã€ã«ã·ã¹ãã ã¯ã©ã®ããã€ã¹ã§ãåäœããŸããããã®ããã€ã¹èªäœã¯BlockDevice
å®è£
ãBlockDevice
ã å®è£
/ãã¹ãããã»ã¹ã§ã¯ãéåžžã®ãã¡ã€ã«ã®äžã«BlockDevice
å®è£
ã䜿çšã§ããŸãã ãã¡ããã䟿å©ãã®åã«ãããŠïŒ ãããã BlockDevice
ã¯ã BlockDevice
SDã«ãŒããã©ã€ããŒãEMMCã³ã³ãããŒã©ãŒãšäžç·ã«ã©ããããŸããããã ãã§ãã éãã¯ã»ãšãã©ç®ç«ã¡ãŸãããtraits/fs.rs
ããã®File
ã Dir
ããã³Entry
ãããã®ç¹æ§ã¯ããã¡ã€ã«ããã£ã¬ã¯ããªããŸãã¯ãããã®äžè¬åããã¡ã€ã«ã·ã¹ãã ã«ã©ã®ãããªæå°éã®ããããã£ãæã€ã¹ãããæ±ºå®ããŸãã ããããäºãã«äŸåããŠããããšã«æ³šæããŠãã ããã ããšãã°ã Entry
ããããã£ã¯ãé¢é£ä»ããããFile
ã¿ã€ãã䜿çšãFile
ãtraits/fs.rs
FileSystem
ãã®ç¹æ§ã¯ããã¡ã€ã«ã·ã¹ãã ã®ããããã£ãå®çŸ©ããŸãã ä»ã®ç¹æ§ãžã®ãã€ã³ãã£ã³ã°ãéããŠå«ããã ããšãã°ããã®ãã¡ã€ã«ã·ã¹ãã ã®File
ãå®è£
ããã¿ã€ããå¿
èŠã§ãã ããã«ãããåFileSystem
å®è£
ã«å¯ŸããŠ1ã€ã®File
ã Dir
ããã³Entry
å®è£
ã®ã¿ãååšããããšãä¿èšŒããFileSystem
ãtraits/metadata.rs
ããã®Metadata
ãšTimestamp
ã åEntry
ã¯ããã¡ã€ã«ãŸãã¯ãã£ã¬ã¯ããªã«é¢ããæ
å ±ãååŸã§ããã¡ã¿ããŒã¿ã«é¢é£ä»ããå¿
èŠããããŸãã ã¡ã¿ããŒã¿ã¯ãã®ã¡ã¿ããŒã¿ãæ
åœããŸãã ãããŠã Timestamp
ç¹å®ã®ç¬éã®äžé£ã®ããããã£ãå®çŸ©ããŸãã ãã®ç¹æ§ã¯ããã¡ã€ã«äœææéãªã©ã«äœ¿çšãããŸãã
ãã£ãã·ã¥ããã€ã¹
ãã©ã€ãã«çŽæ¥ã¢ã¯ã»ã¹ããã®ã¯éåžžã«é«äŸ¡ãªæäœã§ãã ãããã£ãŠããã¹ãŠã®ã¢ã¯ã»ã¹ã¯ãã£ãã·ã¥ãããã»ã¯ã¿ãŒã§å®è¡ãããŸãã CachedDevice
æ§é ã¯ã vfat/cache.rs
ã ã»ã¯ã¿ãŒãã£ãã·ã¥ãžã®ééçãã€æç€ºçãªã¢ã¯ã»ã¹ãæäŸããŸãã æ¬è³ªçã«ãããã¯å
éšçã«HashMap
ãã¹ãã¬ãŒãžãšããŠäœ¿çšããBlockDevice
ã©ãããŒã§ãã HashMap
ã®ããŒã¯ãã»ã¯ã¿ãŒçªå·ã«ãªããŸãã CachedDevice
ãå®è£
ãããšã BlockDevice
ãã£ãã·ã¥ããŒãžã§ã³ãšããŠééçã«äœ¿çšã§ããŸãã ããã«ã get()
ããã³get_mut()
ã¡ãœãããæäŸããããã£ãã·ã¥ãããã»ã¯ã¿ãŒãçŽæ¥åç
§ã§ããŸãã
ããã«ã CachedDevice
å®çŸ©ãããŠããè«çã»ã¯ã¿ãŒãšç©çã»ã¯ã¿ãŒéã®å¯Ÿå¿ãç£èŠããã«ã¯ã CachedDevice
æ§é ãCachedDevice
ã ãã®ããã«virtual_to_physical()
ã¡ãœãããæäŸããvirtual_to_physical()
ãŸãã ãããšåãæ¹æ³ã䜿çšããŠãç¹å®ã®è«çã»ã¯ã¿ãŒã«ã€ããŠèªã¿åãå¿
èŠãããç©çã»ã¯ã¿ãŒã®æ°ã決å®ããå¿
èŠããããŸãã
æçšæ§
util.rs
ãã¡ã€ã«ã«ã¯ãã¹ã©ã€ã¹ïŒ &[T]
ïŒããã³åçé
åïŒ Vec<T>
ïŒã®1ã€ã®æçšãªç¹æ§ãšãã®å®è£
ãå«ãŸããŠããŸãã ããã䜿çšããŠãç¹å®ã®æ¡ä»¶ãç¶æããªããçžäºã«è»¢éã§ããŸãã ããšãã°ã &[u32]
ã&[u8]
ã«ãã£ã¹ãããã«ã¯&[u8]
次ã䜿çšã§ããŸãã
use util::SliceExt; let x: &[u32] = &[1, 2, 3, 4]; assert_eq!(x.len(), 4); let y: &[u8] = unsafe { x.cast() }; assert_eq!(y.len(), 16);
MBRããã³EBPB
mbr.rs
æ§é ã¯ã mbr.rs
ãã¡ã€ã«ã«ãããŸãã 圌女ã¯BlockDevice
ããMBRãèªã¿åããåæãã責任ããããŸãã åæ§ã«ã BiosParameterBlock
æ§é äœã䜿çšã§ããŸãã ãã¡ã€ã«vfat/ebpb.rs
ã«ãããŸãã 圌女ã¯ãFAT32ã®BPBããã³EBPBã»ã¯ã·ã§ã³ã®èªã¿åããšåæãæ
åœããŠããŸãã
å
±æ
vfat/shared.rs
ã®Shared<T>
æ§é ã¯ãã¿ã€ãT
ãžã®ã»ãã¥ã¢ãªå¯å€ã¢ã¯ã»ã¹ã«äœ¿çšã§ããŸãT
ãã¡ã€ã«ã·ã¹ãã ã®å®è£
ã«åœ¹ç«ã¡ãŸãã ç¹ã«ãã³ãŒãã®ããŸããŸãªéšåããFSãžã®ã¢ã¯ã»ã¹ãå
±æããæ©èœãå¿
èŠãªå Žåã å
ã«é²ãåã«ã Shared<T>
䜿çšããæ¹æ³ãšçç±ãçè§£ããŠãã ããã
ãã¡ã€ã«ã·ã¹ãã
ãã¡ã€ã«ã·ã¹ãã èªäœã®ã«ãŒãã«ã¯ã vfat/vfat.rs
ãã¡ã€ã«ã«ãããŸãã æããã«ããã¯VFat
æ§é ã§ãã ã芧ã®ãšãããæ§é ã«ã¯CachedDevice
ãå«ãŸããŠãCachedDevice
ã å®è£
ã¯ãæäŸãããBlockDevice
ãCachedDevice
ã©ããããå¿
èŠãCachedDevice
ãŸãã
VFATãšã¯äœã§ããïŒ
VFATã¯ãFAT32ã®å身ã§ããMicrosoftã®å¥ã®ãã¡ã€ã«ã·ã¹ãã ã§ãã ããŸããŸãªæŽå²ççç±ãããããã¯FAT32ãšå矩èªã«ãªããŸããã åžžã«æ£ããååãšã¯éããããã®æããªäŒçµ±ãç¶ããŸãã
ã¿ã€ã&Shared<VFat>
ã®FileSystem
ããããã£ã®éšåçãªå®è£
&Shared<VFat>
ãã§ã«ååšããŸãã ããã«ã from()
ã¡ãœãããShared<VFat>
è¿ãããšã«æ°ä»ããããããŸããã äž»ãªã¿ã¹ã¯ã¯ã from()
ã¡ãœããã®å®è£
ãããã³&Shared<VFat>
å¿
èŠãªFileSystem
ããããã£ãå®äºããããšã§ãã ããã¯ããã¡ã€ã«ã·ã¹ãã ããããã£ã®å¿
èŠãªéšåãå®è£
ããä»ã®æ§é ã®å®è£
ã«ã€ãªãããŸãã
å¥ã®vfat/
ãã£ã¬ã¯ããªãèŠã€ãããŸãïŒ
error.rs
FAT32
åæåäžã«çºçããå¯èœæ§ã®ããError
å«ãError
åæãå«ãŸããŸããfile.rs
File
æ§é ã®ãã¬ãããå«ãŸããŠããŸããããã¯ã traits::File
traitãå®è£
ããå¿
èŠããããŸããdir.rs
file.rs
䌌ãŠãfile.rs
ããã«ãæ§é äœããã£ã¹ã¯ã«æžã蟌ãŸãããšãã«ãæ§é äœã®ç©ºçœãå«ãŸããŸããentry.rs
Entry
æ§é ã®Entry
ãå«ãŸããŸããããã¯ã traits::Entry
traitãå®è£
ããå¿
èŠããããŸããmetadata.rs
çãã¡ã€ã«ã®ããããã£ãæäœããããã®Data
ã Time
ã Attributes
æ§é ãå«ãŸããŠããŸãã ãŸãã Timestamp
ã®äžå®å
šãªæ§é ã Metadata
ã traits
ã¢ãžã¥ãŒã«ããã®å¯Ÿå¿ããç¹æ§ãå®è£
ããå¿
èŠããããŸããfat.rs
FatEntry
æ§é ãå«ãŸããŸãã ãã®éåžžã«æ§é ã¯FATã¬ã³ãŒããã©ãããã察å¿ããFATã¬ã³ãŒããç°¡åãã€ç°¡åã«èªã¿åãããã«äœ¿çšã§ããŸããcluster.rs
ç©çã¯ã©ã¹ã¿ãŒçªå·ãã©ããããè«çã¯ã©ã¹ã¿ãŒçªå·ã®èªã¿åãã«äœ¿çšã§ããã¯ã©ã¹ã¿ãŒæ§é ãå«ãŸããŠããŸãã
ãã¡ã€ã«ã·ã¹ãã ãå®è£
ãããšãã¯ãå¿
èŠãªã³ãŒãã§ããããã¹ãŠè£å®ããå¿
èŠããããŸãã ãããã®æ§é ã®ããããããå¿
èŠãšæãããæ¹æ³ã§è£è¶³ããããšãæããªãã§ãã ããã ãã ããæ¢åã®ã¡ãœããã«å¯ŸããŠæäŸãããŠããç¹æ§ãŸãã¯çœ²åã®å®çŸ©ã倿Žããªãã§ãã ããã
vfat.rs
ããå§ãŸããã¹ãŠã®ã³ãŒããèªãã§ãããã§äœãèµ·ãã£ãŠããã®ããçè§£ããŠãã ããã
å®è£
ããã§ãFAT32ãã¡ã€ã«ã·ã¹ãã ãå®è£
ããããã«å¿
èŠãªãã®ããã¹ãŠæããŸããã æé©ãªé åºã§å®è£
ãè¡ãããšãã§ããŸãã
æäŸãããŠãããã¹ãŠã®ãã©ã³ã¯ãå¿
ãæŽæ°ããŠãã ããïŒ
ãã¹ãŠã®ãªããžããªã®ã³ããŒãææ°ã§ããããšã確èªããŠãã ããã git pull
ã䜿çšããŠ2-fs
ãšos
ã®ææ°ããŒãžã§ã³ãå
¥æããå¿
èŠãªãã®ããã¹ãŠä¿®æ£ããŸãã
å®è£
ããã¹ãããããã®å³å¯ãªãã¹ãã»ãããæäŸããŸãã ãã¹ããå®è¡make clean && make fetch
åã«ã 2-fs
ãã£ã¬ã¯ããªã§make clean && make fetch
å®è¡ããŸãã è€æ°ã®ãã¡ã€ã«ã2-fs/files/resources/
ã¢ããããŒãããŸãã ãããã®ãã¡ã€ã«ã¯åäœãã¹ãã§äœ¿çšãããŸãã ãã®ãã£ã¬ã¯ããªã«ã¯ãMBRãEBPBãFAT32ãå«ãã€ã¡ãŒãžãšãå®è£
ã®ããŸããŸãªéšåããã¹ãããããã«äœ¿çšãããããã·ã¥ããããŸãã Linuxã®* BlessãmacOSã®Hex Fiendãªã©ã®16é²ãšãã£ã¿ãŒã䜿çšããŠç»åãåæãããšäŸ¿å©ãªå ŽåããããŸãã
ãã¹ãã¯ã cargo test
ã䜿çšããŠå®è¡ã§ããŸãã ãããã°ã¡ãã»ãŒãžã衚瀺ããã«ã¯ã cargo test -- --nocapture
å®è¡ããŸãã ããã«ããã stdout
ãšstderr
ã€ã³ã¿ãŒã»ããã鲿¢ãããŸãã ããã«ãå¿
èŠãšæãããéã®ãã¹ããèªç±ã«è¿œå ã§ããŸãã ããŒãžã®ç«¶åãé²ãããã tests.rs
以å€ã®ååã®ãã¡ã€ã«ã«ãã¹ãã远å ããããšããå§ãããŸãã
次ã®ã«ãŒã«ã«åŸãããšããå§ãããŸãã
- å¯èœãªéãæå³ã®ããã¿ã€ãã䜿çšããŠãã ããã ããšãã°ãæéãã£ãŒã«ãã«
u16
ã䜿çšãã代ããã«ã Time
æ§é ã䜿çšã§ããŸã unsafe
ãã®ã¯ã§ããã ãé¿ããŠãã ããã å®è£
ã§ã¯ã unsafe
ã§ã¯unsafe
åèš4ã€ã®éunion
æååãš3ã€ã®æååã䜿çšããŠunion
ãåŠçããŸãã å®è£
ã¯ããã«åŸãããã«ããŠãã ããã- ããããçš®é¡ã®ãã«ããŒã¡ãœããã䜿çšããŠéè€ãé¿ããŸãã äžè¬çãªåäœããã«ããŒã¡ãœããã«å
¥ãããšäŸ¿å©ãªå ŽåããããããŸãã ãããçã«ããªã£ãŠãããšãã«ãããããŠã¿ãŠãã ããã
- å®è£
ãã¯ã©ã¹ã¿ãŒãŸãã¯ã»ã¯ã¿ãŒãµã€ãºã«äŸåããªãããšã確èªããŠãã ããã ã»ã¯ã¿ãŒãµã€ãºãŸãã¯ã¯ã©ã¹ã¿ãŒãµã€ãºã®ç¹å®ã®å€ãããŒãã³ã¢ã«ããªãã§ãã ããã å®è£
ã¯ãEBPBããååŸãã512ã®åæ°ã®ã¯ã©ã¹ã¿ãŒããã³ã»ã¯ã¿ãŒãµã€ãºã§åäœããå¿
èŠããããŸãã
- äžå¿
èŠã«2åãããã¡ãªã³ã°ããªãã§ãã ããã ã»ã¯ã¿ãŒãæ¢ã«ãã£ãã·ã¥ã«ããå Žåã¯ãã¡ã¢ãªãŒã«ã»ã¯ã¿ãŒãèªã¿èŸŒãŸãªãã§ãã ããã çä¿¡ãªãã¡ã¢ãªã䜿çšããŠã¿ãŠãã ããã
ããªããæãé åºã§ãã¹ãŠãè¡ãããšãã§ããŸãã ãã ããæ¬¡ã®é åºããå§ãããŸãã
mbr.rs
è§£æMBRãå®è£
ããŸãã ããããå®è£
ã«ã¯ã unsafe
ã§unsafe
䜿çšããå¿
èŠããããŸãã ãã ãã1è¡ã§ååã§ãã æãå¯èœæ§ã®é«ãã¹ã©ã€ã¹:: from_raw_parts_mutïŒïŒãŸãã¯mem :: transmuteïŒïŒ ã mem::transmute()
éåžžã«åŒ·åãªããŒã«ã§ãã ã§ããã ãé·ã䜿çšããªãã§ãã ããã ãã以å€ã®å Žåã¯ãäœãããŠããããå®å
šã«çè§£ããå¿
èŠããããŸãã Debug
ãå®è£
ããã«ã¯ã Formatter
debug_struct()
ã䜿çšããŸãã CachedDevice
Debug
.- EBPB
ebpb.rs
. MBR, unsafe
. - MBR EBPB. .
BlockDevice
Cursor<&mut [u8]>
. :
println!("{:#?}", x);
CachedDevice
vfat/cached.rs
.VFat::from()
vfat/vfat.rs
. MasterBootRecord
, BiosParameterBlock
CachedDevice
. MBR EBPB.FatEntry
vfat/fat.rs
.VFat::fat_entry
, VFat::read_cluster VFat::read_chain
. Cluster
. . . . VFat::fat_entry
.vfat/metadata.rs
. Date
, Time
Attributes
, . FAT . Timestamp
Metadata
, Entry
, File
Dir
.Dir
vfat/dir.rs
Entry
vfat/entry.rs
.
Dir
, Cluster
Shared<VFat>
. File
vfat/file.rs
. , Iterator<Item=Entry>
entries()
. entries()
unsafe
. VecExt
SliceExt
. FAT â , Dir
.
Entry
LFN, , union
. VFatDirEntry
. Rust . .
. , , . union
. .
.
, LFN, , . .
.
UTF-16 LFN. decode_utf16()
. UTF-16 Vec<u16>
.
Dir::find()
Dir::find()
traits::Dir
Dir
. , Dir::find()
. . eq_ignore_ascii_case() .File
vfat/file.rs
. , Cluster
Shared<VFat>
. traits::File
File
. entries()
Dir
.VFat::open()
vfat/vfat.rs
. components() , Path
. , , std
, , . read_dir()
, is_file()
, is_dir()
.
Dir::find()
. VFat::open()
. 17 . Dir
.
, - , , . ! , , .
SD-
SD- Raspbrerry Pi 3, Foreign function interface FFI . FFI Rust 19.1 Rust . . os/kernel/src/fs
.
Foregin Function Interface
FFI Rust , . , Rust, extern
:
extern { static outside_global: u32; fn outside_function(param: i16) -> i32; }
outside_function
outside_global
. :
unsafe { let y = outside_function(10); let global = outside_global; }
, unsafe
. Rust , . . , , Rust , . outside_function
outside_global
. .
Rust , ( ) . Rust (mangles) , . . , , . #[no_mangle]
:
#[no_mangle] fn call_me_maybe(ptr: *mut u8) { .. }
() :
void call_me_maybe(unsigned char *); call_me_maybe(...);
Rust ? [foreign-safety]
, Rust , . , Rust , Rust , , Rust.
Rust ? [mangling]
. C++ Rust . , ? , , Rust .
SD-
SD- os/kernel/ext/libsd.a
. . ã€ãŸã . os/kernel/src/sd.rs
, .
wait_micros
, . . . :
void wait_micros(unsigned int us);
â API Rust-. Sd
, SD- new()
. BlockDevice
Sd
. unsafe
. , MBR kmain
. , . , , .
: 64- ARM unsigned int
u32
Rust.
? [foreign-sync]
SD- ( sd_err
) . . ? , Rust unsafe
-. ? ?
: ! ( , ) ?
. kernel/src/fs/mod.rs
.
, . , . , , static FILE_SYSTEM: FileSystem
kernel/src/kmain.rs
. , .
. . FileSystem
kernel/src/fs/mod.rs
, FAT32 SD-. Sd
( BlockDevice
) initialize()
. FileSystem
, VFat
. , kmain
.
, ( /
) SD-. , â .
4: Mo'sh
cd
, pwd
, ls
cat
. os/kernel/src/shell.rs
.

. ( cwd
current working directory) â , . cwd
/a
, hello
/a/hello
. cwd
/a/b/c
, hello
/a/b/c/hello
. /
, . . /hello
hello
.
cd <dir>
. cd /hello/there
, cwd
/hello/there
. cd you
, cwd
cd /hello/there/you
.
. , cwd
.
ããŒã
, : cd
, pwd
, ls
cat
. :
pwd
(print the working directory). .cd <directory>
(change (working) directory). directory
. directory
.ls [-a] [directory]
(list the files in a directory). . -a
directory
. -a
, . . directory
, . directory
. . -a
directory
. . , .cat <path..>
(concatenate files). path
. . â . UTF-8, .
. . . â , . , .
å®è£
os/kernel/src/shell.rs
. PathBuf
, . PathBuf
cd
. . , .
, , â . ããã§ãšãããããŸãïŒ
å¿
ããã³ã¢ãã±ãŒã¿ãŒã䜿çšããŠãã ããïŒ
ã»ãšãã©ã®å Žåããã¡ã€ã«ã·ã¹ãã ã®å®è£
ã¯ã¡ã¢ãªãéåžžã«éäžçã«äœ¿çšããŸããã¡ã¢ãªäžè¶³ãåé¿ããã«ã¯ãå¿
ããã³ã¢ãã±ãŒã¿ãŒã䜿çšããŠãã ãããå²ãåœãŠãã ãã§ãªããã¡ã¢ãªãè§£æŸããããšãã§ããŸãã
ãã³ãïŒæ¢åã®ã¡ãœããPathBuf
ã䜿çšPath
ããç®çã«åãããŠäœ¿çšââããŸãã
ãã³ãïŒããªãã¯ãå
·äœçã«æ³šæãåŒãå¿
èŠããããŸã..
ãã.
å®è£
æã«cd
ã
ãã®ãããªããšã