开启辅助访问 切换到窄版

打印 上一主题 下一主题

在linux系统中模块化重新编译ext文件,实现新的文件系统

[复制链接]
版块:
嵌入式操作系统 linux 发布时间:2021-2-3 04:55:39
13330
楼主
跳转到指定楼层
一、 设计目的与要求
目的:掌握操作系统功能模块的设计与实现方法。
要求:能够在阅读和分析开源操作系统的基础上,对其进行功能模块划分;能够指出现有功能模块的不足,并能够通过文献的研究给出解决方案。
能够完成操作系统功能模块的设计、实现与测试,同时在设计操作系统功能模块中,能体现优化和创新意识。
能够制定合理的实验方案及对实验结果进行分析并得出结论,针对实验结果分析解决过程的影响因素,论证解决方案的合理性,以获得有效结论。
能够根据设计任务和要求组成团队,分工协作,并能承担个体、团队成员以及负责人的角色。
能够用口头和书面方式清晰表述设计原理及相关概念与原理,包括陈述发言,清晰表达和回应指令。
能够撰写比较规范的课程设计报告。
二、 设计内容
实现基于模块的文件系统
修改ext3或ext4的源代码,实现新的文件系统。
(1)复制ext3或ext4的源代码,修改Makefile文件,
使用模块编译方式,重新编译Linux内核。
(2)可以动态加载和卸载新的文件系统。
(3)需要修改文件系统的名称,能对文件写操作向系统后台打印出信息。
三、 设备与环境
虚拟机Vmware,镜像文件Ubuntu 12.0.4,linux内核版本3.13.1
四、 设计思想
在linux系统中安装新的linux内核,然后将ext3,ext4设置为模块化编译模式将linux内核重新编译,这样文件系统在接下里就可以单独模块化编译而无需再次编译内核了。
接下来修改ext3文件中的内容,修改文件系统名称和加入pintk函数,就可以得到新的文件系统,将此新的文件系统编译,然后挂载进设备中就可以使用新的文件系统了。
五、 主要数据结构和流程
1.配置linux需要的环境

2.将ext3,ext4文件系统设置为模块化编译模式

3.编译和安装
退出menuconfig后,在命令行中输入make -j4命令即可开始编译。-j4意思是并发执行,可以提高速度,一般情况 下不要多于CPU核数。这个命令的执行会耗费很长时间。
编译完成之后首先安装模块,命令为:
sudo make modules_install
其次安装内核,命令为:
sudo make install


4.将内核作为引导,将数字更改为自己编译的版本号:
sudo update-initramfs -c -k 3.13.1
下面更新一下grub:
sudo update-grub
接着用uname -查看内核新版本

5. 修改文件系统名字和加入打印
将namei.c中的mknod函数中的内容删除,并改为

在file.c中修改release函数和fsync函数,加入打印内容

修改Makefile文件,更改名称

6. 重新编译文件系统,使用make clean清理以前编译的内容,再次make生成.ko文件。
7. 加载新文件系统
Insmod liuweiext2.ko
8. 配置文件系统的设备块,挂载文件系统
新建的设备块名称叫liuweifs
Mkfs.liuweiext2 /dev/liuweifs
Mkdir /mnt/liuweifs
挂载:mount /dev/liuweifs /mnt/liuweifs
可以看到mnt中多了liuweifs使用新文件系统的文件。

综上,新的文件系统已经配好了。
六、 实验测试结果及结果分析
开始测试新的文件系统,我们使用文件读写功能,测试file.c中的打印函数是否被调用并输出内容。
在mnt中的liuweifs文件夹中新建一个txt文件,并在文件中写入随机内容:


文件写入成功,使用dmesg|tail查看printk输出的信息:

接下来测试文件系统中mknod函数修改过户的输出:


可以看出,调用修改过的mknod函数也正确输出了打印内容。
结果分析:我修改了原本文件系统中的file.c的读写函数,以及namei.c中的mknod函数,在新的文件系统中通过vim命令新建txt文件并写写点内容,接下来file.c中的读写函数就被触发了,正确打印出了printk中的内容。
同样,在调用修改过的mknod函数时,也正确输出了mknod函数中的printk中的内容。
七、 课程设计总结
通过本次课程设计,让我对linux中的文件结构有了了解,学会了安装linux系统,学习到了很多linux命令操作指令。对linux系统的编译,模块编译都熟悉了。接着更进一步熟悉了Makefile文件的作用以及如何修改Makefile文件,然后学会了如何修改linux系统中文件系统的代码,实现打印输出提示。
锻炼了自己网上查找教程和资料的能力,能够独立完成一个陌生的项目。
附件1 课程设计答辩记录
问:你会查看自己内核信息么?
答:可以uname -r查看到内核信息。
问:如何操作卸载你的文件系统?
答:先卸掉设备块的挂载,再卸载文件系统。用umount卸掉设备,用rmmod卸掉文件系统。
问:你的printk内容写载哪个文件里的?为何写在这里?
答:写在file.c文件里,因为创建一个文本文件并读写时会调用到file.c文件。
附件2:源程序清单
obj-$(CONFIG_EXT2_FS) += liuweiext2.oS
liuweiext2-y := balloc.o dir.o file.o ialloc.o inode.o \
ioctl.o namei.o super.o symlink.o
liuweiext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o
liuweiext2-$(CONFIG_EXT2_FS_POSIX_ACL) += acl.o
liuweiext2-$(CONFIG_EXT2_FS_SECURITY) += xattr_security.o
liuweiext2-$(CONFIG_EXT2_FS_XIP) += xip.o
all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
static int ext3_mknod (struct inode * dir, struct dentry *dentry, umode_t mode, dev_t rdev)
printk("no no no no no no no no no no no no no no no no no no no no no no no no no!\n");
return EPERM;
static int ext3_release_file (struct inode * inode, struct file * filp)
if (filp->f_mode & FMODE_WRITE) {
mutex_lock(&EXT3_I(inode)->truncate_mutex);
Ext3_discard_reservation(inode);
mutex_unlock(&EXT3_I(inode)->truncate_mutex);
printk("hello hello heloo hello hello hello hello hello");
return 0;
int ext3_fsync(struct file *file, loff_t start, loff_t end, int datasync)
int ret;
struct super_block *sb = file->f_mapping->host->i_sb;
struct address_space *mapping = sb->s_bdev->bd_inode->i_mapping;
ret = generic_file_fsync(file, start, end, datasync);
if (ret == -EIO || test_and_clear_bit(AS_EIO, &mapping->flags)) {
/* We don't really know where the IO error happened... */
Ext3_error(sb, __func__,
"detected IO error when writing metadata buffers");
ret = -EIO;
printk("biu biu biu biu biu biu biu biu biu");
return ret;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表