linux内核奇遇记之md源代码解读之一


最近花了一段时间认真地学习了一下md代码,并且在原代码的基础上开发了一系列的新功能,这些新功能让md更完善、更适合于企业大容量存储,通过增加阵列缓存和bitmap优化大大提升了存储速度,提高了数据的可靠性,在任何掉电的情况下保证数据一致性,超级块异常情况下完全不影响阵列使用,完全控制了踢盘问题,简化了用户操作。简单地概括一下,就是让存储不再有门槛。说了这么多,其实想表达的意思就是md的学习之路并非十分顺利,特此写此博文与所有兄弟姐妹们共享一下我的学习经验,如果您看完之后能有所收获,那就不枉费我下功夫写这些技术文章,同时您的感想和回复也将是我能够继续写下去的最大动力。 md代码在内核树中十多年经久不衰,跟作者neil brown,一位久经考验的开源战士,是分不开的。neil brown的博客地址是http://blog.neil.brown.name/,这个网址非常重要,因为我发现自己遇到疑难问题的时候80%问题都能在这里找到答案,所以有空的时间从到头到尾扫一遍,可以解决许多“为什么要这样做”的问题。 最初我看内核代码都是从module_init开始看的,可是自从学习了kconfig之后,我就改变了一下习惯,从kconfig和Makefile开始看代码了,如果谁有更好的办法请分享一下谢谢。 下面就来看一下drivers/md/Kconfig
#
# Block device driver configuration
#

menuconfig MD
     bool "Multiple devices driver support (RAID and LVM)"
     depends on BLOCK
     help
       Support multiple physical spindles through a single logical device.
       Required for RAID and logical volume management.

if MD
config BLK_DEV_MD
     tristate "RAID support"
     ---help---
#...省略若干
endif # MD

menuconfig这个单词已经很熟悉了,因为自从开始学习编译内核的时候就有这样一个命令make menuconfig,当我们在内核源代码目录下敲下这个命令时,就会出现一个文本配置界面,在文本配置界面中可以选择需要编译到内核的模块,那有了这里的menuconfig MD,文本配置界面中才会有MD的一项,当选中MD之后,文本配置界面才会出现config BLK_DEV_MD和之后的选项,这些选项一般有两种状态,一个是tristate,表示内建、模块、移除三种状态,另一个是bool,表示选中或不选中。depends on表示正向依赖,如果选上了这个模块,那么正向依赖的模块也会自动选上,正向依赖模块递归所依赖的模块也会选上。一般把这些驱动模块选择为按模块加载,可以方便修改调试。 知道了Kconfig的基本配置,就可以按需定制内核,把不需要的统统去掉,也明白了为什么有时候系统的lib/module/下面为什么没有对应的模块了。 而对于阅读源代码来说,知道了哪些源代码编译进了内核,哪些源代码编译进了模块,哪些源代码没有编译,这样就可以按需阅读源代码了。另外在源代码中有一些编译选项类似: #ifdef CONFIG_*
     //code
#endif
那么*号就是对应这里Kconfig中config后面的选项,如果这里选项选上,那么编译选项就为真。这些编译选项还用于对应的Makefile文件中,如md对应的Makefile文件有:
obj-$(CONFIG_MD_RAID0)          += raid0.o
obj-$(CONFIG_MD_RAID1)          += raid1.o
obj-$(CONFIG_MD_RAID10)          += raid10.o
obj-$(CONFIG_MD_RAID456)     += raid456.o
obj-$(CONFIG_MD_MULTIPATH)     += multipath.o
obj-$(CONFIG_MD_FAULTY)          += faulty.o
obj-$(CONFIG_BLK_DEV_MD)     += md-mod.o

如果在Kconfig中选中了config BLK_DEV_MD,那么Makefile就要编译生成md-mod.ko模块,那这个模块由哪几个文件生成的呢?看Makefile中定义: md-mod-y     += md.o bitmap.o
raid456-y     += raid5.o
就是说在Kconfig中选中了config BLK_DEV_MD,md.c, bitmap.c就会被编译。同理,config MD_RAID456被选中,raid5.c就会被编译。 这里,我们也可以知道,哪一个模块对应着哪几个源文件。 例如要加载md-mod.ko,那么就需要md.c, bitmap.c。修改raid5代码时,只需要重新编译raid5.c一个文件就可以了。 下一个小节接着开始讲md模块初始化。

相关内容