本文的目的就是将ext2, ext3,ext4文件系统编译成模块化,当我们需要对ext2, ext3,ext4进行修改的时候,就不需要重新编译内核。在这里,我会尽可能详细讲解每一个步骤,包括重新编译内核,力求详尽易懂~
1.通过uname -a的指令,查看当前内核版本的详细信息,下载对应的内核版本,此处,我的内核版本是2.6.34.14,所以我要下载的对应内核版本是linux-2.6.34.14.tar,如下图所示:
2.使用tar指令解压linux-2.6.34.14.tar。在/usr/src/目录下,创建目录linux-module,将linux-2.6.34.14源码目录拷贝进去。
4.此处开始进入内核编译步骤~
a. make mrproper(删除以前的.o文件)
b. make menuconfig(设置模块化参数,生成.config文件,这步很重要)
在menuconfig主界面,进入filesystem选项,通过空格键将ext2,ext3,ext4行首的[*]改为[M],界面如下:
!!!重点:在配置完menuconfig之后,记得要在配置文件中查看一下ext2,ext3,ext4是不是已经配置成模块化的方式。下面以ext4为例进行查询,其余文件系统同理可查。
使用命令gedit .config,ctrl+F查找ext4,这样就可以查看到ext4是否已经修改为模块化。ext2_FS=m表明已经修改成功。y代表内核。
c.make dep(建立依赖关系)
d.make clean(删除无用文件)
e.make bzImage(编译内核)
f.make modules(编译模块)
g.make modules_install(安装模块)
h. make install(建立initrd)
i.update-initramfs -c -k 2.6.34.1
j.update-grub
k.reboot
编译内核成功,重启系统,进入新内核。在/home/ql/目录下,新建目录modulefs,并且把源码/usr/src/linux-2.6.34.14/fs/ext2目录复制到home/ql/modulefs,同时按下图所示修改Makefile文件。
修改ext2文件夹下的源码,加入需要打印的printk信息。然后对ext2文件系统的模块编译:
a.make clean
b.make
c.insmod ext2.ko
d.mkfs.ext2 /dev/ram0
f.mkdir /mnt/ram0
h.mount /dev/ram0 /mnt/ram0
加载模块成功之后,在设备上进行文件操作,使用dmesg -c 就可以看到你需要打印的printk信息了。我在这里主要修改了inode.c文件,在函数下加入了
printk("!!!正在被执行的函数名");。进入到/mnt/ram0目录下,输入有inode操作的指令,我这里输的是mkdir,使用dmesg -c,显示了mkdir在inode.c里调用的函数名。
ext3的模块化步骤是一样的,这里值得一提的是ext4模块化。
解决方案是,将ext4的模块名称重命名。这在ext4的Makefile文件中进行修改:
同时对ext4的源码进行修改:
然后进行模块编译~就ok啦
Debug:
1.在模块装载这一步,insmod ext2.ko可能会出现一下错误,
解决方法:
你需要在系统未给你插入模块之前,手动插入你加入的模块。
把里面的GRUB_TIMEOUT设置为GRUB_TIMEOUT=20
然后输入 update-grub
再reboot。
若reboot还没有选项,而是直接进入之前的内核,则
2.修改 vim /etc/grub.d/30_os_prober
把里面三个else set timeout=0的地方 改为=20
然后在 update-grub
在reboot !
3.
编译驱动的时候碰到了 insmod: error inserting './igb.ko': -1 Unknown symbol in module 的问题,在网上看了下,说是查看 dmesg | tail 看输出信息中的Unknown symbol,加载上这些模块就好。
但是我在系统中查看
dca_remove_requester
dca_add_requester
dca_unregister_notify
dca_register_notify
dca3_get_tag
5个模块是没有找到,细细一想,估计是由于模块依赖的其他模块没有加载导致的。
直接用: modinfo ext2.ko | grep depend 找模块的依赖,结果如下,
depends: dca
然后再执行:
localhost:/opt/igb/igb-4.0.17/src # modprobe dca
localhost:/opt/igb/igb-4.0.17/src # insmod ext2.ko