์ˆ˜์—…/os

[os]file system

์š”๋Œœ๋‹ค 2022. 11. 15. 03:36

***

10->16 ๋ณ€ํ™˜ : https://ko.calcuworld.com/%EC%88%98%ED%95%99/16%EC%A7%84%EB%B2%95-%EA%B3%84%EC%82%B0%EA%B8%B0/

16๊ณฑ์…ˆ : https://kor.foxcalculators.com/converter/4824.html

16๋ง์…ˆ : https://purecalculators.com/ko/hex-calculator

***

1-1. super block ๋ถ„์„

1-2. group descriptor ๋ถ„์„

1-3. DBM, IBM์„ ๋ถ„์„ํ•˜์—ฌ inode ์ฐพ๊ธฐ

2. inode table

3. Directory file, Regular file

4. content ํ™•์ธ

 

1) Make a virtual floppy disk

 

dd bs=1024 count=1440 if=/dev/zero of=myfd

๊ฐ€์ƒ ๋””์Šคํฌ ์ƒ์„ฑ

bs : ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ๋ฐ์ดํ„ฐ ํฌ๊ธฐ

count : ๋ธ”๋ก์˜ ๊ฐœ์ˆ˜

 

2) format

### ํฌ๋งท ๋ช…๋ น์–ด
mkfs -t ext2 myfd

3) mount

mkdir temp # ๋นˆ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
mouunt -o loop myfd temp

'myfd'๋ฅผ 'temp'dp dusruf

 

4) make some files

cd temp
echo korea > f1

5) read

cd ..
umount temp #์—ฐ๊ฒฐ ๋Š๊ธฐ

xxd -g1 myfd > x
vi x

๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ฝ์–ด์„œ x์— ์ €์žฅ

 

<<<super code ๋ถ„์„>>>

include/linux/ext2_fs.h
struct ext2_super_block {
    __le32 s_inodes_count;      /* Inodes count */
    __le32 s_blocks_count;      /* Blocks count */
    __le32 s_r_blocks_count;    /* Reserved blocks count */
    __le32 s_free_blocks_count; /* Free blocks count */
    __le32 s_free_inodes_count; /* Free inodes count */
    __le32 s_first_data_block;  /* First Data Block */
    __le32 s_log_block_size;    /* Block size */
    __le32 s_log_frag_size;     /* Fragment size */
    __le32 s_blocks_per_group;  /* # Blocks per group */
    __le32 s_frags_per_group;   /* # Fragments per group */
    __le32 s_inodes_per_group;  /* # Inodes per group */
    __le32 s_mtime;             /* Mount time */
    __le32 s_wtime;             /* Write time */
    __le16 s_mnt_count;         /* Mount count */
    __le16 s_max_mnt_count;     /* Maximal mount count */
    __le16 s_magic;             /* Magic signature */
    ...

Superblock starts at offset 1024(400h)

m_inode_count : inode total ๊ฐœ์ˆ˜

m_block_count : count

m_magic : magic numver๋กœ ๋ฆฌ๋ˆ…์Šค์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ

m_log_block_size : ๋ธ”๋ก ์‚ฌ์ด์ฆˆ

m_first_data_block : ๋ช‡ ๋ฒˆ์งธ ๋ธ”๋ก์ธ์ง€

 

super block ๋ถ„์„

-์ฃผ์˜ : ๊ฑฐ๊พธ๋กœ ์ฝ์–ด์ฃผ๊ธฐ

m_inode_count : b8 00 00 00 : (=184) ์ด 184๊ฐœ์˜ inode๊ฐ€ ์žˆ๋‹ค

m_block_count : a0 05 00 00 : (=05a0 = 1440) count=1440์œผ๋กœ ์„ค์ •ํ•ด์ค€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

m_magic : ef 53 

m_first_data_block : 00 00 00 01์ด๋ฏ€๋กœ ๊ฑฐ๊พธ๋กœ ์ฝ์–ด์ฃผ๋ฉด 1. ์ฆ‰, ์ฒซ ๋ฒˆ์งธ ๋ธ”๋ก

m_log_block_size : 00 00 00 00์ด๋ฏ€๋กœ block size = 1024 * 2^0 = 1024 byte

 

 

<<<group Descriptor ๋ถ„์„>>>

include/linux/ext2_fs.h:

superblock ๋‹ค์Œ์ด Group Descriptor์ด๋ฏ€๋กœ 800h์— ์œ„์น˜ํ•  ๊ฒƒ์ด๋‹ค. <block๋Š” 1024(400h)์ด๋ฏ€๋กœ ํ•œ ๋ธ”๋ก์— 400h์”ฉ>

-       block location of DBM : 08 00 00 00 => 00 00 00 08 = 8 ์ด๋‹ค.

-       block location of IBM : 09 00 00 00 => 00 00 00 09 = 9 ์ด๋‹ค.

-       block location of inode table : 0a 00 00 00 => 00 00 00 0a = a(10)์ด๋‹ค.

 

<<<DBM, IBM์„ ์ฝ๊ณ  ์‚ฌ์šฉ์ค‘์ธ inode, block ๋ฒˆํ˜ธ ์ฐพ๊ธฐ>>>

 

DBM์ด 8์ด๋ฏ€๋กœ 8*400h -> 2000h

ff ff ff ff ff 7f (16) -> 11111111 11111111 11111111 11111111 11111111 01111111 : 48๊ฐœ ์ค‘ 1๊ฐœ๊ฐ€ ๋นˆ ์ƒํƒœ

 

IBM์ด 9์ด๋ฏ€๋กœ 9*400h -> 2400h

ff 0f 00 00 (16) -> 111111111 00001111 : 12๊ฐœ์˜ ๋ธ”๋ก ์‚ฌ์šฉ์ค‘ -> ์ด 12๊ฐœ์˜ inode๊ฐ€ ์‚ฌ์šฉ์ค‘์ด๋‹ค.

 

** inode ๊ฐœ์ˆ˜ ํ™•์ธํ•˜๊ธฐ**

