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

linux内核奇遇记之md源代码解读之一
转载请注明出处:http://blog.csdn.net/liumangxiong
最近花了一段时间认真地学习了一下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模块初始化。
转载请注明出处:http://blog.csdn.net/liumangxiong
### 回答1: MDLinux内核中的一个模块,可实现磁盘阵列的软件级RAID,它和RAID0、RAID1、RAID4、RAID5、RAID6一样,就是一种磁盘阵列方案。 MD中最主要的部分是驱动程序,它运行在内核态中。它将多个磁盘设备组合在一起,成为一个逻辑设备,该逻辑设备对应着一个块设备文件。在这个逻辑设备上,可实现磁盘阵列的软件级RAID功能。 MD驱动程序的主要源代码是在/drivers/md目录下的md.c文件中,它包括了MD的全部源代码,还有一些其他相关文件,比如raid5.c等。 在这个文件中,最值得学习的是内核的模块化编程思想。模块化编程是一种将代码划分为模块的软件设计方法,通过将代码划分为不同的模块,实现代码的解耦、可重用、可维护性等目标。 在MD.c中我们还可以看到内核中的锁、内存管理等基本的内核技术的应用。通过对MD.c进行源代码解读,能够深入了解Linux内核的实现原理,特别是MD的RAID功能的实现,对于我们进一步学习Linux内核的相关知识和对其进行应用开发具有很大的帮助。 总之,通过对MD.c源代码解读,我们可以学习到Linux内核模块化编程思想、内存管理、锁机制等基本内核技术,进一步掌握Linux内核的实现原理,从而在Linux应用开发中更加熟练娴熟。 ### 回答2: MD(Multiple Devices)是一种常用的软件RAID方案,可以在Linux内核中实现,同时也是Linux内核中最基本的RAID模式之一。MD在实现中使用了驱动程序和用户空间工具,其中驱动程序包含在内核中,因此我们需要对MD源代码进行解读MD源代码是由C语言编写的,主要包含在drivers/md/目录下。在这个目录下,可以看到一些重要的文件和子目录,例如md.c、md.h、raid1.c、raid5.c等。这些文件和子目录定义了MD的基本结构和函数,如磁盘阵列的基本信息结构、磁盘块的操作函数等。 MD的实现思路比较清晰,可以简单地理解为将多个物理磁盘组合在一起,形成一个虚拟的块设备。在这个虚拟的块设备上,可以进行读写等操作,而具体的数据操作则由MD提供的不同RAID模式实现。例如,MD支持的RAID1模式就是将数据同步写入两个物理磁盘,以实现磁盘容错。而MD支持的RAID5模式则是将数据分散写入多个物理磁盘,通过奇偶校验等方式实现磁盘容错。 在MD源代码解读过程中,需要重点关注这些RAID模式的实现方式和相关函数。同时,还需要了解整个MD的插入和移除机制、数据恢复机制等,以便更好地理解和修改MD源代码。 总之,对于想要深入了解Linux内核中RAID相关实现的开发者来说,对MD源代码进行解读是一个非常有价值的学习和探索过程。 ### 回答3: mdlinux内核中的一个重要模块,支持多种存储设备,包括硬盘、闪存和网络存储等。如果想要深入了解linux内核的运行机制,就必须掌握md源代码。下面就对md源代码进行解读md源代码的核心是md.c文件。这个文件中定义了md模块的核心函数,包括md_init()、md_run()和md_stop()等。其中md_init()函数主要负责初始化md模块的各个子系统,包括raid核心、hotplugging、proc文件系统和sysfs文件系统等。md_run()函数则是md模块的主要循环,负责轮询设备状态并执行相应的IO操作。md_stop()函数则是md模块的关闭函数,用于释放模块占用的各种资源。 除了md.c文件外,md模块的代码还包括一些关键性质的文件,例如mddev.c、md.h和md_u.h等。其中,mddev.c文件定义了md设备的数据结构,包括磁盘阵列、线性设备和伪设备等。md.h和md_u.h文件则分别定义了用户空间和内核空间的md控制接口,包括创建和删除设备、添加和删除磁盘等。 在理解md源代码时需要注意的是,md模块涉及到多个子系统,包括块设备、文件系统和RAID等,因此需要对这些子系统的工作原理和相互关系有清晰的理解。同时,由于md模块的代码相当复杂,需要仔细地阅读和调试,才能完成内核的定制和优化工作。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值