Linux 修改文件系统并编译-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

Linux 修改文件系统并编译

杨冬芳 2016-07-15 14:13:13 2139

本学期刚学的操作系统,现在课程设计要求修改Linux内核,并对其中的ext4做修改
要求如下:
1.openSUSE desktop系统
2.ext4拿出来编译
3.read,write函数找到,在进行相关操作时在控制台输出信息,打印printk
4.用dmese方式(老师讲得太快,应该是这个意思)
之前一直没有接触过Linux,所以各种碰壁。
下载,编译内核相关知识已经自学完毕,但是在修改文件系统的时候出现了问题
1.老师对系统的选择我没有太多异议,而且适应了suse里的相关操作
2.已经在内核源代码(Linux-3.11-6-4)的/fs/ext4文件夹下找到了ext4系统的源代码,但是不知该如何下手
3.dmese方式并不是很理解,是不是记录类型的文件?
我自己设想的解决方案是这样
找到ext4中的相关函数,添加 SEQ_printf(····);
编译,加载内核
测试添加的语句是否能运行
希望前辈们指点一二,只要在老师要求的修改源码(read。write)关键的几步上点播一下就好了,剩下的我自己来,目前卡在找到相关的函数这里,源文件#include了好多,还有Linux的API,看不懂TAT

Linux API
分享到
取消 提交回答
全部回答(1)
  • 杨冬芳
    2019-07-17 19:56:55

    《操作系统》课程设计报告
    课程设计题目:操作系统课程设计 设计时间:2016/1/10
    一、 课程设计目的与要求
    需要完成的内容:
    (1) 安装虚拟机:Vmware、Vmware palyer (free)(推荐)、Virtualbox(推荐)、VMLite、Xen、Virtuozzo、KVM
    (2) 安装和使用Linux(推荐SUSE)(注意包含内核源码和内核开发工具等)
    (3) Linux内核源代码配置和重编
    (4) 找到VFS和一个具体文件系统的源代码(ext3或ext4)
    (5) 读懂VFS和具体文件系统如何关联(如何体现virtual file switch)
    (6) 找到具体文件系统的read或write函数,使用printk(使用方法和printf一样)向后台打印文件读写信息。(read或write函数选一个即可)
    (7) 使用dmesg –c查看后台的输出。
    可以附加的功能
    (8) 复制ext3或ext4的源代码(注意与当前使用的文件系统有区别),修改Makefile文件,使用模块编译方式
    (9) 修改ext3或ext4的源代码,实现新的文件系统。(至少需要修改文件系统的名称,最好能对文件写操作向系统后台打印出信息。)
    (10) 动态加载和卸载新的文件系统。
    二、 课程设计内容
    (1) 安装虚拟机
    (2) 安装和使用Linux
    (3) Linux内核源代码配置和重编
    (4) 提取并动态加载和卸载新的文件系统
    三、 课程设计设备与环境
    设备信息:PC

    虚拟机:VM11

    四、 设计正文(包括分析与设计思路、各模块流程图、带注释的主要算法源码、内核编译过程以及动态模块加载过程等,如有改进或者拓展,请重点用一小节进行说明)
    (1) 安装虚拟机
    (2) 安装和使用Linux(推荐SUSE)(注意包含内核源码和内核开发工具等)
    安装OpenSUSE,并下载相近版本的内核源码

    初始内核版本

    下载的源代码包

    (3) Linux内核源代码配置和重编
    利用vmtools(虚拟机提供的可以在宿主机和虚拟机之间自由复制文件的工具)将内核源码包复制进虚拟机,解压到
    /home/a123/linux-3.12.51

    *因为分配的磁盘空间比较小,所以没有按照惯例把内核源码放在/usr/src目录下(如果放在这里,会出现空间不足的情况)
    附:磁盘分配情况
    /swap(交换分区) 2.4G
    /(根目录) 11G
    /home(用户目录) 13G

    解压好的内核源码文件在编译前需要稍作修改(6),并且缺乏一个config文件告诉编译器编译哪些功能。
    Config文件可以用make menuconfig命令生成,但是需要自己选择相应的功能,太过复杂,这里有一个简便的方法
    因为下载的内核源码是相近的版本,所以可以使用现有版本的config文件,该文件在/boot目录下
    使用cp /boot/config-3.11.6-4-desktop .config命令将此文件复制过来

    注意:应当在内核所在的文件目录下使用此命令
    复制成功

    执行 make menuconfig命令,进入选择界面,直接保存退出即可
    虽然新版本的Linux可以直接执行make一步完成所有的编译工作,但此次课程设计仍然采用以前的编译的方式

    1. 执行 make bzImage命令——编译压缩的内核
      编译完成

    执行 make modules命令——编译模块

    执行 make modules_install命令——安装模块

    注:

    在make menuconfig时我在General setup中把版本号改过

    1. 执行 make install命令——安装新内核
    2. Reboot重启

    说明内核修改安装完毕,成功
    (4) 找到VFS和一个具体文件系统的源代码(ext3或ext4)
    VFS:虚拟文件系统,顾名思义。它为应用程序员提供一层抽象,屏蔽底层各种文件系统的差异。Linux的文件系统采用面向对象的方式设计,这使得Linux的文件系统非常容易扩展,我们可以非常容易将一个新的文件系统添加到Linux中。
    在此主要对象之一super_block
    位于中

    代码量巨大,此为部分代码
    Ext4在fs文件夹下的ext4文件夹内

    此处打开file.c
    用vim打开file.c
    部分代码如下

    (5) 读懂VFS和具体文件系统如何关联(如何体现virtual file switch)
    在(4)中已经提到,VFS是C语言写的一个面向对象的设计,比如我们要调用alloc_inode方法:
    sb->s_op->alloc_inode(sb)。
    这里与面向对象语言的差别是,面向对象语言里实例方法可以访问到this,这样就可以访问到自身的所有成员,但是在C里却做不到,所以需要将自身作为参数传入到函数中、
    图一表示了对文件写操作的调用过程

    (6) 找到具体文件系统的read或write函数,使用printk(使用方法和printf一样)向后台打印文件读写信息。(read或write函数选一个即可)
    因为Linux系统对文件的操作是通过函数调用来实现的,所以在此我修改的是vfs这一层,找到fs,目录下的read_write.c并打开
    找到do_sync_read函数,在其返回前加入printk语句

    (7) 使用dmesg –c查看后台的输出。

    (8) 复制ext3或ext4的源代码(注意与当前使用的文件系统有区别),修改Makefile文件,使用模块编译方式

    (9) 修改ext3或ext4的源代码,实现新的文件系统。(至少需要修改文件系统的名称,最好能对文件写操作向系统后台打印出信息。)

    使其在加载和卸载的时候能够printk到buffer缓冲中
    (10) 动态加载和卸载新的文件系统。
    使用insmod语句加载
    使用lsmod语句加载

    加载成功
    接下来使用dmesg 查看缓冲区内容

    成功
    接下来使用rmmod语句卸载模块

    成功
    五、 课程设计结果及分析
    课程设计结果:成功
    分析:Linux文件系统使用了面向对象的设计方法,保证了其对用户的透明,VFS层实现了系统与文件系统的无关性,增加了系统对不同文件系统的兼容性。
    六、 总结与进一步改进设想
    总结:
    1.编译内核的时候,可以使用make XXX –j8
    这样可以开启多线程编译(我的虚拟机分配的是8核心),加快编译速度
    2.printk语句我写的是printk(”””DoingRead”);
    本意是利用printk的优先级,将其输出到用户态的控制台,结果语法错误,并没有输出到控制台
    改进设想:
    修改的文件前加上语句,实现对控制台的输出

    define KERN_EMERG 0(因为缺少这个宏,导致系统并没有理解我的0是什么意思)

    七、 答辩(或汇报)记录(包括问题和答案,每个人不少于3个)

    1. 显示内核版本

    使用dmesg –c命令

    加载新模块

    八、 参考文献

    1. 鸟哥的Linux私房菜
    2. 百度百科:printk概述
      http://baike.baidu.com/link?url=Kv5e2xb9thGENkIvSQmjpkYb8kbKoNvEhmt2oICTmDAn0wj2YADVf8dsrzBtz2fRt0uwa_3joQ-o40wKwwL68a
    3. Linux虚拟文件系统(VFS)
      http://www.cnblogs.com/yuyijq/archive/2013/02/24/2923855.html
    4. LinuxEXT4文件系统分析
      http://wenku.baidu.com/link?url=Wi-vyrROUIJqRk4eSsuwOwRe0Sf-ydXamWNR0H2HCrN9CPHJg80lXpu0Gi_ZGT-X5yKnknl86ooHdckHhJxybmyBR2szWsPDOV0IPJ6fJXO
    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程