建立文件系统

【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】我们看 建立文件系统的代码是如何调用的?** ![这里写图片描述](//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

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

posted @ 2015-10-05 23:18  PacosonSWJTU  阅读(880)  评论(0编辑  收藏  举报