zoukankan      html  css  js  c++  java
  • 建立文件系统

    【0】README

    0.1) source code and text description are from orange’s implemention of a os and for complete code, please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/orange_s_fs.tar
    0.2) 此文件系统涉及到的数据结构 仅仅针对于 orange's OS, 并不是linux等 nix 的官方file system data structure ;该文件系统仅仅作为 学习nux 文件系统的铺垫;
    0.3) 由于, 我的硬盘大小为80M 不方便上传, 故还请访客自行创建虚拟硬盘, (如何创建虚拟硬盘,参见 http://blog.csdn.net/pacosonswjtu/article/details/48846887 , 如何建立硬盘分区表,参见 http://blog.csdn.net/pacosonswjtu/article/details/48846763)
    0.4) 建立文件系统代码的目录树:

    这里写图片描述

    0.5) 文件系统结构图如下:
    这里写图片描述


    ##**【1】我们看 建立文件系统的代码是如何调用的?** ![这里写图片描述](http://img.blog.csdn.net/20151005223520890)
    • 上述代码中的task_fs() , 它调用函数 init_fs(),而init_fs() 在打开ROOT_DEV 之后调用了mkfs(),这便是建立文件系统的函数了;

    【2】关于mkfs建立文件系统代码分析

    2.1)mkfs代码有这么几个部分:

    • part1)向硬盘驱动程序 索取 ROOT_DEV的起始扇区和大小;
    • part2)建立超级块-super block;
    • part3)建立 inode-map;
    • part4)建立 sector-map;
    • part5)写入 inode_array;
    • part6)建立根目录文件;

    2.2) 文件系统内 的 inode 数目上限是多少?
    我们决定最多允许有 4096个inode, 这样只需要一个扇区来做inode-map就可以了(4096==一个扇区的bits 数目)。这个决定同时意味着我们的file system 最多容纳 4096个文件;
    2.3) 在ms_fs()中, 所有写入磁盘的内容都是先放进fsbuf 这个缓冲区的,我们定义了一个指针,让它指向 0x600000:

    	/**
    	 * 6MB~7MB: buffer for FS
    	 */
    	PUBLIC	u8 *	 fsbuf	 = (u8*)0x600000;
    	PUBLIC	const int	FSBUF_SIZE	= 0x100000;
    

    也就是说,我们指定内存地址 6M~7M 为文件系统的缓冲区,一定程度上,这算是一种低级形态的内存管理吧;

    2.4) mk_fs()写好了,我们看一下运行效果:
    这里写图片描述


    ##**【3】根据以上输出,我们看一下 磁盘中的实际内容:** **3.1)超级块开始于 0x9E0000(占用一个扇区512个字节,实际用56个字节):**
    xxd -u -a -g l -c 16 -s 0x9E0000 -l 512 80m.img
    

    这里写图片描述
    这里写图片描述
    这里写图片描述
    Attention):超级块 的 结构体成员 int sb_dev 在硬盘上是不存在的,仅针对我们的orange's os 而言, 所以超级块的结构体大小为56 bytes;

    3.2) inode-map开始于 0x9E0200(占用1个扇区512个字节):

    xxd -u -a -g l -c 16 -s 0x9E0200 -l 512 80m.img
    

    这里写图片描述

    • Analysis):
      A1)分配一个扇区512字节4096 bits == 可以记录4096个inode 的使用情况哦;
      A2)显然 0x1F==00011111,也即前5个inode 已经被使用了;

        bit0:reserved,保留;
        bit1:指向根目录'/' 的(根目录文件时数据区的第一个文件)inode;
        bit2:指向 /dev_tty0 的inode;
        bit3:指向 /dev_tty1 的inode;
        bit4:指向 /dev_tty2 的inode;
      

    A3): dev_tty[0,1,2] 三个文件称为 字符设备特殊文件,暂且创建,后续可能使用;

    3.3) sector-map开始于 0x9E0400(sector-map占用扇区数依据该硬盘总扇区数决定):

    xxd -u -a -g l -c 16 -s 0x9E0400 -l 512 80m.img
    

    这里写图片描述

    • Analysis)
      A1)由 超级块super block 可知,硬盘的扇区总数为 0x9D41 = 40257 sectors ;
      A2)又一个bit位映射一个扇区的使用情况(1已被使用,0未被使用) ,所以40257 /8 =5032(大约)Bytes = 大约10个扇区左右;
      A3)从上图,我们看到,有2049个扇区被使用了;
      A4)又, 0x9E1800 - 0x9E0400 = 0x1400,所以中间的字节数=16^3 + 4*16^2=4096 + 1024 = 5120 bytes (约等于 5032bytes ,呵呵,大致正确啦)

    3.4)inode-array开始于 0x9E1800(每个inode数据结构大小=32bytes):

    xxd -u -a -g l -c 16 -s 0x9E1800 -l 512 80m.img
    

    这里写图片描述
    这里写图片描述
    这里写图片描述

    • Analysis)
      A1)这就是具体的inode 数据结构信息的存储空间啦;
      A2)由图,以及根目录文件开始于 0xA01800,我们知道 0xA01800 - 0x9E1800 = 0x20000 = 2^17 bytes
      A3)又,每个inode=32bytes, 所以依据以上数据,算出实际的inode = 2^12 =2048 个inode = 2048个文件;

    **3.5)根目录文件开始于 0xA01800(每个根目录dir_entry数据结构大小为16 bytes): **

    xxd -u -a -g l -c 16 -s 0xA01800 -l 512 80m.img
    

    这里写图片描述
    这里写图片描述
    这里写图片描述

  • 相关阅读:
    解决Ubuntu下gedit中文乱码
    Linux下安装Matlab软件
    3.5mm耳机/麦克接头
    IIS无法加载PHP.ini
    修改mysql用户密码
    dhtmlxgrid使用基础
    远程桌面“终端服务器超出了最大允许连接数”的解决
    MATLAB中格式化M文件注释
    MATLAB中使用Cell对M文件分节
    MATLAB下一些常用易忘命令
  • 原文地址:https://www.cnblogs.com/pacoson/p/4856530.html
Copyright © 2011-2022 走看看