【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