歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> linux內核md源代碼解讀 一

linux內核md源代碼解讀 一

日期:2017/3/3 16:17:36   编辑:Linux內核

最近花了一段時間認真地學習了一下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

Copyright © Linux教程網 All Rights Reserved