轉自:http://blog.csdn.net/hejinjing_tom_com/article/details/52319189
minix 文件系統學習.
----------------------------------------
1. 創建一個minix 磁盤。
----------------------------------------
a. 創建一個360K,空白映像
(關於360K的解釋
dd默認bs=512bytes。這裏提到block的是相對於bs來說的,默認bs是512bytes,那麼1block=512bytes,如果將bs改爲1M,那麼就會有1block=1M
所以有 720*512bytes = 360 K
)
b. 與loop 設備相關聯
sudo losetup /dev/loop0 image_360
c. 格式化磁盤爲minix 格式
sudo mkfs -t minix /dev/loop0
128 inodes
360 blocks
Firstdatazone=8 (8)
Zonesize=1024
Maxsize=268966912
(對於以上輸出數據的解釋
360 blocks即 360K,因爲linux默認的 1 block = 1024b = 1K
)
sudo mount /dev/loop0 /mnt
e. 拷貝文件到設備, 例如:
sudo cp crash.cpp Makefile /mnt
f. 卸載安裝點
sudo umount /mnt
g. 卸載設備
sudo losetup -d /dev/loop0
----------------------------------------
2. 將以上命令用一個sh 文件來組織。
----------------------------------------
$ cat test.sh
#!/bin/bash -x
dd if=/dev/zero of=image_360 count=720
sudo losetup /dev/loop0 image_360
sudo mkfs -t minix /dev/loop0
sudo mount /dev/loop0 /mnt
sudo cp crash.cpp Makefile /mnt
sudo umount /mnt
sudo losetup -d /dev/loop0
----------------------------------------
3. 研究image_360 的數據構成
----------------------------------------
$hexdump image_360 > minix_360.txt
0000000 0000 0000 0000 0000 0000 0000 0000 0000 // 引導塊是0號盤塊
*
0000400 0080 0168 0001 0001 0008 0000 1c00 1008 //1號盤塊是超級塊
0000410 138f 0001 0000 0000 0000 0000 0000 0000 struct d_super_block {
0000420 0000 0000 0000 0000 0000 0000 0000 0000 unsigned short s_ninodes;
unsigned short s_nzones;
unsigned short s_imap_blocks;
unsigned short s_zmap_blocks;
unsigned short s_firstdatazone;
unsigned short s_log_zone_size;
unsigned long s_max_size;
unsigned short s_magic;
};
由此知:
inodes = 0x80 =128
zones = 0x168 = 360
inode map 佔一塊
zone map 佔一塊
first data zone 在第8塊
log zone size 爲0,邏輯塊與磁盤塊相同
max_size: 0x10081c00 這個對360KB有誤.
magic = 0x138f
*
0000800 000f 0000 0000 0000 0000 0000 0000 0000 //2號盤塊。 inode bitmap
0000810 fffe ffff ffff ffff ffff ffff ffff ffff //bit0 不用, 128個bits 容量
0000820 ffff ffff ffff ffff ffff ffff ffff ffff //其中用了3個inode
//bit1 代表根目錄,bit2代表第一個文件,
//bit3 代表第二個文件
*
0000c00 000f 0000 0000 0000 0000 0000 0000 0000 // 3號盤塊。 zone bitmap
0000c10 0000 0000 0000 0000 0000 0000 0000 0000 // bit0 不用, 360個bits 容量
0000c20 0000 0000 0000 0000 0000 0000 fffe ffff // 其中用了3個zone.
0000c30 ffff ffff ffff ffff ffff ffff ffff ffff
*
0001000 41ed 0000 0080 0000 bc17 57be 0200 0008 // 4號盤塊. (4,5,6,7盤塊)
0001010 0000 0000 0000 0000 0000 0000 0000 0000 // inodes (3個有效inode)
0001020 81a4 0000 011c 0000 bc17 57be 0100 0009 struct d_inode {
0001030 0000 0000 0000 0000 0000 0000 0000 0000 unsigned short i_mode;
0001040 81a4 0000 002b 0000 bc17 57be 0100 000a unsigned short i_uid;
0001050 0000 0000 0000 0000 0000 0000 0000 0000 unsigned long i_size;
* unsigned long i_time;
1. 每個inode佔0x20個bytes. unsigned char i_gid;
2. uid 爲0 表示爲root unsigned char i_nlinks;
3. mode 的含義: unsigned short i_zone[9];
};
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
r d c f g u r w x r w x r w x
bit8-bit0: 宿主(rwx)-組員(rwx)-其他(rwx)
bit9: 執行時設置uid
bit10: 執行時設置gid
bit11: 不清楚
bit12: FIFO 文件
bit13: 字符設備文件
bit14: 目錄文件
bit15: 常規文件
當bit13, bit14 都設置時,代表塊設備文件
0x41ed 表示: 創建者,可讀,可寫,可執行。
同組及其它人,可讀,可執行,不可寫
是一個目錄文件
0x81a4 表示: 創建者,可讀,可寫. 同組及其它人可讀
是一個常規文件
4.時間可以用date 命令加以轉換,例如:
date -d @`printf "%d\n" 0x57bebc17`
2016年 08月 25日 星期四 17:36:23 CST
5. nlinks: 從多少個文件名找到這個inode節點
6. i_zone 7個直接塊,一個間接塊,一個兩級間接塊
struct dir_entry {
unsigned short inode;
char name[NAME_LEN];
};
0002000 0001 002e 0000 0000 0000 0000 0000 0000 //第8個盤塊,數據盤塊,此盤塊爲根目錄內容
0002010 0000 0000 0000 0000 0000 0000 0000 0000 //對應第一個inode數據,是目錄項內容
0002020 0001 2e2e 0000 0000 0000 0000 0000 0000 struct dir_entry {
0002030 0000 0000 0000 0000 0000 0000 0000 0000 unsigned short inode;
0002040 0002 7263 7361 2e68 7063 0070 0000 0000 char name[NAME_LEN];
0002050 0000 0000 0000 0000 0000 0000 0000 0000 };
0002060 0003 614d 656b 6966 656c 0000 0000 0000 這裏的NAME_LEN 是30,
0002070 0000 0000 0000 0000 0000 0000 0000 0000 具體數據內容見後補充.
*
0002400 6923 636e 756c 6564 3c20 7473 6964 2e6f //數據盤塊,第9個盤塊,對應第二個inode數據
0002410 3e68 0a0a 6e69 2074 6574 7473 635f 6172 // 純數據,具體數據內容見後補充.
0002420 6873 6928 746e 6920 0a29 0a7b 2009 6572
0002430 7574 6e72 3120 692f 2a20 3120 3030 0a3b
0002440 0a7d 6e69 2074 616d 6e69 6928 746e 6120
0002450 6772 2c63 6320 6168 2072 612a 6772 5b76
0002460 295d 2020 7b0a 2020 200a 2020 2020 2020
0002470 7020 6972 746e 2866 6822 6c65 6f6c 6e5c
0002480 2922 203b 0a20 2020 2020 2020 2020 6e69
0002490 2074 206b 203d 6574 7473 635f 6172 6873
00024a0 3028 3b29 2020 2f2f e420 a0bc 85e5 e4a5
00024b0 80b8 b8e4 e9aa 9e9d b3e6 e595 b09c 9de5
00024c0 2080 0a20 0909 7270 6e69 6674 2228 6163
00024d0 276e 2074 6f67 2074 6568 6572 5c21 226e
00024e0 3b29 200a 2020 2020 2020 7020 6972 746e
00024f0 2866 6b22 6920 2073 6425 6e5c 2c22 296b
0002500 203b 0a20 2020 2020 2020 2020 6572 7574
0002510 6e72 3020 203b 0a20 207d 0a20 0000 0000
0002520 0000 0000 0000 0000 0000 0000 0000 0000
*
0002800 7263 7361 3a68 7263 7361 2e68 7063 0a70 //數據盤塊,第10個盤塊,對應第三個inode數據
0002810 6709 2b2b 2d20 2067 6f2d 6320 6172 6873 // 純數據,具體數據內容見後補充.
0002820 6320 6172 6873 632e 7070 000a 0000 0000
0002830 0000 0000 0000 0000 0000 0000 0000 0000
*
005a000 //文件尾
########################################
純數據內容補充,爲了完整性。
########################################
$hexdump -C image_360
......
00002000 01 00 2e 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00002010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00002020 01 00 2e 2e 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00002030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00002040 02 00 63 72 61 73 68 2e 63 70 70 00 00 00 00 00 |..crash.cpp.....|
00002050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00002060 03 00 4d 61 6b 65 66 69 6c 65 00 00 00 00 00 00 |..Makefile......|
00002070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00002400 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e |#include <stdio.|
00002410 68 3e 0a 0a 69 6e 74 20 74 65 73 74 5f 63 72 61 |h>..int test_cra|
00002420 73 68 28 69 6e 74 20 69 29 0a 7b 0a 09 20 72 65 |sh(int i).{.. re|
00002430 74 75 72 6e 20 31 2f 69 20 2a 20 31 30 30 3b 0a |turn 1/i * 100;.|
00002440 7d 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 |}.int main(int a|
00002450 72 67 63 2c 20 63 68 61 72 20 2a 61 72 67 76 5b |rgc, char *argv[|
00002460 5d 29 20 20 0a 7b 20 20 0a 20 20 20 20 20 20 20 |]) .{ . |
00002470 20 70 72 69 6e 74 66 28 22 68 65 6c 6c 6f 5c 6e | printf("hello\n|
00002480 22 29 3b 20 20 0a 20 20 20 20 20 20 20 20 69 6e |"); . in|
00002490 74 20 6b 20 3d 20 74 65 73 74 5f 63 72 61 73 68 |t k = test_crash|
000024a0 28 30 29 3b 20 20 2f 2f 20 e4 bc a0 e5 85 a5 e4 |(0); // .......|
000024b0 b8 80 e4 b8 aa e9 9d 9e e6 b3 95 e5 9c b0 e5 9d |................|
000024c0 80 20 20 0a 09 09 70 72 69 6e 74 66 28 22 63 61 |. ...printf("ca|
000024d0 6e 27 74 20 67 6f 74 20 68 65 72 65 21 5c 6e 22 |n't got here!\n"|
000024e0 29 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 |);. print|
000024f0 66 28 22 6b 20 69 73 20 25 64 5c 6e 22 2c 6b 29 |f("k is %d\n",k)|
00002500 3b 20 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 |; . retu|
00002510 72 6e 20 30 3b 20 20 0a 7d 20 20 0a 00 00 00 00 |rn 0; .} .....|
00002520 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00002800 63 72 61 73 68 3a 63 72 61 73 68 2e 63 70 70 0a |crash:crash.cpp.|
00002810 09 67 2b 2b 20 2d 67 20 2d 6f 20 63 72 61 73 68 |.g++ -g -o crash|
00002820 20 63 72 61 73 68 2e 63 70 70 0a 00 00 00 00 00 | crash.cpp......|
00002830 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
0005a000