转自: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

dd if=/dev/zero of=image_360 count=720
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

d. 将设备挂载到一个安装点
    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

minix 文件系统学习相关推荐

  1. linux flush 文件,Linux文件系统学习:io的plug过程-blk_flush_plug_list的情况

    在上篇文章中我们看到 if (plug) { if (!request_count) trace_block_plug(q); else { if (request_count >= BLK_M ...

  2. Linux文件系统:minix文件系统二进制分析2

    文章目录 系列博文 前言 创建目录和文件 hexdump硬盘为16进制文本 二进制分析 超级块 s_state属性 inode bitmap data block bitmap inode表 根目录i ...

  3. Linux文件系统:minix文件系统二进制分析4(rm删除)

    文章目录 系列博文 目录结构 上一章节最后保持的目录结构 删除file.txt文件 现在的目录结构 二进制dump 删除file.txt后的二进制分析 data区的变化 inode区的变化 file. ...

  4. Linux文件系统:minix文件系统二进制分析3(硬链接与软链接)

    文章目录 系列博文 硬链接 当前minix文件系统目录结构 创建filelevel2.txt的硬链接文件 创建filelevel2.txt的软链接文件 当前minix文件系统目录结构 hexdump文 ...

  5. fat16和fat32文件系统学习

    根据自己电脑的fat,fat32分区来学习fat,fat32文件系统 fat16和fat32文件系统学习 - 下载频道 - CSDN.NET http://download.csdn.net/deta ...

  6. EXT4文件系统学习(16)文件系统的挂载mount

    挂载一个新的块设备时,内核会根据文件系统的类型,找到它的file_system_type对象,并调用该文件系统的mount函数,mount函数初始化超级块对象,设置s_op函数指针,这样VFS通过这个 ...

  7. Linux文件系统:minix文件系统二进制分析1(格式化)

    文章目录 系列博文 1. minix文件系统二进制分析1:刚刚格式化后的文件系统 1.1 创建硬盘 1.1.1 添加一个16M的块设备 1.1.2 格式化块设备 1.2 minix文件系统的存储结构 ...

  8. Linux 文件系统之 MINIX 文件系统

    MINIX 文件系统与标准 UNIX 的文件系统基本相同,它由 6 个部分组成:①引导块:②超级块:③ i 节点位图:④逻辑块位图:⑤i 节点:⑥数据块.对于一个普通的磁盘块设备来说,其各部分的分布见 ...

  9. 嵌入式linux培训教程,嵌入式Linux开发学习之Linux文件系统学习

    导读 操作系统的基本功能之一就是文件管理,而文件的管理是由文件系统来完成的.Linux 支持多种文件系统,本文我们就来讲解 Linux 下的文件系统.文件系统类型.文件系统结构和文件系统相关Shell ...

最新文章

  1. 大话设计模式读书笔记--4.代理模式
  2. Java 原生日志 java.util.logging
  3. 零元学Expression Blend 4 - Chapter 40 Flash做的到的Blend也可以!轻松制作拥有动画的MenuBar!(上)...
  4. Hbase hbck2下载编译和基本使用
  5. 【机器视觉】 set_fuzzy_measure算子
  6. 熔池 沉积_用于3D打印的AI(第3部分):异常熔池分类的纠缠变分自动编码器
  7. python编写程序计算1+2+3+......+100和_Python3:计算两个列表总和为100的所有排列的最有效方法是什么?...
  8. JAVA实验报告九异常处理_Java课后练习9(异常处理)
  9. 4.6.2 定义内表
  10. 配置中心、消息队列、分布式服务链路跟踪
  11. 英雄联盟欧洲赛区_Linux命令简介,欧盟的开源数学工具箱以及更多新闻
  12. 同事用Excel花了半小时做甘特图,我用一工具只用10分钟
  13. 隐含马尔科夫模型的训练
  14. springcahce集成redis 设置过期时间
  15. php天猫列表数据抓取,天猫数据抓取方法_简易采集 - 八爪鱼采集器
  16. android微信打不开怎么办,微信打不开怎么回事 微信打不开怎么办
  17. 第三方公众号用 微信联合 登录
  18. 免费无广告的统计工具TalKingData
  19. C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言。
  20. 自己开发iOS版按键精灵--TTouch

热门文章

  1. Vue中使用QuillEditor代替UEditor
  2. JAVA中”单引号”,“双引号”,“没有单引号和双引号”区别
  3. Egret白鹭引擎开发微信小游戏之保存图片到相册
  4. 58商铺全新UI试客试用平台网站源码
  5. 《北京欢迎你》截图以及浅析
  6. 和方差 均方差 均方根
  7. UNIAPP---实现微信小程序登录授权和手机号授权(uniapp做微信小程序)
  8. 模板函数与函数模板 类模板和模板的说明
  9. 作为平面设计师你还需要学习什么?
  10. CSS 伪类: 什么是 CSS 伪类?CSS 伪类怎么分类? CSS 伪类有哪些?以及分类对应的伪类