Linux核心「問題門」 學習問題 經驗集錦

2021-09-07 16:52:35 字數 4732 閱讀 1832

陳憲章說:「學貴有疑,小疑則小進,大疑則大進。疑者,覺悟之機也,一番覺悟一番長進。」

培根說:「多問的人將多得。」

還在學校的時候導師在激情講演之後對著會議室裡形態各異但均靜默不語的我們痛心疾首的說:「會提問題很重要啊,同志們!不會提問題怎麼有資格做研究!」

這樣鏗鏘有力的訓誡今日想起仍覺深受刺激,於是就要不可避免得要做出一些反應來。不過一是因為咱這年代還沒有非主流的說法,二是因為也沒有馮仰妍同學的性別優勢,不可能受到刺激就整出個門來。咱能夠做到的最大反應也就是在這裡開貼專門****核心學習的相關問題,為了稍微增加那麼一些廣告效應,就稱為「問題門」吧。

使用「問題門」的稱呼,一是內心裡潛藏的那點低階趣味想去沾點近些年層出不窮各種各樣的「門」的仙氣,二是在核心的學習過程中的確實實在在的存在著這樣的乙個「門」,橫亙在我們的面前,跨過去便海闊天空是另一番世界,但卻是讓無數人競折腰,百思不得其鑰匙。

另外,這個「問題門」也算是為拙作《linux核心修煉之道》製作的乙個小插曲,以感謝精華篇發布過程中很多朋友的關心與支援,希望通過對大家核心學習過程中遇到的問題與經驗心得做一番展示,來幫助還在門外的朋友尋找到這扇門的鑰匙。

提出你的問題,不要「陪公子讀書」,祝早日「入門」!

2010329日更新

問題門6回:研究核心原始碼的切入點在**,或者說從哪個模組開始研究對新手比較適合,是否有一些必讀的基礎型的模組源**?(roger_jin提出)

fudan_abc的回答:

沒有那些所謂的必讀的基礎性源**,呵呵,只要按照韓峰同志的那種態度去分析選定部分的源**,那些所謂基礎性的東東都會在分析過程中明白理解的。有上下文的幫助,反而會更容易理解那些之前理解不了的「基礎知識」。

至於切入點,沒有什麼特別的推薦,主要是依賴自己的興趣或者開發需要了。

2023年3月24日更新

fudan_abc的回答:

個人建議從新的核心開始,固然新核心的**非常龐大,但並沒有說非要求大求全,追求每個部分都要理解。

學核心忌諱求大而全,如果對哪部分比較感興趣,研究相關的原始碼和change就行了,當然仁者見仁智者見智,自己如果覺得從低版本開始更好更適合,那採用這種方式也未嘗不可,畢竟各人的路還是各自走的。

2023年3月23日更新

「問題門」第3回:通常,語言及其庫的學習分為幾個層次,1.熟練使用,2.閱讀原始碼,了解實現原理,3.對原始碼進行擴充套件。那麼linux kernel怎麼劃分層次,每個層次如何達到?(hust_tulip提出)

fudan_abc的回答:

問題中的三個層次對應到linux核心的學習上:「熟練使用」就是要能夠熟練的使用linux系統;「閱讀原始碼」就是指「學習核心就是學習核心源**」,必須勇敢的去學習核心原始碼;「對原始碼進行擴充套件」可以對應於融入核心社群,參與核心的開發。

這也正好在一定程度上鍥合了本書前言裡對核心學習劃分的幾個層次:全面了解抓基本,興趣導向深鑽研;融入社群做貢獻,堅持堅持再堅持。

——詳見修煉之道 之 前言

fudan_abc的回答:

首先是「全面了解抓基本」,這個層次,最好的書自然就是lkd和ulk了,這兩本書,一本提綱挈領,一本全面深入,都能很好的幫助全面的理解核心的整體機制。新人的話,一本lkd就足亦了。

第二個層次「興趣導向深鑽研」,這個層次就是要以核心原始碼為中心,選擇核心中乙個自己感興趣的部分,以韓峰同志對待日記的態度,嚴謹而細緻的仔細分析它的**,不懂的地方就通過社群、郵件列表或者直接發email給maintainer請教等途徑弄懂,切勿得過且過。至於這個層次的參考書麼,網路子系統的有《深入理解linux網路內幕》,記憶體管理的有《深入理解linux虛擬記憶體管理》,推薦看英文版,呵呵,usb的可以看我們的《linux那些事兒》,其它子系統的還沒注意到有什麼專門講解的,不過核心原始碼本身就是最好的參考資料了。

至於第三個層次「融入社群做貢獻」,就是要努力融入到核心的開發社群,經過前兩個層次的修煉,此時你已經不會再是社群中潛水小白的角色,而是會針對某個問題發表自己的見解。可以嘗試參與到核心的開發中去。相關資源有很多,詳細可以參考修煉之道精華篇的(9)核心學習資源

最後一層就是堅持了,不管遇到什麼挫折都不放棄,就像咱們的袁教授不管遭受到什麼樣的辱罵都要堅持不斷的發瘋一樣,有這樣的精神,何愁在linux核心的學習道路上修不成大道那?

2023年3月22日更新

「問題門」第1回:我是乙個初學者,兩眼一抹黑,我該如何學習核心?

fudan_abc的回答:

這個問題每個初學者都無法迴避,它非常之大,完全可以做為整個「問題門」的框架而存在,其他的各種問題都不過是在這個框架上裝飾和完善。

同時這個問題並沒有乙個標準的答案,只有一些學習的脈絡可以遵循,祝早日「入門」。

