Linux是開源的作業系統,其系統所有源代碼都是開放的,這對研究作業系統是十分友善的。
Linux核心發展至今,版本特别多,比較經典的是2.6核心。是以本文以研究 2.6核心為主。可是核心比較大,從哪裡入手是一個十分重要的問題。顯然,一開始就看核心源代碼是不切實際的,是可能被細節搞暈的。在計算機專業的課程中我們都學習過作業系統課程,對作業系統的大概功能有所了解,而那些linux核心的書也對linux核心架構作了整體上的介紹,這些都是基礎知識。也許我們沒有時間去研究清楚作業系統的每一個細節,但是我們卻可以研究我們感興趣的部分。
面對核心源碼,最直接的一個問題就是如何編譯核心,如何安裝新核心到系統中? 核心編譯安裝好後, 就可以加載運作了。而grub是如何加載核心的?grub是怎麼實作的?elf檔案格式是什麼樣的?進而引出程式的編譯、連結、加載等問題。研究一個開源程式的方法之一就是跟蹤調試程式,然而核心不是一般程式,不能直接調試,是以需要搭建核心調試環境。
作業系統分為程序管理、記憶體管理、裝置管理、檔案系統、網絡等部分,針對某一子產品學習時,又會提出更多的問題。研究某一确定子產品時,可以假定其他子產品是已知的,而不必要陷入其他子產品的細節中去。
研究核心的深度也各有不同,有以下四 級别:
- 隻看作業系統相關書藉,了解其原理,不看源碼。
- 在源碼中能找到對應子產品的實作,了解部分技巧與細節。
- 可以修改源碼以實作自己想要的功能。
- 可以在核心中實作一套獨立的系統。
自頂向下的研究核心:
如程序管理這一部分,本打算從CPU加電起到程序相關資料結構初始化,程序建立,程序排程這樣一步步研究,結果發現在對源碼一無所知的情況下,看程序初始化,又陷入了中斷、檔案系統、記憶體的初始化細節中。是以打算從程序排程 程序建立開始研究。
另外,程式=資料結構+算法。
先研究資料結構(task_struct)中各字段的作用,再研究排程算法,并分析對應源代碼,從宏觀上把握程序排程架構,再從細節上逐漸深究。
現在核心大多使用面向對象的思想,可以從對象的角度考慮問題。
核心代碼較多,搞清楚核心代碼組織的結構和原理。
核心設計思考:
為什麼這麼設計? 考慮了哪些因素? 有什麼要求?
怎麼設計? 這樣設計有什麼好處和壞處?
核心中的資料結構之間的關系:
同種資料結構之間如何組織?(樹,連結清單,有個連結清單的初始化的頭結點)
不同資料結構之間的關系?指針指向?用個數字辨別符,然後用hash表關聯數字與指針?
閱讀源碼的工具
核心源碼
GDB GDBTUI DDD跟蹤 source insight
SystemTap stap kdb
靜态閱讀
修改源碼驗證一些問題
寫一些應用
下面是Linux作業系統整體架構(圖檔來源于國嵌PPT中)
Linux核心架構