linux核心md原始碼解讀 一

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.