基于C++的模拟实现linux文件系统

fileSystem

模拟实现linux文件系统。inode、superBlock…

The simulation of the linux file system.

实现环境:

  • Ubuntu 14.04

  • C++高级操作语言

  • vim编辑器

通过**C++**调用linux系统函数,一块硬盘(创建的一个文件,本程序中是DISK)上实现一个简单的linux文件系统。

主要数据结构

Inode

索引节点数据结构。

class Inode{
public:
	Inode();

	static const int SIZE = 64;
	int flags;						//本节点是否使用标志位
	int owner;						//所有这是谁,程序中只有模拟功能,并无其他用途,取值0或者1
	int size;



	int ptr[13];					//索引指针,共有13个。1~9为直接索引10为单词索引,11为二次索引,12为三次所以
};

索引节点索引指针如图所示:

InodeBlock

索引块

class InodeBlock{
	public:
		static const int SIZE = DISK_BLOCK_SIZE/Inode::SIZE;
		Inode node[SIZE];
};

Indirect

class IndirectBlock{
public:
	static const int SIZE = DISK_BLOCK_SIZE/sizeof(int);
	int ptr[SIZE];
};

superblock

文件系统中第一个数据块

class SuperBlock{

public:
	int size;				//这个硬盘(DISK)中总得Block数目
	int isize;				//索引节点的数目
	int freeList;			//未使用数据块位置
};

主要流程

  • 创建fileSystem
  • 格式化硬盘(fileSystem::formatDisk):初始化全部Block,初始化superblock。
  • 创建文件(fileSystem::create):初始化inodeBlockTable。
  • 打开文件(fileSystem::open()): 记录已新建文件数
  • 写入字符:(fileSystem::write):通过索引节点寻找空白block(fileSystem::allocate函数),写入。
  • 展示:(fileSystem::show()),通过屏幕打印出来。

主要函数

fileSystem.cpp

  • FormatDisk() 当处于没有文件存在状态时初始化文件系统:填写superblock,并初始化所用的block中数据为零。
  • Shutdown() 关闭文件并关闭Disk。
  • Create() 创建文件。在inodeblock table(即本程序中预设的在superBlocks下的四个inodeBlock)中写入数据。
  • Open() 打开一个已存在的文件。
  • Write() 参数有file descriptor,buffer数组,buffer长度。
  • Seek() 参数有file descriptor,查找写入数据的位置,(这里保留了UNIX文件系统的三个变量:SEEK SET, SEEK CUR, and SEEK END)
  • Close() 参数有file descriptor。关闭文件,File descriptor table和Seek pointer table从移除入口。
  • Close() 参数有file descriptor,把inode写回disk,移除所有入口。
  • Allocate()函数 比较关键,寻找freeblocks的位置,以向后来空白block写入数据。
  • Free() free一个block,并添加到free list
    http://www.biyezuopin.vip

Disk.cpp

  • Constructor Disk() 作用是建立DISK,如果不存在就初始化superblock为0
  • read() 硬盘读操作。只能读数据的一个block。重载了三次,分别被用来读superblock、inodeblocks、indrection blocks。其中inodeBlocks是一个单位Block,包括4个inode。Inderction blocks 中含有指针指向inodeblocks的指针。
  • Write() 硬盘写操作。只能写数据的一个block, 重载了三次,分别被用来写superblock、inodeblocks、indrection blocks。
  • Stop() 停止硬盘运行。

。。。

tips

  • 本程序中一个Block含有4个inode,一个inode含有16个int,即64个byte。
  • 本程序在一个新建的DISK文件上操作。DISK即硬盘。DISK上共有1024个Block.

说明

  1. 演示成果中每一行代表一个block。第一行是superBlock.第2~5行为inodeBlockTable,用来存放数据块信息。第6行向后是可以存放数据的Block。
  2. 如图所示:第一行中第一个inode(每个inode占用16个字节)中存放的三个数据分别为:
  • 1024:总BLock数
  • 4: inodeBlockTable所占大小
  • 6: freeBlock(即)起始位置
  1. 当新建file1,并向其中输入:“任意字符****”。fileSystem通过寻找发现第5个BLock为空,后写入字符串。修改superblock(刚开始时superBlock三个字符分别为1024、4、5),修改inodeBlockTable:
  • 1:flag,当前inode是否已被写入
  • 1:owner
  • 42:文件大小(即输入的字符串大小)
  • 5:存放文件的block位置
  1. 第五个Block为存放file1的位置。

接着新建文件file2

显示结果如图:

接着新建文件file3

显示结果如图:

注意第三个图中inodeBlockTable中(即2~5行),前三个inode的数据(第二行)已经改变。

