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