 ์œ„์—์„œ m_inode_count๋Š” 184์˜€์œผ๋ฏ€๋กœ ์ด 184๊ฐœ์˜ inode์—์„œ 12๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 172๊ฐœ๊ฐ€ ๋‚จ๋Š”๋‹ค

m_free_inode_count์— ์ €์žฅ๋œ ๊ฐ’์„ ํ™•์ธํ•ด๋ณด๋ฉด 00 00 00 ac์ด๋ฏ€๋กœ 172๊ฐœ๊ฐ€ ๋งž๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

<<<inode table>>>

inode table์—๋Š” ํŒŒ์ผ์˜ ์œ„์น˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ํ™•์ธํ•˜์—ฌ ์ด๋™ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์ผ ๊ฒƒ!

include/linux/ext2_fs.h:
struct ext2_inode {
    __le16 i_mode;        /* File mode */
    __le16 i_uid;         /* Low 16 bits of Owner Uid */
    __le32 i_size;        /* Size in bytes */
    __le32 i_atime;       /* Access time */
    __le32 i_ctime;       /* Creation time */
    __le32 i_mtime;       /* Modification time */
    __le32 i_dtime;       /* Deletion Time */
    __le16 i_gid;         /* Low 16 bits of Group Id */
    __le16 i_links_count; /* Links count */
    __le32 i_blocks;      /* Blocks count */
    __le32 i_flags;       /* File flags */
    union {
        struct {
            __le32 l_i_reserved1;
        } linux1;
        struct {
            __le32 h_i_translator;
        } hurd1;
        struct {
            __le32 m_i_reserved1;
        } masix1;
    } osd1;                        /* OS dependent 1 */
    __le32 i_block[EXT2_N_BLOCKS]; /* Pointers to blocks */
    ...
};

inode table์ด a(10)์ด์—ˆ์œผ๋ฏ€๋กœ a*400 = 2800h

ํ•˜๋‚˜์˜ inode๋Š” 128byte๋ฅผ ์ฐจ์ง€ํ•˜๋ฏ€๋กœ 16์ง„์ˆ˜๋กœ ๋ฐ”๊พธ๋ฉด 80h์ด๋‹ค. root directory๋Š” 2๋ฒˆ์ด๋ฏ€๋กœ, 

2800 + 80 = 2880h์ด inode 2๋ฒˆ์— ํ•ด๋‹นํ•˜๋Š” table์ด๋‹ค.

block size : 02 00 00 00 -> 00 00 00 02์ด๋ฏ€๋กœ 2๋ธ”๋ฝ์„ ์ฐจ์ง€ํ•จ.

block location : 21์„ 10์ง„์ˆ˜๋กœ ๋ฐ”๊พธ๋ฉด 33์œผ๋กœ, 33๋ฒˆ์งธ ๋ธ”๋ฝ์— ์œ„์น˜ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

i_size : 00 04 00 00 -> 400->1024๋ฐ”์ดํŠธ

 

<<Directory file, Regular file>>

Regular file์€ data๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ์ด๊ณ , Directory file์€ ํŒŒ์ผ ์ด๋ฆ„, ํŒŒ์ผ ํƒ€์ž…๊ณผ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค.

struct ext2_dir_entry_2 { //directory file
    __le32 inode;   /* Inode number */
    __le16 rec_len; /* Directory entry length */
    __u8 name_len;  /* Name length */
    __u8 file_type;
    char name[EXT2_NAME_LEN]; /* File name */
};

์•ž์—์„œ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ ํŒŒ์ผ์€ 21h ๋ธ”๋ฝ์— ์กด์žฌํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

21 * 400(1024๋ฐ”์ดํŠธ๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ์œผ๋‹ˆ๊น) = 8400h

inode ๋ฒˆํ˜ธ : 4 byte
rec_len : 2byte    //๋ฐ”์ดํŠธ ์ˆ˜
name_len : 1byte   //ํŒŒ์ผ ์ด๋ฆ„ ๊ธ€์ž ์ˆ˜ 
file type : 1(๋‚ด์šฉ ์žˆ๋Š” data type) , 2(๋‚ด์šฉ ์—†๋Š” ํƒ€์ž…)

์œ„๋ฅผ ํ† ๋Œ€๋กœ  f1 ํ•˜๋‚˜๋งŒ ๋ถ„์„ํ•ด๋ณด์ž๋ฉด,

Inode ๋ฒˆํ˜ธ : 0c => 12๋ฒˆ

๋ฐ”์ดํŠธ ์ˆ˜ : c => 12byte

Name length : 2๊ธ€์ž

File type : 1 => ๋‚ด์šฉ์ด ์žˆ๋Š” data type

์•„์Šคํ‚ค์ฝ”๋“œ๋กœ ํŒŒ์ผ ์ด๋ฆ„ ๋ถ„์„ -> f1

 

<<<data content ํ™•์ธ>>>

๊ณต์‹ : inode table ์œ„์น˜ + (inode - 1) * 0x80(=inode ํฌ๊ธฐ)

f1์˜ ๋‚ด์šฉ์ด ์ €์žฅ๋œ block location์„ ์ฐพ์•„๋ณด์ž.

0x2800 + (12-1) *0x80 = 2d80h

 

blcok location : 2f

 

ํ•œ ๋ธ”๋Ÿญ์ด 400h(=1024byte๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ)์ด๋ฏ€๋กœ

2f * 400h = bc00

korea data ํ™•์ธ ์™„๋ฃŒ !

 

 

์ „์ฒด ํ™•์ธ ์ฝ”๋“œ

<disk.c>

inode count : 184

blocks count = 1440

dbm, ibm, inode table 

block location <๋ธ”๋Ÿญ ์œ„์น˜h * 400h(๋ฐ”์ดํŠธ)>

 

'์ˆ˜์—… > os' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[os] memory management  (0) 2022.11.26
os file sys2  (0) 2022.11.24
[os]memory file system  (0) 2022.11.18