close

資料來源: http://doc.linuxpk.com/41499.html

 

  Linux0.01內核基本上分析完了,高版本的內核也看了一點。有一點心得與大家分享

  一下吧!這裡我並不打算說具體的技術方面的東西,而是針對讀內核的方法,談談自己

  的一點感受。

  我前段時間主要看的是0.01版本的內核。Linux0.01Linux"祖師爺"Linus完成的最早

  的一個Linux版本,其內核編譯後僅僅只有512K,麻雀雖小,五臟俱全,0.01包括了從軟

  盤啟動、檔案系統、控制台管理的作業系統完整功能,並提供了不少標準的使用者介面,

  具體有kernel, boot, fs, initmm等幾個部分,沒有網路部分。

  為什麼選擇Linux0.01?各位大蝦一看到0.01肯定直搖頭:哎呀,都什麼時代的東東

  了,有看的必要麼?筆者當初選擇0.01並沒有太多的想法,只是Tm-linux小組剛開始選

  擇的是0.01,於是就開始讀吧,現在仔細想想,讀Linux0.01對於初學者來說可能更容易

  上手些。可能有下面的幾個好處吧

  1)0.01的代碼量較小。很多同學都曾有成為Linux高手的欲望,也曾抱回若干磚頭書,但

  Linux的發展何其之快,而coder又是駭客型高手,往往堅持不了多長時間而中途放棄!

  2)0.01的代碼簡單而精簡(這個簡單當然是相對於後續版本而言的)。實際上0.01完成

  的就是一個作業系統的最初的要求,包括啟動,進程調度,記憶體管理等,而這些往往與

  硬體結合,在看高版本的內核時往往還沒有接觸到這些硬體知識,層層下調已經把你搞

  糊塗了。

  3)從低版本看更能看到技術進步的源動力,比如0.01的內核很小,其啟動代碼可以只放

  在一個磁區內,而後續版本的內核較大,無法放入一個磁區內,於是壓縮核心的裝入方

  法誕生了。再如記憶體管理,0.01的記憶體管理比較簡單,記憶體的申請釋放直接通過使用前申請,

  使用後釋放,但考慮以後的版本功能複雜,如何解決可能的"外碎片"問題,如何解決記憶體不足的問題,於是對後續版本採用的"夥伴演算法"

  ,slab技術,頁面守護進程有更好的理解。

  我說上面的這一些並非是為0.01做廣告啦,而是提醒一下讀內核可能遇到的問題:

  比如說層次複雜難以理清,代碼眾多不知主次,哪些是作業系統必需的,那些是為提高系

  統性能的等。

  看內核的目的是什麼,這是每個看內核的人都需要問問自己的問題。

  我想對於大多數初看內核的人來說,最重要的是解決從作業系統原理到一個實際操

  作

  系統的過渡,簡單一點說是作業系統到底是怎麼跑起來的。作業系統原理大家都學了,但

  一個作業系統到底是怎麼啟動的,所謂的保護模式到底是怎麼一回事,進程調度和切換

  到底是怎麼進行的,一個檔案系統具體應該怎樣,可能很多還是模糊的。通過看Linux

  核,這些問題可以得到清晰的解答。

  當然,一個有強大生命力的作業系統決不會僅僅滿足於能跑起來,她採用的眾多先進的

  技術使得她有出色的性能,對於以後的工程設計、程式設計還有類Unix下的系統開發會有很

  多幫助。

  鑒於Linux的強大技術實力,在很多領域都會遇到跟其採用技術相關的,如嵌入式領域,

  網路介面等等。理解了內核,當然在以後的開發中可以事半功倍。

  我當初讀內核的目的比較簡單,我就是想看看Linux是怎麼跑起來的,為什麼多個進程可

  以互不干擾的運行。

  我讀代碼的工具是用的source insight,可惜不能自動識別彙編.s文件,而0.01彙編文

  件不少。哦,講了這麼多,還沒進入主題:我的體會心得啦

  從哪部分開始讀,一般讀內核都建議從boot部分開始讀,這樣循序漸進,而且一般啟動

  部分似乎最神秘,最能滿足好奇心啦!不過我是從memory部分開始讀的,因為對邏輯地

  址到物理位址的轉換一直很模糊。從你感興趣的地方開始讀,在以後比較容易堅持。在讀內核的方法上,我建議"先橫後縱"

  在讀內核的方法上,我建議"先橫後縱"

  Souce insight的好處就是你點上某個函數,能自動顯示該函數的定義,這樣比較方便的

  跳入察看。對於剛開始看內核的人,我並不太建議一開始用這種方法。因為函數層層嵌

  套,等你下到最底層,早已忘了當初的調用的功能,建議只跳一層看看調用函數的注解

  或者簡單看看函數代碼猜測功能,做一些記號。

  我個人覺得,操作系同比較重要的是資料結構和演算法,演算法固然在程式中體現,而資料結

  構需要查看相關的標頭檔及相關的檔才能瞭解。所以剛開始時我還是採用一個檔一

  個檔的讀,即所謂的"",因為一個檔中的安排總是對特定的資料結構的一些操作

  ,你有更多的機會去理解各個主要資料結構的功能,包括結構中各個子項的含義。當然

  不要忘了寫注釋啦(雖然現在的理解可能並不準確)。

  在一個模組,如FS模組的各個檔都讀完之後,就採用了所謂的""了,你可以選擇一

  個比較重要的函數入手,進行層層跳入(或若干層)以領會各個資料結構間的有機關係

  。如fs模組涉及的主要資料結構有:超級塊,節點索引塊,資料索引塊,高速緩衝塊,

  檔等,在單獨理解各個相關檔後,可以從do_execve入手,看一個檔從輸入檔參

  數到最後執行的主要步驟,進而理解VFS和具體fs之間的介面。

  在每一個主要模組讀完之後,最後自己寫一份總結(書面總結啦),看看自己對這個模

  塊的把握。因為讀代碼往往是比較細緻的,可能專注於讀懂代碼本身而忽略了模組的功

  能和組織形式。這點我認為比較重要,所謂"牛吃草要反芻回味",讀代碼也許要在看完

  之後進行總結,這樣才能上升一個層次,真正理解其方法和結構的精妙之處。

  最後,談談看Linux內核需要的一些基礎吧

  1 Intel386硬體知識,比如各寄存器,TSS,段描述表(IDT,GDTLDT)等,段頁轉換

  機制等(高版本的Linux支援其他硬體體系,但對intelx86的比較熟一些吧)

  2 彙編指令,尤其是AT&T語法及其遷入式彙編,當初我初次看到諸如 代碼:

  __asm__("std ; repne ; scasw\n\t"

  "jne 1f\n\t" "movw $1,2(%%edi)\n\t"

  "movw $1,2(%%edi)\n\t"

  "sall $12,%%ecx\n\t"

  "movl %%ecx,%%edx\n\t"

  "addl %2,%%edx\n\t"

  "movl $1024,%%ecx\n\t"

  "leal 4092(%%edx),%%edi\n\t"

  "rep ; stosl\n\t"

  "movl %%edx,%%eax\n"

  "1:"

  :"=a" (__res)

  :"0" (0),"i" (LOW_MEM),"c" (PAGING_PAGES),

  "D" (mem_map+PAGING_PAGES-1)

  :"di","cx","dx");

  這樣的一條彙編語句感到頭腦發脹,不過瞭解其格式後,多看就習慣了。

  3 作業系統的基本知識,對於作業系統的一般理解,這個大家都有吧!

  4 一本或幾本Linux內核的參考書,有參考書總要好得多,畢竟很多資料結構不用自己

  去猜,我在讀001感覺有很大不同,很多地方只能猜,不過還是有用的。至於Linux

  核的書已經很多了,到都樂去看看就知道了

  5 恒心+毅力:這是最重要的一點,初始的興趣往往會被遇到的困難一掃而光,再加上

  其他雜七雜八的事情,堅持確實很困難。當初Tm-linux組剛開始參加內核分析的人不下

  幾十,但堅持到底的也就寥寥數人(這只是0.01哦)

  6 跟別人多多交流,畢竟個人能力有限,通過交流,可以增進知識,我很鼓勵書面的

  交流,雖然可能需要花費一些時間來寫,因為書面的東西以後可查,而書面的跟別人交

  流總希望正確一點,少犯錯誤啦。這一點西安交大做得比較好,組織了Linux內核論壇,

  隔一段時間聚會交流一次,每次有一主題,先有人主講,然後大家互相討論。

  這些你有些沒有嗎,那麼恭喜你啦,因為通過讀內核你就可以增加這方面的知識和經驗

  了。

  讀內核也不是最終目的,對自己在嵌入式系統的開發,或Linux"運用自如",或者實現

  自己的作業系統,那才是"劍出鞘時"

  估計成電讀Linux內核的人不少,只是大家交流比較少,我想交流還是很重要的,雖然牛

  人從來都不是問出來的,但具體問題通過交流可以增加理解,提高認識。很願意也鼓勵

  大家通過各種方式交流,雖然我不是大牛(也不是小牛啦J),很願意通過bbsEmail

  或其他方式進行交流。

  囉嗦了這麼多,希望自己的一點見解能對大家有所啟發,也希望成電湧現更多的Linux牛人啦!

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 shshen 的頭像
    shshen

    The Footsteps of a Cat

    shshen 發表在 痞客邦 留言(0) 人氣()