1. 程式人生 > >Linux內核(15) - 方法論

Linux內核(15) - 方法論

地球 pow body 2.6 不同 世紀 定義 進程 虛擬

什麽是方法論

方法論給人的第一感覺就是它是一個玄之又玄的很朦朧的東西,顯然,學習本身就是一件很玄乎的事情,有些人整天瀟瀟灑灑沒見怎麽用心就能夠獲得很好的成績,而有些人則相反,投懸梁錐刺骨也還是成績平平收獲平平。這裏面很大一部分的原因就是方法論。

當然因為每個人的情況並不相同,也就沒有這樣一個標準的方法論存在,所以說起來就很容易成為一場大忽悠。就像任誌強先生前陣子做賣房方法論的演講時,因為太像一場忽悠,就被聽眾扔了鞋。

那麽什麽是方法論?很多人都應該會很自然的回答方法論就是方法,這也沒錯,那麽這裏為什麽要使用方法論這個詞,不是我非要在這裏故弄玄虛,這都要怪笛卡兒在17世紀的某一天,閑極無聊寫了這麽一本書,書名就叫《方法論》,在這本目前來說絕大部分人都不知道的書裏將方法上升到了理論的高度,於是就有了方法論。

這本書無形中影響了一代又一代人,比如今天的鳳姐,如果以後有一天鳳姐出了回憶錄,我們去研究她光輝的成名之路時,就會發現,方法論對她以及她後面的團隊的巨大影響。因此說方法論對於成就一件事情來說是很重要的,對於我們的內核學習也是如此。

笛卡兒在他的書裏將方法論,也就是研究問題的方法歸納為簡單的一句話,就是“復雜問題要簡單化”。就是說要將復雜的問題分解為很多個簡單的小問題,一個個的分開解決。這句話當然可以借鑒運用到內核的學習上,不過需要做些改動,不是分解為多個簡單的小問題,而是將內核學習這麽一件很復雜的事情劃分為由低到高多個不同的層次,每一層次都有自己需要達到的目標和要求。這也是我自己認為的內核學習的方法論,也就是認識內核的方法。

認識內核:內核的基本面

學內核最好把它看成一個鮮活的生命體,而不僅僅是一堆死氣沈沈的代碼。具體一點來說,我們在學習與瀏覽內核的實現時,可以將它看成是現實世界的映射。內核是由現實中的人寫出來的,因此不管是有意還是無意,都會不可避免的包含了一些自己的現實感情,我們研究內核時可以體會下這種脈絡,這種隱藏在代碼背後的哲學。比如,我們可以認為內核是個大世界,一個個進程就是這個世界中的一個個生命體,進程管理和調度就是這個大世界中的權力機關,內存是進程的家,內核的目標就是要做到使每個進程都居者有其屋。

既然要把內核看成是一個鮮活的個體,那麽我們認識它的第一件事就是了解它的一些基本信息,就像我們人與人之間互相認識首先也是通過個人的基本信息一樣。

首先從名字開始,kernel在字典中主要有兩種定義,一種是“軟的,一個堅果可食用的部分”,對Linux kernel來說,當然適用的是第二種定義:“某個東西的核心部分”。所以從廣義上來說,linux kernel就是linux操作系統裏最為核心的部分,而從狹義上來說,它不過就是Linus那群人人寫的那點兒代碼。

當然,這點兒代碼是相當復雜的,單單從代碼量上來說,早已經突破了千萬級。從結構上來說,也早就不是一個人窮自己一己之力就能夠全部理解的了。所以,學內核切忌求大求全,選擇一點研究的足夠深入就很不容易了。

然後是kernel的年齡,kernel又不是一個懷春的少女,所以它的年齡並不需要保密,從1991年誕生開始,在去年剛剛舉行了它自己的成人禮,進入了成熟發展期。

就像我們人有自己的青春期、中年期等一樣,kernel相應的也有很多不同的版本號,不過不同的是,我們的青春期一去就不復返了,kernel不同的版本號卻是共存的。

很多年以來,內核的版本都是以X.Y.Z這3個數字的形式分配的,中間的偶數Y代表穩定版,奇數Y代表了不穩定的開發版。所謂的穩定版本是指內核的特性都已經固定,代碼運行穩定可靠,不會再增加新的特性,要改進也只是修改代碼中的錯誤。而不穩定版本是指相對於上一個穩定版本增加了新的特性,還處於發展之中,代碼的運行不大可靠。

對於目前來說,2.6內核的發布已經持續了很長時間,那麽什麽時候將會推出2.7?Linus本人的回答是,不會有2.7,他不會再遵循舊的模式,新采用的模式會更好,不值得重復過去。他表示正在考慮新的編號方式,一種基於時間的版本號。比如用2008.7取代2.6.26,中間第二個數字代表年,2008年就是2.8,2009年的第一個版本就是2.9.1,之後2010年是3.0,等等。

最後不得不提到是那些眼花繚亂的發行版,內核與發行版的關系就類似那種雙生花,彼此互相依賴互相扶持共同成長。沒有那些發行版,內核就只能是束之高閣的一個貌似好看的玩具,並不能真正的走進我們的工作生活,而沒有內核,那些發行版就缺少了存在的地基,就只能是個豆腐渣工程。所以學內核前首先要會用linux,不能輕視發行版的使用。

認識內核:內核的內涵

認識了內核的外表之後,就需要認識內核的內涵,也就是內核的體系結構。

首先看第一張圖,它向我們傳遞了這樣的信息——內核將應用程序和硬件分離開來。內核一方面負責與計算機硬件進行交互,實現對硬件的控制,調度對硬件資源的訪問,另一方面為用戶應用程序提供一個高級的執行環境和訪問硬件的虛擬接口。

提供硬件的兼容性是內核的設計目標之一,幾乎所有的硬件,只要不是為其他操作系統所定制的,都可以得到Linux的支持。

與硬件兼容性相關的是可移植性,也就是在不同的硬件平臺上運行Linux的能力。從最初只支持標準IBM兼容機上的Intel X86架構到現在可以支持ARM、MIPS、PowerPC等幾乎所有硬件平臺,如此廣泛的平臺支持之所以能夠成功,部分原因在於,內核清晰地劃分為了體系相關部分和體系無關部分。因此也就有了第二張圖。

體系無關部分通常會定義與體系相關部分的接口,這樣,內核向新的體系結構移植的過程就變成確認這些接口的特性並將它們加以實現的過程。

同時,用戶應用程序和內核之間的聯系,一般是通過它和內核的中間層——標準C庫來實現,而標準C庫函數本身,則是建立在內核提供的系統調用基礎之上。通過標準C庫,以及內核體系無關部分與體系相關部分的接口,用戶應用程序和部分內核都成為可移植的。

因此更為準確的是第三張圖。其中,進程管理部分實現了一個進程世界的抽象,這個進程世界類似於我們的人類世界,只不過我們的世界裏的個體是人,而在進程世界裏則是一個一個的進程,我們人與人之間通過書信、手機、網絡等交通往來,而各個進程之間則是通過不同方式的進程間通信,我們所有人都在分享同一個地球,而所有進程都在分享一個或多個CPU。

在這個進程的世界裏,內存是重要的資源之一,就好似我們的土地。因此,管理內存的策略與方式,也就是內存管理是決定系統性能的一個關鍵因素。

Linux內核(15) - 方法論