1. 在现有机器硬盘上开辟100M的硬盘空间,作为设定的硬盘空间。 2. 编写一管理程序simdisk对此空间进行管理,以模拟Linux文件系统,要求: (1) 盘块大小1k (2) 空闲盘块的管理:Linux位图法 (3) 结构:超级块, i结点区, 根目录区 3. 该simdisk管理程序的功能要求如下: (1) info: 显示整个系统信息(参考Linux文件系统的系统信息),文件可以根据用户进行读写保护。目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开。 (2) cd …: 改变目录:改变当前工作目录,目录不存在时给出出错信息。 (3) dir …: 显示目录:显示指定目录下或当前目录下的信息,包括文件名、物理地址、保护码、文件长度、子目录等(带/s参数的dir命令,显示所有子目录)。 (4) md …: 创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。 (5) rd …: 删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。 (6) newfile …: 建立文件。 (7) cat …: 打开文件。 (8) copy …: 拷贝文件,除支持模拟Linux文件系统内部的文件拷贝外,还支持host文件系统模拟Linux文件系统间的文件拷贝,host文件系统的文件命名为<host>…,如:将windows下D:盘的文件\data\sample\test.txt文件拷贝到模拟Linux文件系统中的/test/data目录,windows下D:盘的当前目录为D:\data,则使用命令: simdisk copy <host>D:\data\sample\test.txt /test/data 或者:simdisk copy <host>D:sample\test.txt /test/data (9) del …: 删除文件:删除指定文件,不存在时给出出错信息。 (10) check: 检测并恢复文件系统:对文件系统中的数据一致性进行检测,并自动根据文件系统的结构和信息进行数据再整理。 4. 程序的总体流程为: (1) 初始化文件目录; (2) 输出提示符,等待接受命令,分析键入的命令; (3) 对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。
模拟Linux文件系统。在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的 模拟Linux文件系统 在现有机器硬盘上开辟20M的硬盘空间,作为设定的硬盘空间。 2. 编写一管理程序对此空间进行管理,以模拟Linux文件系统,具体要求如下: (1) 要求盘块大小1k 正规文件 (2) i 结点文件类型 目录文件 (共1byte) 块设备 管道文件 物理地址(索引表) 共有13个表项,每表项2byte 文件长度 4byte 。联结计数 1byte (3)0号块 超级块 栈长度50 空闲盘块的管理:成组链接 ( UNIX) 位示图法 (Linux) (4)每建一个目录,分配4个物理块 文件名 14byte (5)目录项信息 i 结点号 2byte (6)结构: 0#: 超级块 1#-20#号为 i 结点区 20#-30#号为根目录区 3. 该管理程序的功能要求如下: (1) 能够显示整个系统信息,源文件可以进行读写保护。目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开。 (2) 改变目录:改变当前工作目录,目录不存在时给出出错信息。 (3) 显示目录:显示指定目录下或当前目录下的信息,包括文件名、物理地址、保护码、文件长度、子目录等(带/s参数的dir命令,显示所有子目录)。 (4) 创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。 (5) 删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。 (6) 建立文件(需给出文件名,文件长度)。 (7) 打开文件(显示文件所占的盘块)。 (8) 删除文件:删除指定文件,不存在时给出出错信息。 4. 程序的总体流程为: (1) 初始化文件目录; (2) 输出提示符,等待接受命令,分析键入的命令; (3) 对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。
在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟Linux文件系统。 1. 在现有机器硬盘上开辟100M的硬盘空间,作为设定的硬盘空间。 2. 编写一管理程序simdisk对此空间进行管理,以模拟Linux文件系统,要求: (1) 盘块大小1k (2) 空闲盘块的管理:Linux位图法 (3) 结构:超级块, i结点区, 根目录区 3. 该simdisk管理程序的功能要求如下: (1) info: 显示整个系统信息(参考Linux文件系统的系统信息),文件可以根据用户进行读写保护。目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开。 (2) cd …: 改变目录:改变当前工作目录,目录不存在时给出出错信息。 (3) dir …: 显示目录:显示指定目录下或当前目录下的信息,包括文件名、物理地址、保护码、文件长度、子目录等(带/s参数的dir命令,显示所有子目录)。 (4) md …: 创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。 (5) rd …: 删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。 (6) newfile …: 建立文件。 (7) cat …: 打开文件。 (8) copy …: 拷贝文件,除支持模拟Linux文件系统内部的文件拷贝外,还支持host文件系统模拟Linux文件系统间的文件拷贝,host文件系统的文件命名为…,如:将windows下D:盘的文件\data\sample\test.txt文件拷贝到模拟Linux文件系统中的/test/data目录,windows下D:盘的当前目录为D:\data,则使用命令: simdisk copy D:\data\sample\test.txt /test/data 或者:simdisk copy D:sample\test.txt /test/data (9) del …: 删除文件:删除指定文件,不存在时给出出错信息。 (10) check: 检测并恢复文件系统:对文件系统中的数据一致性进行检测,并自动根据文件系统的结构和信息进行数据再整理。 4. 程序的总体流程为: (1) 初始化文件目录; (2) 输出提示符,等待接受命令,分析键入的命令; (3) 对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值