第一步:先會使用它。連linux是什麼、基本操作都不會就去研究核心,純屬扯淡,「門」都沒有。

第二步:看懂核心原始碼需要一些作業系統、c語言等的基礎。

第四步:要能夠動手配置編譯核心,還要基本看得懂核心中的kconfig和makefile檔案。

最後,記住:「學習核心,就是學習核心的源**,任何核心有關的書籍都是基於核心,而又不高於核心的。核心原始碼本身就是最好的參考資料,其他任何經典或非經典的書最多只是起到個輔助作用,不能也不應該取代核心**在我們學習過程中的主導地位。」

因此你要做得是選擇核心的乙個部分或子系統,以韓峰同志對待日記的態度,嚴謹而細緻得理解每一段**的實現,多問多想多記。切勿抱著走馬觀花,得過且過的態度。

「問題門」第2回:學習核心需要什麼基礎知識?

albcamus的回答:

(1)需要掌握作業系統理論的最初級的知識。

不需要通讀並理解《作業系統概念》《現代作業系統》等巨著,但總要知道分時(time-shared)和實時(real-time)的區別是什麼,程序是個什麼東西,cpu和系統匯流排、記憶體的關係(很粗略即可),等等。

(2)熟練使用c語言。

不需要已經很精通c語言,只要能熟練編寫c程式,能看懂鍊錶、雜湊表等資料結構的c實現,用過gcc編譯器,就可以了。當然,如果已經精通c語言顯然是大佔便宜的。

(3)了解cpu的相關知識,

linux核心學習經驗

1. 核心學習的心理誤區

心理上的問題主要有兩個,乙個是盲目,就是在能夠熟練使用linux之前,對linux為何物還說不出個道道來,就迫不及待的盲目的去研究核心的源**。重述linus的那句話:要先會使用它。

第二個就是恐懼。人類進化這麼多年,面對複雜的物體和事情還是總會有天生的懼怕感,體現在核心學習上面就是:那麼龐大複雜的核心**,讓人面對起來該情何以堪啊!

有了這種恐懼無力感存在,心理上就會去排斥面對接觸核心原始碼,寧願去抱著情景分析,蒐集各種各樣五花八門的核心書籍放在那裡屯著,看了又忘,忘了又看,也不大情願去認真細緻得瀏覽原始碼。

——詳見修煉之道精華篇(9)核心學習的心理問題

2. 學習核心就是學習核心的源**

學習核心,就是學習核心的源**,任何核心有關的書籍都是基於核心,而又不高於核心的。核心原始碼本身就是最好的參考資料,其他任何經典或非經典的書最多只是起到個輔助作用,不能也不應該取代核心**在我們學習過程中的主導地位。

3. 要抱著嚴謹細緻的態度分析核心原始碼

既然要學習核心原始碼,就要經常對核心**進行分析,而核心**千千萬,還前仆後繼的不斷往裡加,這就讓大部分人都有種霧裡看花花不見的無助感。不過不要怕,孔老夫子早就留給我們了應對之策:敏於事而慎於言,就有道而正焉,可謂好學也已。這就是說,做事要踏實才是好學生好同志,要遵循嚴謹的態度,去理解每一段**的實現,多問多想多記。如果抱著走馬觀花,得過且過的態度,結果極有可能就是一邊看一邊丟,沒有多大的收穫。

只要你使用這樣的態度開始分析核心,那麼無論你選擇核心的哪個部分作為切入點,比如usb,比如程序管理,在花費相對不算很多的時間之後,你就會發現你對核心的理解會上公升到另外乙個高度,乙個抱著情景分析,抱著0.1核心完全注釋,抱著各種各樣的核心書籍翻來覆去的看很多遍又忘很多遍都無法達到的高度。

——詳見修煉之道精華篇(6) 與精華篇(7) 分析核心原始碼如何入手?

4. 通過kconfig與makefile定位目標**

毫不誇張地說,kconfig和makefile是我們瀏覽核心**時最為依仗的兩個檔案。基本上,linux核心中每乙個目錄下邊都會有乙個kconfig檔案和乙個makefile檔案。 對於乙個希望能夠在linux核心的汪洋**裡看到一絲曙光的人來說,將它們放在怎麼重要的地位都不過分。

kconfig和makefile就是linux kernel迷宮裡的地圖。地圖引導我們去認識乙個城市,而kconfig和makefile則可以讓我們了解乙個kernel目錄下面的結構。我們每次瀏覽kernel尋找屬於自己的那一段**時,都應該首先看看目錄下的這兩個檔案。就像利用地圖尋找目的地一樣,我們需要利用kconfig和makefile來尋找所要研究的目標**。

——詳見修煉之道精華篇(5)kernel地圖:kconfig與makefile

Redis核心問題

幾個redis的核心問題 1 怎麼實現redis高可用集群?2 redis為什麼採用hash slot 而不用一致性hash演算法?3 redis分布式鎖存在什麼問題?怎麼解決?4 為什麼redis可以採用單執行緒?5 怎麼解決熱點資料問題?6 有哪些記憶體淘汰的方式?7 怎麼解決記憶體橫向擴充套件...

32,64核心問題

smitty system 是這樣的只要把aio開啟就可以了在smitty裡面就可以 你要安裝bos.64bit這個檔案集!首先用如下命令確定當前的所使用的kernel ls l unix lrwxrwxrwx 1 root system 21 may 06 2001 unix usr lib bo...

分析核心問題的工具

1.objdump objdump d l vmlinux txt objdump help 看常用的引數 d disassemble 2.gdb gdb tool 並不是只對 應用程式的 gdb vmlinux gdb c address 可以看到具體的函式和檔名 gdb disassemble ...