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