Linux文件系统的实现
学生姓名:刘璞 指导老师:张海云
实验目的:
文件系统是操作系统中最直观的部分,因为用户可以通过文件直接地和操作系统交互,操作系统也必须为计算机提供数据计算,数据存储的功能。本实验通过添加一个文件系统,进一步理解linux的文件系统及其实现
实验内容:
本项目的内容是要添加一个类似于ext2的自定义文件系统myext2。我们对myext2文件系统的描述如下:
1、myext2文件系统的物理格式定义与ext2基本一致,除了myext2的magic number是0x6666,而ext2的magic number是0xEF53。
2、myext2是ext2的定制版本,它只支持原来ext2文件系统的部分操作,以及修改了部分操
作。
文件系统的定义和操作是完成了,但不要忘了,这样的一个文件系统如何去创建呢?我们最后还要提供一个创建myext2文件系统的工具:2。
如何实现上面提出来的要求呢?首先从添加一个完全和ext2相同的myext2开始,然后再对myext2进行雕琢:先修改magic number,再修改Linux对myext2文件系统的一些操作。最后是创建文件系统的工具2的完成。
实验准备:
内核版本为2.6的linux源码中关于文件系统的与之前版本的有所不同,比如没有ext2_fs_i.h,而在struct super_block和struct_inode中关于文件系统的union中的内容也有所不同。因此以早些时候的版本2.4.9作为实验用内核。
实验步骤:
第一部分. 添加一个和ext2完全相同的文件系统myext2
要添加一个与ext2完全相同的文件系统myext2,首先是确定实现ext2文件系统的内核源码是由哪些文件组成。Linux源代码结构很清楚地告诉我们:fs/ext2目录下的所有文件是属于ext2文件系统的。再检查一下这些文件所包含的头文件,可以初步总结出来Linux源代码中属于ext2文件系统的有:
fs/ext2/balloc.c
fs/ext2/bitmap.c
fs/ext2/dir.c
测试网线fs/ext2/file.c
fs/ext2/fsync.c
fs/ext2/ialloc.c
fs/ext2/inode.c
fs/ext2/ioctl.c
fs/ext2/namei.c
fs/ext2/super.c
fs/ext2/symlink.c
include/linux/ext2_fs.h
include/linux/ext2_fs_i.h
include/linux/ext2_fs_sb.h
有了这些初步的信息后(当然这些信息是否正确,还需后面的检验),我们接下来开始添加myext2文件系统的源代码到Linux源代码。
由于本步工作是要克隆ext2文件系统到myext2文件系统,所以我们需要把ext2部分的源代码克隆到myext2去,即复制一份以上所列的ext2源代码文件给myext2用。按照Linux源代
码的组织结构,我们把myext2文件系统的源代码存放到fs/myext2下,头文件放到include/linux下。在Linux的shell下,执行如下操作:
#cd /usr/src/linux
#cd fs
#cp –R ext2 myext2
#cd ../include/linux
#cp ext2_fs.h myext2_fs.h
find函数和mid函数的嵌套#cp ext2_fs_i.h myext2_fs_i.h
#cp ext2_fs_sb.h myext2_fs_sb.h
这样就完成了克隆文件系统工作的第一步——源代码复制。对于克隆文件系统来说,这样当然还远远不够,因为文件里面的数据结构名、函数名、以及相关的一些宏等内容还没有根据weight的搭配myext2改掉,连编译都通不过。
下面我们开始克隆文件系统的第二步:修改上面添加的文件的内容。为了简单起见,我们做了一个最简单的替换:将原来*EXT2*替换成*myext2*;将原来的*ext2*替换成*myext2*。
如图
其它代码的修改类似。
修改完myext2的内容后,一定要执行如下步骤:
到/usr/src/linux/include/linux目录下,到3个文件
include/linux/ext2_fs.h
include/linux/ext2_fs_i.h
include/linux/ext2_fs_sb.h
修改过程同上
关于具体文件系统部分的代码是修改完了,但是关于具体文件系统和整个操作系统的接口部分是不是也需要修改呢?根据前面所学的内容,想起来我们还需要修改操作系统中所有文件系统都需要的两个数据结构:struct super_block和struct inode。Linux要支持的文件系统,必须在这两个结构中的两个union中分别有所登记。因此,我们必须将myext2的信息也添加到这两个union中:
好了,源代码的修改工作到此结束。接下来就是第三步工作——编译源代码。首先
要把myext2 加到编译选项中去,以便在做 make menuconfig 的时候,可以将该选项
加上去。做这项工作需要修改三个文件:
linux/Documentation/Configure.help
linux/fs/Config.in
linux/fs/Makefile
修改过程如下: (“+linux建立文件系统的命令”表示增加的语句)
1.
linux/Documentation/ig
linux/Documentation/Configure.help
***************
be compiled as a module, and so this could be dangerous. Most everyone wants to say Y here.
+My Second extended fs support
+CONFIG_MYEXT2_FS
+This is the test of adding a self-defined filesystem.
Ext3 journalling file system support (EXPERIMENTAL)
作用:在上面这段程序中添加了关于 myext2 的帮助,也就是在做 make menuconfig 的时候可
以查看该选项的有关帮助的内容。
2.
linux/fs/ig
+++linux/fs/Config.in
***************
tristate 'Second extended fs support' CONFIG_EXT2_FS
+tristate 'My Second extended fs support' CONFIG_MYEXT2_FS
+tristate 'System V/Xenix/V7/Coherent file system support' CONFIG_SYSV_FS]
作用:在上面这段程序中添加关于 myext2 配置宏,将编译选项和宏关联起来。
3.
linux/ig
linux/fs/Makefile
***************
subdir-$(CONFIG_EXT2_FS) += ext2
+subdir-$(CONFIG_MYEXT2_FS)
+= myext2 subdir-$(CONFIG_ZLIB_FS_INFLATE)
+= inflate_fs
在上面这段程序中,添加了 myext2 目录,将宏与源代码目录关联起来。
完成这些之后,我们已经成功地将我们的源代码与编译选项关联。但是不要忘了,我们 还有 fs/myext2 目录下的 Makefile:
---linux/fs/ig
+++linux/fs/myext2/Makefile
***************actions speak louder than words
*** 10,10 ****
-O_TARGET := ext2.o
+O_TARGET := myext2.o
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论