参考
https://www.zybuluo.com/harpsword/note/207478
https://blog.csdn.net/hejinjing_tom_com/article/details/52319189
http://www.cnblogs.com/zhangchaoyang/articles/1896605.html
https ://www.cnblogs.com/codestub/archive/2011/08/31/2160739.html
http://bachue.is-programmer.com/user_files/Bachue/File/Linux%200.11 ファイル システム実装.pdf
http : //www.voidcn.com/article/p-vizxcuae-dd.html
https://blog.csdn.net/ac_dao_di/article/details/54670516
http://www.rutk1t0r.org/2016/12/22 / Linux カーネル 0-11 完全に注釈付き-Come-Minix/
https://blog.csdn.net/fukai555/article/details/42060837
準備する
disk という名前の 128 KB ファイルを作成し、そのファイルを minix ファイル システムにフォーマットします。minix ファイル システムには 3 つのバージョンがあります。ここでのデフォルトはバージョン 1 です:
$ dd if=/dev/zero of=disk bs=1K count=128
$ mkfs.minix disk
64 inodes
128 blocks
Firstdatazone=6 (6)
Zonesize=1024
Maxsize=268966912
ディスクの読み書きの最小単位はブロックであり、一般的なディスクのブロック サイズは 512 バイト、Linux で定義されているブロック サイズは 1024 バイトです。
上記は 128 の 1KB ディスク ブロックに分割されています。ZoneSize
>= BlockSize、ここではすべて 1024、
最初のデータ ゾーンはインデックス 6 のゾーンから始まり、
最大ファイル サイズは 268966912 に達します。
いくつかのディレクトリとテキスト ファイルを作成します。
$ mkdir mnt
$ mount disk -o loop -t minix mnt
.......
$ tree
mnt/
├── document
│ └── uname.txt
├── number.txt
└── text.txt
hexdump -C ディスクは次のように表示されます。
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 引导块1K
*
00000400 40 00 80 00 01 00 01 00 06 00 00 00 00 1c 08 10 |@...............| 超级块
00000410 8f 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000800 3f 00 00 00 00 00 00 00 fe ff ff ff ff ff ff ff |?...............| inode bitmap
00000810 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000c00 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f8 |?...............| zone bitmap
00000c10 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00001000 ed 41 e8 03 a0 00 00 00 1b 92 f3 5b e8 03 06 00 |.A.........[....| inode1
00001010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001020 b4 81 e8 03 0a 00 00 00 ec 91 f3 5b e8 01 07 00 |...........[....| inode2
00001030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001040 b4 81 e8 03 08 00 00 00 0f 92 f3 5b e8 01 08 00 |...........[....| inode3
00001050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001060 fd 41 e8 03 60 00 00 00 35 92 f3 5b e8 02 09 00 |.A..`...5..[....| inode4
00001070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001080 b4 81 e8 03 72 00 00 00 35 92 f3 5b e8 01 0a 00 |....r...5..[....| inode5
00001090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00001800 01 00 2e 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| ZONE 6
00001810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001820 01 00 2e 2e 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001830 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001840 02 00 6e 75 6d 62 65 72 2e 74 78 74 00 00 00 00 |..number.txt....|
00001850 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001860 03 00 74 65 78 74 2e 74 78 74 00 00 00 00 00 00 |..text.txt......|
00001870 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001880 04 00 64 6f 63 75 6d 65 6e 74 00 00 00 00 00 00 |..document......|
00001890 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00001c00 31 32 33 34 35 36 37 38 39 0a 00 00 00 00 00 00 |123456789.......| ZONE7
00001c10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00002000 61 62 63 64 65 66 67 0a 00 00 00 00 00 00 00 00 |abcdefg.........| ZONE8
00002010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00002400 04 00 2e 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| ZONE9
00002410 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00002420 01 00 2e 2e 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00002430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00002440 05 00 75 6e 61 6d 65 2e 74 78 74 00 00 00 00 00 |..uname.txt.....|
00002450 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00002800 4c 69 6e 75 78 20 75 62 75 6e 74 75 20 34 2e 31 |Linux ubuntu 4.1| ZONE10
00002810 35 2e 30 2d 33 36 2d 67 65 6e 65 72 69 63 20 23 |5.0-36-generic #|
00002820 33 39 7e 31 36 2e 30 34 2e 31 2d 55 62 75 6e 74 |39~16.04.1-Ubunt|
00002830 75 20 53 4d 50 20 54 75 65 20 53 65 70 20 32 35 |u SMP Tue Sep 25|
00002840 20 30 38 3a 35 39 3a 32 33 20 55 54 43 20 32 30 | 08:59:23 UTC 20|
00002850 31 38 20 78 38 36 5f 36 34 20 78 38 36 5f 36 34 |18 x86_64 x86_64|
00002860 20 78 38 36 5f 36 34 20 47 4e 55 2f 4c 69 6e 75 | x86_64 GNU/Linu|
00002870 78 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |x...............|
00002880 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00020000
0.ブートブロック
最初の 1KB はブート領域で、システム起動時のブート コードを格納するために使用されますが、使用されずすべて 0 です。
1.スーパーブロック
minix ファイル システムのスーパーブロックは 1 KB を占有します。
00000400 40 00 80 00 01 00 01 00 06 00 00 00 00 1c 08 10 |@...............| 超级块
00000410 8f 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
struct minix_super_block {
__u16 s_ninodes; //0x0040, 64个索引节点
__u16 s_nzones; //0x0080, 128个zone, 每个1K
__u16 s_imap_blocks; //0x0001, inode 位图点用一个块(1KB)
__u16 s_zmap_blocks; //0x0001, zone位图占用一个块(1KB)
__u16 s_firstdatazone; //0x0006第一个数据ZONE索引号
__u16 s_log_zone_size; //0x0000, log2(zone/block), zone与block 都为1024
__u32 s_max_size; //0x10081c00, 十进制268966912, 文件最大尺寸
__u16 s_magic; //0x138f(MINIX1.0文件系统)
__u16 s_state;
__u32 s_zones;
};
2. i ノードビットマップ
3f 00 00 00 00 00 00 00
0011_1111 ......
Bit0 は予約されていますが、1 に設定されます。Bit1 はファイル システムのルート ディレクトリを示し、合計 5 つの i ノード (ルート ディレクトリ、ドキュメント、および 3 つのファイル) を占有します。
3. ゾーンビットマップ
3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f8
0011_1111 ......
Bit0 は予約されていますが 1 に設定されます。Bit1 はファイル システムのルート ディレクトリ データ領域 (複数のディレクトリ エントリを格納) を表し、合計 5 つのゾーンを占有します。前のスーパー ブロックの firstdatazone は 6 なので、ここでの bit1 は対応します、bit2 は DataZone 6 に対応し、bit2 は 7 に対応します。、bit3 は 8 に対応します...
4. i ノード
00001000 ed 41 e8 03 a0 00 00 00 1b 92 f3 5b e8 03 06 00 |.A.........[....| inode1
00001010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001020 b4 81 e8 03 0a 00 00 00 ec 91 f3 5b e8 01 07 00 |...........[....| inode2
00001030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001040 b4 81 e8 03 08 00 00 00 0f 92 f3 5b e8 01 08 00 |...........[....| inode3
00001050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001060 fd 41 e8 03 60 00 00 00 35 92 f3 5b e8 02 09 00 |.A..`...5..[....| inode4
00001070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001080 b4 81 e8 03 72 00 00 00 35 92 f3 5b e8 01 0a 00 |....r...5..[....| inode5
00001090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
32 バイトが i ノード、最初の 2 行がルート ディレクトリの i ノード、inode 番号は 1、inode 0 はアイドルを意味します。
struct minix_inode {
__u16 i_mode; //0x41ed, 040755, 目录文件, rwxr-xr-x
__u16 i_uid; //0x03e8, 1000
__u32 i_size; //000000a0, 160
__u32 i_time; //0x5bf3921b
__u8 i_gid; //0xE8, 232
__u8 i_nlinks; //0x03, 自身引用,上级目录引用,document引用
__u16 i_zone[9]; //0x06, 0x00..... 目前只占用了6号ZONE,存储目录项
};
stat デバイスのルート ディレクトリ (現在のディレクトリ) 出力の検証:
konga@ubuntu:~/work/temp/mnt$ stat .
File: '.'
Size: 160 Blocks: 2 IO Block: 1024 directory
Device: 700h/1792d Inode: 1 Links: 3
Access: (0755/drwxr-xr-x) Uid: ( 1000/ konga) Gid: ( 232/ UNKNOWN)
Access: 2018-11-20 12:48:28.000000000 +0800
Modify: 2018-11-20 12:48:27.000000000 +0800
Change: 2018-11-20 12:48:27.000000000 +0800
Birth: -
次の 2 行、inode は 2、コンテンツ分析:
struct minix_inode {
__u16 i_mode; // 0x81b4, 0100664 常规文件 rw-rw-r--
__u16 i_uid; // 0x03e8, 1000
__u32 i_size; // 0000000a, 10
__u32 i_time; // 0x5bf391ec
__u8 i_gid; // 0xE8, 232
__u8 i_nlinks; // 0x01, 没有其他硬链接
__u16 i_zone[9]; //0x07, 0x00..... 目前只占用了7号ZONE,存储目录项
};
konga@ubuntu:~/work/temp/mnt$ stat number.txt
File: 'number.txt'
Size: 10 Blocks: 2 IO Block: 1024 regular file
Device: 700h/1792d Inode: 2 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ konga) Gid: ( 1000/ konga)
Access: 2018-11-20 12:47:40.000000000 +0800
Modify: 2018-11-20 12:47:40.000000000 +0800
Change: 2018-11-20 12:47:40.000000000 +0800
Birth: -
5. データ
最初のデータ ZONE は 6 番目のブロックから始まります。ここでの最初の 1KB は、現在のファイル システムのルート ディレクトリのデータ領域で、ゾーン ビットマップの bit1 に対応します。ZONE7 は、i_zone[9] レコードが占有している番号.txt に対応します。 by inode2 1 つのブロックにファイルの内容が格納されます。
00001800 01 00 2e 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| ZONE 6
00001810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001820 01 00 2e 2e 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001830 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001840 02 00 6e 75 6d 62 65 72 2e 74 78 74 00 00 00 00 |..number.txt....|
00001850 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001860 03 00 74 65 78 74 2e 74 78 74 00 00 00 00 00 00 |..text.txt......|
00001870 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001880 04 00 64 6f 63 75 6d 65 6e 74 00 00 00 00 00 00 |..document......|
00001890 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00001c00 31 32 33 34 35 36 37 38 39 0a 00 00 00 00 00 00 |123456789.......| ZONE7
00001c10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
ZONE6 にはディレクトリ エントリが格納されます。ここでは 32 バイトがプロジェクト エントリです。
struct minix_dir_entry {
__u16 inode;
char name[0];
};
最初の 2 つのディレクトリ項目は、現在のディレクトリ "." と上位レベルのディレクトリ ".." です。