Linux內(nèi)核分析的過程,是對自己肯定,否定,再肯定并不斷重復(fù)這個循環(huán)的過程。作為coder,唯一的快感就是有一種自我肯定的得意。然而這個過程很快會被無情的打破,因為這么龐大的內(nèi)核,我們始終有一種盲人摸象的茫然。
內(nèi)核分析課程結(jié)束了,但是Linux內(nèi)核分析的路還遠(yuǎn)遠(yuǎn)沒有結(jié)束。經(jīng)過這么久的學(xué)習(xí),我們大概摸到了Linux內(nèi)核學(xué)習(xí)的框架以及方法。
Linux內(nèi)核被內(nèi)核黑客優(yōu)化的如此精妙,以至于我們在驚嘆于其中的某一點而走火入魔不能自拔,忘記了我們此行的目的。一葉障目是很可怕的,不能像一顆石子一樣丟盡了水中就沉了下去,要學(xué)會起伏,要蕩出漣漪。
細(xì)細(xì)回味,自己究竟學(xué)到了什么呢?曾經(jīng)想,要認(rèn)真的學(xué)習(xí)Linux內(nèi)核,然而并沒有兌現(xiàn)自己之前的承諾,由于各種事情的的耽擱,到后面也懈怠了。
Linux內(nèi)核以匯編一個簡單的C程序引發(fā)的思考鋪展開來的。其中深入的了解了函數(shù)調(diào)用的機制,堆棧的使用。
當(dāng)然我們并不滿足于此,我們胸懷的是Linux內(nèi)核,是整個世界,于是我們又學(xué)習(xí)了基礎(chǔ)的linux內(nèi)核代碼mykernel內(nèi)核代碼深度剖析,名字起的唬人,至于深度夠不夠,還要各位看官來評價。
最初的的時候,會為了某一點的實現(xiàn)原理而細(xì)致的查資料,費盡心思的思考,到底為什么會這樣,這樣對不對,與同學(xué)們討論。- 于是便有了錯誤的結(jié)論-mykernel-調(diào)度上下文ebp作用,錯誤的結(jié)論讓各位見笑了,幸虧被帶了回來,但終究自己對那一部分有了可能最深入的理解。
真正地去學(xué)習(xí)Linux內(nèi)核代碼,是從Linux內(nèi)核的啟動過程初見開始的,學(xué)會了如何去用gdb跟蹤內(nèi)核的執(zhí)行流程,似乎也懂了一些Linux內(nèi)核啟動的的皮毛,不過大部分的時候都是亦步亦趨地跟著代碼的流程走,生硬地翻譯代碼的意思,并不能聯(lián)系上下文的含義。
嗯,開始偷懶了,在Linux系統(tǒng)調(diào)用窺探以及Linux系統(tǒng)調(diào)用始末中,選了一個不需要任何參數(shù)的API getpid(),我深深地佩服自己的機智,可是后面的劇情卻和預(yù)想不符。在menuOS中使用API間接地進行系統(tǒng)調(diào)用的時候,發(fā)現(xiàn),只有第一次的API使用能進入系統(tǒng)調(diào)用。有句話怎么說來著,自己作的死,含著淚也要作完。沒辦法,拿來主義唄,于是有了似懂非懂的姊妹篇Linux系統(tǒng)調(diào)用始末續(xù)...,各位看官,當(dāng)笑話看看就行。這個本是牽強之解,雖然后面關(guān)于getpid的真正原因已經(jīng)找到,但是由于自己的懶惰也就不了了之。
不論酸甜苦辣,生活還是要繼續(xù)的,Linux創(chuàng)建進程的坎坷之路寫出來了,完全看得出我的敷衍,思路的空洞盡顯文字的匱乏,取而代之的是整篇的圖片。
可執(zhí)行程序,是怎么“動”起來的算是一個轉(zhuǎn)折點吧,可以看到的是,提出的凈是問題,卻不見相應(yīng)的答案。還好的是,也算是磕磕絆絆的了解了ELF的執(zhí)行方式。水是很深,不過愿意花時間去看些其他的資料,還是能弄地更透徹。不論什么,總要有取舍吧。
最后一次作業(yè),進程的切換和系統(tǒng)的一般執(zhí)行過程,又恢復(fù)了以前的“硬解程序”的風(fēng)格,真是諷刺,也許這就是首尾相呼應(yīng)吧。
Linux內(nèi)核對我們來說,像是海。以前也許只是聽過海很藍很大,現(xiàn)在自己也能站在海邊眺望。
不管怎么說,對整個Linux的框架也有所了解,可以自己去征服自己喜歡的領(lǐng)域了。