πΈπΈπΈλΈλ‘κ·Έ κΈμ λ³΅μ΅ κ²Έ gitbookμ μμμ λ°λΌ λ²μ λ° κ΄λ ¨ λ΄μ©μ JKνΌμ μ λ¬μ μ 리ν μμ μ΄λ€. λ§κ·Έλλ‘ JKνΌμ μΈ μΉΈνΌ 100%λ§λ λ§μ μλ μ μλ€λ κ±° μ°Έκ³ ν΄μ£ΌκΈΈ λ°λλ€.
μ΄λ²μ£Όμ°¨λ gitbookμ μ°¬μ°¬ν μ½μΌλ©΄μ osλ₯Ό μ΄ν΄ν΄λ³΄μ.
μ΄μ μ λ κ³Όμ μμλ νμΌ μμ€ν μ΄ λ΄λΆμ μΌλ‘ μ΄λ»κ² ꡬνλμ΄ μλμ§μ λν΄ μ κ²½μ°μ§ μκ³ κ΄λ²μνκ² μ¬μ©νμμ΅λλ€. μ΄λ² λ§μ§λ§ κ³Όμ μμλ, λΉμ μ νμΌ μμ€ν μ ꡬνμ λ°μ μν€κ² λ κ²λλ€. filesys λλ ν 리μμ μ£Όλ‘ μμ νκ² λ κ²λλ€.
νλ‘μ νΈ2 λλ νλ‘μ νΈ3λ₯Ό λ°νμΌλ‘ νλ‘μ νΈ4λ₯Ό μ§ννλ©΄ λ©λλ€. κ°κ°μ κ²½μ°, νλ‘μ νΈ2μμ ꡬννλ λͺ¨λ κΈ°λ₯μ΄ filesysλ₯Ό μ§ννλ©΄μ λκ°μ΄ μλν΄μΌ ν©λλ€. λ§μ½, νλ‘μ νΈ 3μ λ°νμΌλ‘ μ§ννλ€λ©΄ νλ‘μ νΈ3μμ ꡬνν κΈ°λ₯ μμ μλν΄μΌ ν©λλ€. λν VM κΈ°λ₯μ νμ±νμν€κΈ° μν΄μλ Β filesys/Make.vars μ μμ ν΄μΌ ν©λλ€. VM κΈ°λ₯μ΄ λΉνμ±νμμΌ°λ€λ©΄ 10% κ°μ ν μμ μ λλ€. νμ΄μ§ μΊμλ₯Ό ꡬννκΈ° μν΄μ VMκΈ°λ₯μ΄ νμν©λλ€.
κΈ°λ³Έ νμΌ μμ€ν
μ νμΌλ€μ λ¨μΌ λ©΄μ μ ν λΉνκΈ° λλ¬Έμ μΈλΆ λ¨νΈνμ μ·¨μ½ν©λλ€. μ¦, nκ° λΈλ‘μ΄ λΉμ΄ μλλ°λ λΆκ΅¬νκ³ (μΈλΆ λ¨νΈνκ° λμ΄ μλ‘ λ¨μ΄μ Έ μλ€λ©΄) nκ° κΈΈμ΄μ λΈλ‘μ΄ ν λΉλ μ μλ€λ λ§μ
λλ€.
μ΄ λ§μ μ€μ ꡬνμμ μ§μ , κ°μ , μ΄μ€ κ°μ λΈλ‘λ€μ μ¬μ©νλ μΈλ±μ€ ꡬ쑰λ₯Ό μ¬μ©ν΄μΌ ν μ§λ λͺ¨λ₯Έλ€λ κ²μ μλ―Έν©λλ€. μ΄μ νκΈ°μμλ, λΉμ μ΄ βλ©ν°λ 벨 μΈλ±μ±μ μ¬μ©νλ Berkeley μ λμ€ FFSβλΌκ³ λ°°μ λ λ°©μ λΉμ·ν κ²μ λλΆλΆμ νμλ€μ΄ μ±ννμ΅λλ€. κ·Έλ¬λ λΉμ μ μΆμ λ³΄λ€ μ½κ² λ§λ€μ΄μ£ΌκΈ° μν΄μ, μ ν¬λ λ μ¬μ΄ λ°©λ²μΌλ‘ ꡬννκ²λ νμ΅λλ€. λ°λ‘ FATμ΄μ£ . λΉμ μ λ°λμ μ£Όμ΄μ§ μ€μΌλ ν€ μ½λλ‘ FATμ ꡬνν΄μΌ ν©λλ€. λΉμ μ μ½λλ λ©ν°λ 벨 μΈλ±μ± (κ°μμμ FFSλ‘ λ°°μ λ)μ ν¬ν¨ν΄μλ μλ©λλ€. κ·Έλ¬λ©΄ file growth ννΈμμ 0μ μ λ°μ κ²λλ€.
μμλμΈμ:
λΉμ μ νμΌ μμ€ν
νν°μ
μ΄ 8MBλ³΄λ€ ν¬μ§ μμ κ²μ΄λΌκ³ κ°μ ν΄λ μ’μ΅λλ€.
λΉμ μ ꡬνμ λ©νλ°μ΄ν°λ₯Ό μ μΈν νν°μ
ν¬κΈ°λ§νΌμ ν° νμΌλ€μ μ§μν΄μΌ ν©λλ€.
(FILESIZE) β€ (PARTITION SIZE) - (METADATA)
κ° inodeλ νλμ λμ€ν¬ μΉν°μ μ μ₯λ©λλ€. κ·Έ μΉν°κ° λ΄μ μ μλ λ§νΌμΌλ‘ λΈλ‘ ν¬μΈν°μ μκ° μ νλ©λλ€.
κ²½κ³ : μ΄ λ¬Έμλ μ¬λ¬λΆμ΄ κ°μλ₯Ό ν΅ν΄ μΌλ°μ μΈ νμΌ μμ€ν κ³Ό FATμ κΈ°λ³Έ μ΄λ‘ μ μ΄ν΄νλ€λ κ°μ νμ μμ±λμμ΅λλ€. ν΄λΉ λ΄μ©μ λν μ΄ν΄κ° μλ€λ©΄, κ°μ λ ΈνΈλ‘ λμκ°μ νμΌ μμ€ν κ³Ό FATκ° λ¬΄μμΈμ§ μ΄ν΄νμμμ€.
λΉμ μ΄ μ΄μ νλ‘μ νΈλ€μμ μ¬μ©νλ κΈ°λ³Έ νμΌμμ€ν
μμλ, νμΌμ΄ μ¬λ¬ λμ€ν¬ μΉν°μ κ±ΈμΉ μ°μλ λ¨μΌ λ©μ΄λ¦¬μ μ μ₯λμμ΅λλ€.
μ°μλ λ©μ΄λ¦¬λ₯Ό ν΄λ¬μ€ν° λΌκ³ λΆλ¦
μλ€. μλνλ©΄ ν΄λ¬μ€ν°(λ©μ΄λ¦¬)λ νλ μ΄μμ μ°μλ λμ€ν¬ μΉν°λ₯Ό λ΄μ μ μκΈ° λλ¬Έμ
λλ€. μ΄λ¬ν κ΄μ μμ, κΈ°λ³Έ νμΌ μμ€ν
μμ ν΄λ¬μ€ν°μ μ¬μ΄μ¦λ 곧 ν΄λ¬μ€ν°μ μ μ₯λ νμΌμ ν¬κΈ°λ₯Ό μλ―Ένμ΅λλ€.
μΈλΆ λ¨νΈνλ₯Ό κ²½κ°μν€κΈ° μν΄, μ°λ¦¬λ ν΄λ¬μ€ν°μ μ¬μ΄μ¦λ₯Ό μ€μΌ μ μμ΅λλ€ (κ°μ λ©λͺ¨λ¦¬μμμ νμ΄μ§ μ¬μ΄μ¦λ₯Ό λ μ¬λ €λ³΄μΈμ). λ¨μνλ₯Ό μν΄, μ°λ¦¬μ μ€μΌλ ν€ μ½λμ μλ ν΄λ¬μ€ν° λ΄μ μΉν° κ°μλ₯Ό 1λ‘ μμ νμ΅λλ€. μ΄λ° μμ ν΄λ¬μ€ν°λ₯Ό μ°λ©΄, μ 체 νμΌμ λ΄κΈ°μλ ν΄λ¬μ€ν°μ ν¬κΈ°κ° μΆ©λΆμΉ μμ μ μμ΅λλ€. μ΄ κ²½μ°, μ°λ¦¬λ ν νμΌμ μν μ¬λ¬ κ°μ ν΄λ¬μ€ν°λ₯Ό νμλ‘ νλ©°, κ·Έλ κΈ° λλ¬Έμ inodeμ μλ νμΌμ μν ν΄λ¬μ€ν°λ₯Ό μΈλ±μ±νκΈ° μν μλ£κ΅¬μ‘°κ° νμν©λλ€.
κ°μ₯ μ¬μ΄ λ°©λ²μ λ§ν¬λ 리μ€νΈ (체μΈμ΄λΌκ³ λ λΆλ¦¬λ)λ₯Ό μ¬μ©νλ κ²μ
λλ€. inodeλ νμΌμ 첫λ²μ§Έ λΈλ‘μ μΉν° λλ²λ₯Ό ν¬ν¨ν μ μκ³ , 첫 λ²μ§Έ λΈλ‘μ λ λ²μ§Έ λΈλ‘μ μΉν° λλ²λ₯Ό ν¬ν¨ν μ μμ΅λλ€. μλνλ©΄ λ§μ½ μ°λ¦¬μκ² νμν λΈλ‘μ΄ λ§μ§λ§ λΈλ‘ λΏμΌμ§λΌλ, νμΌμ λͺ¨λ λΈλ‘μ μ½μ΄μΌ νκΈ° λλ¬Έμ
λλ€.
μ΄κ²μ 극볡νκΈ° μν΄, FAT (File Allocation Table, νμΌ ν λΉ ν
μ΄λΈ)μ μ¬μ©νλλ°, μ΄λ κ² νλ©΄ κ° λΈλ‘λ€μ΄ μμ μ ꡬ쑰 μμ μ°κ²°μ 보λ₯Ό λ΄λ λμ μ κ³ μ ν¬κΈ°μ FATμ λΈλ‘λ€μ μ°κ²°μ 보λ₯Ό μ μ₯νκ² λ©λλ€. FATμ΄ μ€μ λ°μ΄ν°κ° μλ μ°κ²°μ 보 κ°λ§ λ΄κ³ μκΈ° λλ¬Έμ, DRAMμ μΊμλ μ μμ λ§νΌ μΆ©λΆν μμ ν¬κΈ°λ₯Ό κ°μ§κ² λ©λλ€. μ΄λ κ² ν΄μ, μ°λ¦¬λ ν
μ΄λΈμμ μμνλ μνΈλ¦¬λ§ μ½μΌλ©΄ λκ² λμμ΅λλ€.
λΉμ μ inode μΈλ±μ±μ filesys/fat.cμ μ 곡λλ μ€μΌλ ν€ μ½λμ ν¨κ» ꡬννκ² λ κ²μ λλ€. μ΄λ² μΉμ μμλ fat.cμ μ΄λ―Έ ꡬνλ ν¨μλ€κ³Ό λΉμ μ΄ μμΌλ‘ ꡬνν΄μΌ νλ λ΄μ©λ€μ λν΄ κ°λ΅νκ² μ€λͺ ν΄ λ³΄κ² μ΅λλ€.
μ°μ , fat.cμ μλ 6κ°μ ν¨μλ€ (i.e.Β fat_init(),Β fat_open(),Β fat_close(),Β fat_create(), andΒ fat_boot_create())μ λΆν μμ λμ€ν¬λ₯Ό μ΄κΈ°ννκ³ ν¬λ§·νκΈ° λλ¬Έμ, μ΄λ€μ μμ ν νμλ μμ΅λλ€. νμ§λ§ λΉμ μ fat_fs_init() ν¨μλ₯Ό μμ±νκ³ , μ΄λ€μ΄ νλ μΌμ΄ μ΄λ€ λμμ΄ λ μ§λ₯Ό κ°λ΅νκ² μ΄ν΄ν΄μΌ ν κ²λλ€.
FAT νμΌ μμ€ν μ μ΄κΈ°νν©λλ€. λΉμ μ fat_fsμ fat_lengthμ data_start νλλ₯Ό μ΄κΈ°νν΄μΌ ν©λλ€. fat_lengthλ νμΌμμ€ν μ λͺ κ°μ ν΄λ¬μ€ν°κ° μλμ§μ λν μ 보λ₯Ό μ μ₯νκ³ , data_startλ μ΄λ€ μΉν°μμ νμΌ μ μ₯μ μμν μ μλμ§μ λν μ 보λ₯Ό μ μ₯ν©λλ€. λΉμ μ μ΄μ©λ©΄ fat_fs->bs μ μ μ₯λ κ°μ μ΄μ©νκ³ μΆμ΄μ§ μλ μμ΅λλ€. λν, μ΄ ν¨μμμ λ€λ₯Έ μ μ©ν λ°μ΄ν°λ₯Ό μ΄κΈ°ννκ³ μΆμ΄μ§μλ μμ΅λλ€.
cluster_t fat_fs_init (void);
clst μΈμ(ν΄λ¬μ€ν° μΈλ±μ± λλ²)λ‘ νΉμ λ ν΄λ¬μ€ν° λ€μ λ€λ₯Έ ν΄λ¬μ€ν°λ₯Ό μΆκ°ν¨μΌλ‘μ¨ μ²΄μΈμ μ°μ₯ν©λλ€.
λ§μ½ clstκ° 0μ΄λΌλ©΄, μλ‘μ΄ μ²΄μΈμ λ§λλλ€.
μλ‘κ² ν λΉλ ν΄λ¬μ€ν°μ λλ²λ₯Ό 리ν΄ν©λλ€.cluster_t fat_create_chain (cluster_t clst);
clstλ‘λΆν° μμνμ¬, 체μΈμΌλ‘λΆν° ν΄λ¬μ€ν°λ₯Ό μ κ±°ν©λλ€. pclstλ 체μΈμμμ clst μ§μ ν΄λ¬μ€ν°μ¬μΌ ν©λλ€. μ΄ λ§μ, μ΄ ν¨μκ° μ€νλκ³ λλ©΄ pclstκ° μ λ°μ΄νΈλ 체μΈμ λ§μ§λ§ μμκ° λ κ±°λΌλ λ§μ λλ€. λ§μΌ clstκ° μ²΄μΈμ 첫 λ²μ§Έ μμλΌλ©΄, pclstμ κ°μ 0μ΄μ΄μΌ ν κ²λλ€.
void fat_remove_chain (cluster_t clst, cluster_t pclst);
ν΄λ¬μ€ν° λλ² clst κ° κ°λ¦¬ν€λ FAT μνΈλ¦¬λ₯Ό valλ‘ μ λ°μ΄νΈν©λλ€. FATμ μλ κ° μνΈλ¦¬λ 체μΈμμμ λ€μ ν΄λ¬μ€ν°λ₯Ό κ°λ¦¬ν€κ³ μκΈ° λλ¬Έμ (λ§μ½ μ‘΄μ¬νλ€λ©΄ κ·Έλ λ€λ κ±°κ³ , λ€μ ν΄λ¬μ€ν°κ° μ‘΄μ¬νμ§ μμΌλ©΄ EOChain (End Of Chain)μ λλ€), μ΄ ν¨μλ μ°κ²°κ΄κ³λ₯Ό μ λ°μ΄νΈνκΈ° μν΄ μ¬μ©λ μ μμ΅λλ€.
void fat_put (cluster_t clst, cluster_t val);
clstκ° κ°λ¦¬ν€λ ν΄λ¬μ€ν° λλ²λ₯Ό 리ν΄ν©λλ€.
cluster_t fat_get (cluster_t clst);
ν΄λ¬μ€ν° λλ² clstλ₯Ό μμνλ μΉν° λλ²λ‘ λ³ννκ³ , κ·Έ μΉν° λλ²λ₯Ό 리ν΄ν©λλ€.
disk_sector_t cluster_to_sector (cluster_t clst);
λΉμ μ μ΄ ν¨μλ€μ filesys.cμ inode.cμμ κΈ°λ³Έ νμΌ μμ€ν μ κΈ°λ₯μ μ¦λμν€κΈ° μν΄ μ΄μ©νκ³ μΆμμ§λ λͺ¨λ¦ λλ€.
ν¬κΈ°λ₯Ό μ¦κ°μν¬ μ μλ νμΌμ ꡬννμΈμ. κΈ°λ³Έ νμΌ μμ€ν μμλ νμΌμ μμ± μμ νμΌ ν¬κΈ°κ° νΉμ λμμ΅λλ€. νμ§λ§ λλΆλΆμ νλ νμΌ μμ€ν μμλ νμΌμ ν¬κΈ° 0μΌλ‘ μμ±λκ³ , νμΌμ λμμ μ°κΈ°κ° μ΄λ£¨μ΄μ§ λλ§λ€ νμ₯λ©λλ€.
νμΌ ν¬κΈ° μ νμ 미리 μ ν΄λμ§ λ§μμΌ ν©λλ€. λ¬Όλ‘ λ©νλ°μ΄ν°λ₯Ό μ μΈν νμΌ μμ€ν μ ν¬κΈ°λ₯Ό λμ΄μμ§ μλ μ μ νν΄μμ λλ€. μ§κΈμ 16κ° νμΌλ‘ μ νλμ΄ μλ λ£¨νΈ λλ ν 리 νμΌλ, μ΄μ λ λ μ¦κ°λ μ μμ΄μΌ ν©λλ€.
μ μ νλ‘κ·Έλ¨λ€μ νμ¬ νμΌμ λ(EOF)μ λμ΄μλ νμ(seek)μ ν μ μμ΅λλ€. νμ μ체λ‘λ νμΌμ΄ μ¦κ°λμ§ μμ΅λλ€. EOFλ₯Ό λμ΄μ μμΉμ writeνλ©΄ κ·Έ μμΉκΉμ§ νμΌμ μ¦κ°μν€λ©°, μ΄μ EOFμμλΆν° writeμ μμμμΉ μ¬μ΄μ λΉ κ³΅κ°μ 0μΌλ‘ μ±μμ ΈμΌ ν©λλ€.
EOFλ₯Ό λμ΄μ μμΉμμ read νλ κ²μ μ΄λ€ λ°μ΄νΈλ 리ν΄νμ§ μμ΅λλ€.
EOFλ₯Ό νμ°Έ λμ΄μμ write νλ κ²μ μλ§μ λΈλ‘λ€μ μμ ν 0μΌλ‘ λ§λ€μ΄ λ²λ¦΄ κ²λλ€. μ΄λ€ νμΌ μμ€ν λ€μ μ΄λ° 묡μμ μΈ 0μΌλ‘ μ΄λ£¨μ΄μ§ λΈλ‘λ€μ μ€μ λ‘ ν λΉνκ³ write ν©λλ€. νμ§λ§ λ€λ₯Έ μ΄λ€ νμΌ μμ€ν λ€μ λͺ μμ μΌλ‘ writeλκΈ° μ κΉμ§λ κ·Έ λΈλ‘λ€μ ν λΉνμ§ μμ΅λλ€. νμμ νμΌ μμ€ν λ€μ βsparse files (λ°λκ° ν¬λ°ν νμΌ)βμ μ§μνλ€κ³ λΆλ¦½λλ€. λΉμ μ μ΄λ¬ν νμΌ μμ€ν μ ν λΉ μ λ΅ λκ°μ§ μ€ μ΄λ€ μͺ½μ΄λ μ±νν΄λ λ©λλ€.
κ° νλ‘μΈμ€λ βνμ¬ λλ ν°λ¦¬βλ₯Ό λ³λλ‘ μ μ§ν©λλ€. (νλ‘μΈμ€κ°)μμν λ, νλ‘μΈμ€μ βνμ¬ λλ ν°λ¦¬β μ΄κΈ°κ°μ root λλ ν°λ¦¬λ‘ μ€μ νμΈμ. ν νλ‘μΈμ€κ° fork μμ€ν
μ½λ‘ λ€λ₯Έ νλ‘μΈμ€λ₯Ό μμνκ² νλ©΄, κ·Έλ κ² λ§λ€μ΄μ§ μμ νλ‘μΈμ€λ λΆλͺ¨ νλ‘μΈμ€μ βνμ¬ λλ ν°λ¦¬βλ₯Ό μμ λ°μ΅λλ€.
fork μ΄νμ, λ νλ‘μΈμ€μ βνμ¬ λλ ν°λ¦¬βλ€μ μλ‘ λ
립μ μ΄λ―λ‘, κ° νλ‘μΈμ€κ° μμ μ βνμ¬ λλ ν°λ¦¬βλ₯Ό λ³κ²½νλκ²μ λ€λ₯Έ νλ‘μΈμ€μκ² μν₯μ λ―ΈμΉμ§ μμ΅λλ€. (μ΄κ²μ΄ λ°λ‘ Unixμμμ cd λͺ
λ Ήμ΄κ° μΈλΆ νλ‘κ·Έλ¨μ΄ μλ μ
Έμ λ΄μ₯λμ΄μλ μ΄μ μ
λλ€.)
κΈ°μ‘΄μ μμ€ν μ½μ μμ ν΄μ, νΈμΆμκ° μ λ¬ν file nameμ΄ μ λ λλ μλ κ²½λ‘μΈ μ΄λ¦μ μ¬μ©ν μ μλλ‘ νμΈμ. λλ ν°λ¦¬λ₯Ό ꡬλΆνλ λ¬Έμλ μ¬λμ(β/β) μ λλ€. λν μ¬λ¬λΆμ Unixμμμ λμΌν μλ―Έμ νΉλ³ν νμΌ μ΄λ¦λ€μΈ β.β κ³Ό β..β λ μ§μν΄μΌ ν©λλ€.
open μμ€ν μ½μ΄ λλ ν°λ¦¬λ μ΄ μ μλλ‘ μμ νμΈμ. κΈ°μ‘΄ μμ€ν μ½ μ€ λλ ν°λ¦¬μ λν νμΌ μλ³μ(fd)λ₯Ό μμμΌ ν νμκ° μλκ²μ close λΏμ λλ€.
remove μμ€ν
μ½μ΄ μΌλ° νμΌ μΈμ λΉμ΄μλ λλ ν°λ¦¬(root μ μΈ)λ μμ ν μ μκ² μμ νμΈμ.
λλ ν°λ¦¬λ νμ νμΌ λλ νμ λλ ν°λ¦¬(β.β λ° β..β μ μΈ)λ₯Ό ν¬ν¨νμ§ μλ κ²½μ°μλ§ μμ ν μ μμ΅λλ€. νλ‘μΈμ€κ° μ΄μ΄λ λλ ν°λ¦¬λ, νλ‘μΈμ€μ νμ¬ μμ
λλ ν°λ¦¬λ₯Ό μμ νλκ²μ νμ©ν κ²μΈμ§ μ¬λΆλ μ¬λ¬λΆμ΄ κ²°μ ν μ μμ΅λλ€. λ§μ½ νμ©νκ²λλ€λ©΄, μμ λ λλ ν°λ¦¬ μμμ νμΌ(β.β λ° β..β ν¬ν¨)μ μ΄κ±°λ μλ‘μ΄ νμΌμ λ§λλ μλλ νμ©λμ§ μμμΌ ν©λλ€. λ€μκ³Ό κ°μ μλ‘μ΄ μμ€ν
μ½λ€μ ꡬννμΈμ:
νλ‘μΈμ€μ νμ¬ μμ λλ ν°λ¦¬λ₯Ό μλ λλ μ λ κ²½λ‘μΈ dir λ‘ λ°κΏλλ€. μ±κ³΅νλ€λ©΄ trueλ₯Ό, κ·Έλ μ§ μμΌλ©΄ falseλ₯Ό λ°νν©λλ€
bool chdir (const char *dir);
μ λ λλ μλ κ²½λ‘μΈ λλ ν°λ¦¬ dirλ₯Ό λ§λλλ€. μ±κ³΅νλ€λ©΄ trueλ₯Ό, κ·Έλ μ§ μμΌλ©΄ falseλ₯Ό λ°νν©λλ€. λ§μ½ dir μ΄ μ΄λ―Έ μ‘΄μ¬νκ±°λ, λ§μ§λ§ λλ ν°λ¦¬ μ΄μΈμ λλ ν°λ¦¬ μ΄λ¦μ΄ μ‘΄μ¬νμ§ μλ κ²½μ° μ€ν¨ν©λλ€. μ΄ λ§μ, mkdir(βa/b/cβ) λ /a/b κ° μ΄λ―Έ μ‘΄μ¬νλ©΄μ /a/b/c κ° μ‘΄μ¬νμ§ μλ κ²½μ°μλ§ μ±κ³΅νλ€λ λ» μ λλ€.
bool mkdir (const char *dir);
λλ ν°λ¦¬λ₯Ό λνλ΄λ νμΌ μλ³μ fd μμ directory entryλ₯Ό μ½μ΅λλ€. μ±κ³΅νλ€λ©΄, nullλ‘ λλλ νμΌ μ΄λ¦μ, READDIR_MAX_LEN + 1Β bytesμ 곡κ°μ΄ μλ name μ μ μ₯νκ³ trueλ₯Ό λ°νν©λλ€. λ§μΌ λλ ν°λ¦¬μ λ¨μ νλͺ©μ΄ μλ€λ©΄ falseλ₯Ό λ°νν©λλ€.
readdir μμ . κ³Ό .. μ λ°ννλ©΄ μλ©λλ€. λ§μΌ λλ ν°λ¦¬κ° μ΄λ €μλ λμ λ³κ²½λλ€λ©΄, μΌλΆ entryλ€μ μ ν μ½μ§ μκ±°λ μ¬λ¬λ² μ½λ κ²μ΄ νμ©λ©λλ€. κ·Έλ μ§ μλ€λ©΄(μ΄λ € μλ λμ λ³κ²½λμ§ μμλ€λ©΄), κ° directory entryλ μμμ κ΄κ³μμ΄ νλ²λ§ μ½μ΄μΌ ν©λλ€.
READDIR_MAX_LEN λ lib/user/syscall.h μ μ μλμ΄ μμ΅λλ€. λ§μ½ νμΌ μμ€ν μ΄ κΈ°λ³Έ νμΌ μ΄λ¦λ³΄λ€ λ κΈ΄ νμΌ μ΄λ¦μ μ§μνλ€λ©΄, μ¬λ¬λΆμ READDIR_MAX_LEN μ κ°μ κΈ°λ³Έκ°μΈ 14μμ λ λλ €μΌ ν©λλ€.bool readdir (int fd, char *name);
fd κ° λλ ν°λ¦¬λ₯Ό λνλ΄λ©΄ trueλ₯Ό, μΌλ° νμΌμ λνλ΄λ©΄ falseλ₯Ό λ°νν©λλ€.
bool isdir (int fd);
μΌλ° νμΌ λλ λλ ν°λ¦¬μ λν fd μ μ°κ΄λ inodeμ inode numberλ₯Ό λ°νν©λλ€.
inode numberλ νμΌ λλ λλ ν°λ¦¬λ₯Ό μꡬμ μΌλ‘ μλ³νλ©°, μ΄λ νμΌμ΄ μ‘΄μ¬νλ λμ κ³ μ ν©λλ€. Pintosμμ, inodeμ μΉν° λ²νΈκ° inode numberλ‘ μ¬μ©λκΈ°μ μ ν©ν©λλ€.int inumber (int fd);
νν μ€μμ soft link 맀컀λμ¦μ ꡬννμΈμ. Soft link(μΌλͺ Symbolic link)λ λ€λ₯Έ νμΌμ΄λ λλ ν°λ¦¬λ₯Ό μ°Έμ‘°νλ μ μ¬ νμΌ κ°μ²΄μ λλ€. μ΄ νμΌμ μ§μ λ νμΌμ μ λ λλ μλ κ²½λ‘μ λ°©μμ κ²½λ‘ μ 보λ₯Ό ν¬ν¨ν©λλ€. λ€μκ³Ό κ°μ μν©μ κ°μ ν΄λ³΄κ² μ΅λλ€:
/
βββ a
β βββ link1 -> /file
β β
β βββ link2 -> ../file
βββ file
/a μ μμΉνλ link1 μ΄λΌλ μ΄λ¦μ soft-linkλ /file μ (μ λ κ²½λ‘λ‘)κ°λ¦¬ν€κ³ μκ³ , /a μ μμΉνλ link2 λ ../file μ (μλ κ²½λ‘λ‘)κ°λ¦¬ν€κ³ μμ΅λλ€. link1 μ΄λ link2λ₯Ό μ½λλ€λ κ²μ /file μ μ½λκ²κ³Ό κ°μ΅λλ€.
λ¬Έμμ΄ targetμ ν¬ν¨νλ linkpath λΌλ μ΄λ¦μ symbolic linkλ₯Ό λ§λμΈμ. μ±κ³΅ νλ€λ©΄ 0μ΄ λ°νλκ³ , μ€ν¨ νλ€λ©΄ -1μ΄ λ°νλ©λλ€.
int symlink (const char *target, const char *linkpath);
μ κΈ μ λ°°μ μλ£μ μΉ΄μ΄μ€νΈ κ°μμλ£λ₯Ό 곡λΆν΄μ μ 리ν λ΄μ©μ΄λ€.
μ μ₯ μ₯μΉλ HDD, SSD, CD-ROM, USB λ±λ±, κ·Έλ¦¬κ³ λ§κ·Έλ€ν±, κ΄ν, λ°λ체 λ± μ’ λ₯κ° μ¬λ¬κ°μ§μ΄λ€. μ΄λ κ² λ€μν μ μ₯ μ₯μΉλ€μ μ 보λ₯Ό μ μ₯νκΈ° μν΄μλ μ 보λ₯Ό μ½κ³ μΈ μ μλ λ°©λ²μ΄ μ 리λμ΄ μμ΄μΌ νλ€. μ΄λ₯Ό νμΌ μμ€ν μ΄λΌκ³ νλ€.
νΉν νμΌκ³Ό λλ ν 리λΌλ λ κ°μ κ°λ μΌλ‘ μ μ₯ μ₯μΉλ₯Ό μΆμνν μ μλ€. μ¦, μ μ₯ μ₯μΉμ μ κ·ΌνκΈ° μν΄ νμΌκ³Ό λλ ν 리λΌλ κ°λ μ μ΄μ©νλ€.
UNIXμμμ νμΌμ μ μλ νμΌμ λ°μ΄νΈμ μ ν λ°°μ΄μ΄λ€.λ€λ₯Έ μμ€ν μμλ νμΌμ΄ λ μ½λ μ§ν©, λ°μ΄ν°λ² μ΄μ€ λ μ½λ λλ ν€-κ° μμΌλ‘ μ μλ μλ μλ€.
UNIX μ΄μ 체μ μ νμΌ μμ€ν μμ νμΌμ λ§€μ° κ°λ¨νκ² 'λ°μ΄νΈ λ°°μ΄'μ΄λΌκ³ μ μ λλ€. κ° νμΌμ νμ μ΄λ¦μΌλ‘ inode λ²νΈλ₯Ό κ°μ§λ€. λ°λΌμ λ΄λΆμ μΌλ‘ κ° νμΌμ λ²νΈλ₯Ό κ°μ§κ³ μλ€. νμ§λ§ μ¬μ©μλ νμΌμ μ«μλ‘ λ³΄μ§λͺ»νκ³ "hello.c"μ κ°μ λ¬Έμμ΄λ‘ λ³Έλ€.
λλ ν°λ¦¬λ νμΌμ΄λ©° νΉμν νμΌμ΄λ€. λλ ν°λ¦¬λ νμΌ μ΄λ¦κ³Ό inode λ²νΈμ μμΌλ‘ ꡬμ±λ λͺ©λ‘μ΄λ©°, λλ ν°λ¦¬μ κ°λ μ μ¬μ©νμ¬ νμΌλ€μ κ³μΈ΅ κ΅¬μ‘°λ‘ μ‘°μ§νν μ μλ€.
μΈν°νμ΄μ€λ νμΌμ μ‘°μνλ ν¨μμ μ§ν©μ λ§νλ€. νμΌμ μμ±νλ ν¨μλ₯Ό λ§λλ κ²μΌλ‘ μμνλ€. νμΌμ μμ±νλ λ°©λ²μ O_CREAT νλκ·Έλ₯Ό μ¬μ©νμ¬ open μμ€ν
μ½μ νΈμΆνλ κ²μ΄λ€. "foo"λΌλ μ΄λ¦μ νμΌμ μμ±νκ³ O_CREAT νλκ·Έλ₯Ό μ¬μ©νλ©° μ°κΈ° μ μ©(write only)μΌλ‘ μμ±νλ©° μ΄κΈ° ν¬κΈ°λ 0μΌλ‘ μ€μ νλ€. κ·Έλ¦¬κ³ open μμ€ν
μ½μ νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ°ννλ€.
κ° νλ‘μΈμ€λ νμΌ λμ€ν¬λ¦½ν° ν
μ΄λΈμ΄λΌλ μ μ λ°°μ΄μ κ°μ§κ³ μλ€. νμΌ λμ€ν¬λ¦½ν°λ μ΄ ν
μ΄λΈμμμ μΈλ±μ€λ€. μμ κ΅μλμ΄ κ·Έλ €μ€ κ·Έλ¦Όμ μ°Έκ³ νλ©΄ κ° μλ리μ 0, 1, 2, 3, 4κ° file descriptorμ΄λ€. μ΄ ν
μ΄λΈμ κ° entryλ μ€μ λ‘ μ΄λ€ λ°μ΄ν°λ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
νμΌ κ°μ²΄μλ offsetμ΄λΌλ λ³μκ° ν¬ν¨λμ΄ μλ€. λν νμΌ κ°μ²΄μλ inodeλ₯Ό κ°λ¦¬ν€λ ν¬μΈν°λ ν¬ν¨λμ΄ μλ€.
νμΌ κ°μ²΄λ νμΌμ μμΉλ₯Ό λνλ΄λ offsetκ³Ό κ΄λ ¨λ κ°μ₯ μ€μν λ°μ΄ν° ꡬ쑰μ΄λ€. offsetμ νμΌ λ΄μμ μ½κΈ° λ° μ°κΈ° μμ€ν
νΈμΆμ΄ μ μ©λλ μμΉλ€. μ΄λ pintOSμμ struct fileμ ν΄λΉνλ€. κ° μ΄μ 체μ λ νμΌ λμ€ν¬λ¦½ν° ν
μ΄λΈμμμ μ΅λ νμΌ λμ€ν¬λ¦½ν° μλ₯Ό μ μνλ€. μ΄λ 컀λμ μ μ λ³μμ΄λ©° λ³κ²½λ μ μμ§λ§, μ΅κ·Όμ Linuxμμλ νμΌ λμ€ν¬λ¦½ν° ν
μ΄λΈμ ν¬κΈ°κ° 256μ
λλ€.
straceλ 리λ μ€μμ μ€ν μ€μΈ νλ‘μΈμ€μ μμ€ν μ½(trace system call)μ μΆμ νκ³ κΈ°λ‘νλ μ νΈλ¦¬ν°μ΄λ€. straceλ₯Ό μ¬μ©νλ©΄ νλ‘κ·Έλ¨μ΄ μ΄λ€ μμ€ν μ½μ νΈμΆνλμ§, ν΄λΉ μμ€ν μ½μ μΈμμ λ°ν κ°μ νμΈν μ μλ€. μ΄λ₯Ό ν΅ν΄ νλ‘κ·Έλ¨μ λμμ λΆμνκ³ λλ²κΉ νλ λ° λμμ΄ λλ€. straceλ νλ‘μΈμ€μ μ€ν νλ¦κ³Ό κ΄λ ¨λ μμ€ν μ½ μ 보λ₯Ό μΆλ ₯νλ―λ‘, λλ²κΉ μ΄λ μ±λ₯ λΆμ λ± λ€μν μ©λλ‘ νμ©λλ€.
μμ€ν μ½ link()μμ λ³Ό μ μλ―μ΄, λμΌν νμΌμ μ κ·Όν μ μλ μλ‘μ΄ κ²½λ‘λͺ μ λ§λ€μ΄μ£Όλ μμ μ΄λ€.
νμΌ μμ€ν μμ νλμ νμΌμ νλμ μμ΄λ Έλλ‘ λνλλ€. κΈ°λ³Έμ μΌλ‘ νμΌμ μμ΄λ Έλμμ μ°κ²°μ΄λΌκ³ ν μ μλ€.
μλ‘μ΄ νλͺ©μ λλ ν°λ¦¬μ μμ±νκ³ μλ νμΌκ³Ό κ°μ μμ΄λ Έλ λ²νΈλ₯Ό κ°λ¦¬ν€κ² νλ€. μ¦, μ νμΌμ μμ±νκ³ κΈ°μ‘΄μ μμ΄λ Έλμ μ°κ²°μν€λ κ²μ΄λ€.
νλ λλΌμ΄λΈμ μ΄λ€ νΉμ ν ꡬμ(μμ΄λ Έλ)μ κ°λ¦¬ν¨λ€. λ°λΌμ μ¬λ¬ νμΌλ€μ΄ ν λμ€ν¬ ꡬμμ νλ λ§ν¬νλ€κ³ νμ λ, κ·Έμ€ ν νμΌμ λ°μ΄ν°λ₯Ό λ°κΎΈλ©΄ λ€λ₯Έ νμΌλ€μ λ°μ΄ν°λ λ°λΌ λ°λκ² λλ€. κΈ°μ‘΄ νμΌμ΄ 볡μ¬λλ κ²μ΄ μλλ€.
νλ λ§ν¬κ° λλ©΄ ν΄λΉ μμ΄λ Έλμ reference countλ₯Ό 1 μ¬λ €μ€λ€.
νλ λ§ν¬λ νμΌμ μμ νλ€λ λ§μ μμ΄λ Έλμ μ°κ²°λ νμΌκ³Όμ μ°κ²°μ λμ΄λ²λ¦°λ€λ κ²μ΄λ€.
μ μ΄μ μμ΄λ Έλλ νλμ νμΌ μμ€ν λ΄μμλ§ μ μΌνκ² μ‘΄μ¬νκΈ° λλ¬Έμ, νλ λ§ν¬λ λ§μ°¬κ°μΉλ‘ κ°μ νμΌ μμ€ν λ΄μμλ§ μ ν¨νλ€. μ¦ μλ‘ λ€λ₯Έ λμ€ν¬ νν°μ μ μλ νμΌμκ²λ νλ λ§ν¬λ₯Ό κ±Έ μκ° μλ€. κ²λ€κ° λλ ν 리μ λν΄μλ νλ λ§ν¬λ₯Ό κ±Έ μκ° μλ€. λλ ν 리 κ΅¬μ‘°κ° μ¬μ΄ν΄μ μ΄λ£¨λ κ²μ λ§κΈ° μν΄μλ€.
λ§μΉ λ°λ‘κ°κΈ°μ κ°λ€ νλ λ§ν¬μ κ²½μ°μλ νλμ νμΌμ μ κ·Όν μ μλ μ°κ²°μ νλ λ λ§λλ κ²μΌ λΏμ΄λ€. μ΄μ λ°ν΄ μ¬λ³Όλ¦ λ§ν¬λ μλ‘μ΄ μ νμ νμΌμ μλ‘ λ§λ€κ³ , μ¬λ³Όλ¦ λ§ν¬ μμ μ΄ μ체μ μΈ μμ΄λ Έλλ₯Ό κ°μ§λ€.
μ νμΌμ λ§λ€κ³ μ°κ²°νλ νμΌμ κ²½λ‘λͺ μ μ μ₯νλ€. μ¦, μμ΄λ Έλλ₯Ό κ°λ¦¬ν€λ κ²μ΄ μλλΌ μλ³Έ νμΌμ μ΄λ¦μ κ°λ¦¬ν¨λ€.
λ°λΌμ μ¬λ³Όλ¦ λ§ν¬λ μλ³Έ νμΌμ μμ΄λ Έλμ reference countμ μν₯μ μ£Όμ§ μλλ€. λ€μ λ§ν΄, μ¬λ³Όλ¦ λ§ν¬κ° μμ λλ€κ³ ν΄λ μλ³Έ νμΌμλ λ³νκ° μλ€.
μννΈ λ§ν¬λ νμΌλΏλ§ μλλΌ λλ ν°λ¦¬λ λ§νΉ κ°λ₯νλ€. λν μμ μ νμΌ μμ€ν λ°κΉ₯μ νμΌ νΉμ λλ ν°λ¦¬λ λ§ν¬ν μ μλ€.
νλ λ§ν¬λ‘ λ§λ νμΌμ κ²½μ° μλ μλ³Έ νμΌμ΄ μ§μμ Έλ μ΄μ°¨νΌ μμ΄λ Έλ μ체λ₯Ό κ°λ¦¬ν€κΈ° λλ¬Έμ λ°μ΄ν°μ μ κ·Όνλ λ°μ λ³ν¨μ΄ μλ€. νμ§λ§ μννΈ λ§ν¬μ κ²½μ° μλ³Έ νμΌμ μ§μ°λ©΄ μννΈ λ§ν¬κ° κ°λ¦¬ν€λ νμΌμ΄ μμ΄μ§λ κ²μ΄λ―λ‘ λ°μ΄ν°μ μ κ·Όν μλ μκ² λλ€. μ΄λ κ² μ‘΄μ¬νμ§ μλ νμΌμ κ°λ¦¬ν€λ μννΈ λ§ν¬λ₯Ό orphaned, μλλ©΄ dangling linkλΌκ³ λΆλ₯Έλ€.
κ°μ νμΌ μμ€ν (Virtual File System, VFS)μ μ΄μ 체μ μμ λ€μν νμΌ μμ€ν μ ν΅ν©νμ¬ μΆμνλ μΈν°νμ΄μ€λ₯Ό μ 곡νλ κ³μΈ΅μ΄λ€. VFSλ μμ© νλ‘κ·Έλ¨μ΄ νμΌ λ° λλ ν°λ¦¬λ₯Ό μ‘°μνλ λ° μ¬μ©νλ νμ€ μμ€ν μ½ μΈν°νμ΄μ€λ₯Ό μ 곡νλ€.
VFSλ λ€μν μ΄μ 체μ μμ μ¬μ©λλ©°, κ° μ΄μ 체μ μ λ§κ² ꡬνλμ΄ μλ€. μλ₯Ό λ€μ΄, 리λ μ€μμλ VFSλ₯Ό ν΅ν΄ ext4, NTFS, FAT λ±μ νμΌ μμ€ν μ μ§μνλ©°, κ° νμΌ μμ€ν μ VFSμ νμ€ μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ μΌκ΄λ λ°©μμΌλ‘ νμΌ μ‘°μμ μνν©λλ€.
FAT κΈ°λ° νμΌ μμ€ν λ€μ νμΌ μμ€ν λ΄λΆμ λͺ¨λ ν΄λ¬μ€ν° νλνλμ λν νλͺ©μ FAT ν μ΄λΈμμ κ΄λ¦¬νλ€. μ΄λ₯Ό ν΅ν΄ κ°κ°μ ν΄λ¬μ€ν°μ μ μ₯λμ΄ μλ μ λ³΄κ° λ¬΄μμΈμ§ μ μ μλ€.
FAT ν μ΄λΈμ νλμ λ¨μΌ 리μ€νΈ(λ°°μ΄)λ‘ κ΄λ¦¬λλ©°, μ΄ ν μ΄λΈμ ν΅ν΄ μ΄λ€ ν΄λ¬μ€ν°κ° μ΄λ€ νμΌμμ μ¬μ©λλμ§, νΉμ μ΄λ€ λλ ν λ¦¬κ° μ‘΄μ¬νλμ§ λ±μ μ μ μλ€.
νμΌμ λ©νλ°μ΄ν°κ° μ μ₯λλ λ°©μ
μ₯μ
λ¨μ
μ΄κΈ° λ²μ μ UNIX μ΄μ 체μ μμ μ¬μ©λλ νμΌ μμ€ν μ΄λ€. μ£Όλ‘ 4.2BSDμ 4.3BSD μ΄μ 체μ μμ μ¬μ©λμμΌλ©°, μ΄ν λ€λ₯Έ νμΌ μμ€ν μΌλ‘ λ체λμλ€. FFSλ λμ€ν¬μ λΈλ‘ ꡬ쑰, νμΌ ν λΉ λ°©μ λ° λ©νλ°μ΄ν° κ΅¬μ± λ±μ ν¨μ¨μ μΌλ‘ μ€κ³νμ¬ λΉ λ₯Έ νμΌ μμ€ν μ±λ₯μ μ 곡νλ κ²μ΄ λͺ©νμλ€.
FFSλ κΈ°λ³Έμ μΌλ‘ μμ΄λ Έλ κΈ°λ° νμΌ μμ€ν μΌλ‘, νμΌκ³Ό λλ ν°λ¦¬μ λ©νλ°μ΄ν°μ λ°μ΄ν° λΈλ‘μ μμ΄λ Έλμ μ μ₯νλ€. μμ΄λ Έλλ νμΌμ μμ± (ν¬κΈ°, μμ μ, κΆν λ±)μ μ μ₯νκ³ , λ°μ΄ν° λΈλ‘μ μμΉλ₯Ό κ°λ¦¬ν¨λ€. FFSλ μ¬λ¬ κ°μ μμ΄λ Έλλ₯Ό κ°λ νμΌ μμ€ν μ μ§μνλ©°, μμ΄λ Έλλ₯Ό μΈλ±μ€λ‘ μ¬μ©νμ¬ νμΌμ λν μ κ·Όμ κ°λ₯νκ²νλ€.
리λ μ€ μ΄μ 체μ μμ μ¬μ©λλ νμΌ μμ€ν μ΄λ€. μ΄κΈ° λ²μ μΈ EXTμ μ΄ν κ°μ λ λ²μ μΈ EXT2, EXT3, EXT4κ° μμ΅λλ€. EXT2λΆν°λ μ λλ§(journaling) κΈ°λ₯μ΄ λμ λμ΄ νμΌ μμ€ν μ μμ μ±κ³Ό 볡ꡬ κΈ°λ₯μ΄ ν₯μλμλ€.
EXT νμΌ μμ€ν μ λΈλ‘ κ·Έλ£Ή(block group)μ΄λΌλ λ¨μλ‘ λμ€ν¬λ₯Ό κ΄λ¦¬νλ€. κ° λΈλ‘ κ·Έλ£Ήμ μ¬λ¬ κ°μ λΈλ‘ κ·Έλ£Ή λμ€ν¬λ¦½ν°, μμ΄λ Έλ ν μ΄λΈ, λ°μ΄ν° λΈλ‘ κ·Έλ£ΉμΌλ‘ ꡬμ±λλ€. μμ΄λ Έλ ν μ΄λΈμ νμΌκ³Ό λλ ν°λ¦¬μ λ©νλ°μ΄ν°λ₯Ό μ μ₯νκ³ , λ°μ΄ν° λΈλ‘ κ·Έλ£Ήμ μ€μ νμΌμ λ°μ΄ν°λ₯Ό μ μ₯νλ€.
EXT νμΌ μμ€ν
μ μ λλ§μ ν΅ν΄ νμΌ μμ€ν
μ μΌκ΄μ±κ³Ό 볡ꡬ κΈ°λ₯μ μ 곡νλ€. μ λλ§μ νμΌ μμ€ν
μ λ³κ²½ μ¬νμ λ‘κ·Έ νμμΌλ‘ κΈ°λ‘νμ¬ μμ€ν
μ΄ κ°μμ€λ½κ² μ’
λ£λλ λ±μ μν©μμλ λ°μ΄ν°μ μμ€μ μ΅μνν μ μλλ‘ νλ€. μ΄λ₯Ό ν΅ν΄ νμΌ μμ€ν
μ μ λ’°μ±κ³Ό μμ μ±μ΄ ν₯μλμλ€.
EXT νμΌ μμ€ν μ κΈ°λ³Έμ μΌλ‘ λμ€ν¬ μ¬μ©λ, νμΌ μμ€ν ν¬κΈ°, νμΌ λ° λλ ν°λ¦¬μ μ ν λ± λ€μν κΈ°λ₯κ³Ό μ΅μ μ μ§μνλ€. κ°μ λ λ²μ μΈ EXT4λ EXT3μ κΈ°λ₯μ νμ₯νκ³ μ±λ₯μ κ°μ νμλ€.
LFS(Log-structured File System)λ λμ€ν¬μ ν¨μ¨μ μΈ μ¬μ©μ μν΄ μ€κ³λ νμΌ μμ€ν μ λλ€. LFSλ κΈ°μ‘΄μ νμΌ μμ€ν κ³Όλ λ€λ₯Έ λ°©μμΌλ‘ λ°μ΄ν°λ₯Ό μ μ₯νκ³ κ΄λ¦¬νλ€.
LFSμ μ£Όμ μμ΄λμ΄λ λ‘κ·Έ ꡬ쑰νλ€. LFSλ λͺ¨λ νμΌ μμ€ν μμ μ λ‘κ·Έλ‘ κΈ°λ‘νκ³ μμ°¨μ μΌλ‘ λμ€ν¬μ μ μ₯νλ€. μ΄ λ‘κ·Έλ μμ€ν μ λͺ¨λ νμΌ μμ€ν μμ (μ: νμΌ μμ±, μμ , μμ )μ κΈ°λ‘νλ μμ°¨μ μΈ μ°μλ λ°μ΄ν° λΈλ‘μ΄λ€.
μ₯μ
λ¨μ