1. 程式人生 > >獻給新手,如何閱讀Linux原始碼(轉)

獻給新手,如何閱讀Linux原始碼(轉)

常常有人問:我想學習核心,需要什麼基礎嗎?Linus Torvalds本人是這樣回答的:你必須使用過Linux。 這個……還是有點太泛了吧,我想下面幾個基礎可能還是需要的,儘管不一定必需:
  1, 關於作業系統理論的最初級的知識。不需要通讀並理解《作業系統概念》《現代作業系統》等鉅著,但總要知道分時(time-shared)和實時(real-time)的區別是什麼,程序是個什麼東西,CPU和系統匯流排、記憶體的關係(很粗略即可),等等。
  2, 關於C語言。不需要已經很精通C語言,只要能熟練編寫C程式,能看懂連結串列、散列表等資料結構的C實現,用過gcc編譯器,就可以了。當然,如果已經精通C語言顯然是大佔便宜的。
  3, 關於CPU的知識。這塊兒可以在學習核心過程中補,但這樣的話你就需要看講解很詳細的書,比方後面將會提到的《情景分析》。你是否熟悉 Intel 80386 CPU?嘗試著回答這幾個問題來判斷一下:1)說出80386的中斷門和陷阱門的區別;2)說出保護模式與真實模式的區別;3)多處理器機器上,普通的讀-改-寫回一塊記憶體這樣的動作,為什麼需要特殊的手段來保護。等等。講解基於其它CPU的Linux核心的書,目前好象只有一本《IA64Linux核心:設計與實現》──也還是Intel的,其它都是講解基於IA32的。
  以上算是知識方面吧,如果還要再補充一條,我想就是:動手編譯過核心。

  好了,我們接下來走。好多人裝上Linux之後,第一件事找到核心原始碼所在的路徑,開啟一個C程式檔案,開始嘩嘩譁翻頁,看看大名鼎鼎的Linux核心程式碼到底長啥模樣──然後關閉。這是可理解的,但卻不是學習的方法。剛開始,必須從讀書入手。[color=red]至少要對核心有一個Overview 之後,才有可能帶著問題去試圖閱讀原始碼本身。 [/color]下面就講一下我讀過的幾本書:
  1, 《Linux核心設計與實現》,英文名Linux Kernel Development(所以有人叫它LKD),機械工業出版社,¥35, 美國Robert Love著,陳莉君譯者。 評說:
  此書是當今首屈一指的入門最佳圖書。作者是為2.6核心加入了搶佔的人,對排程部分非常精通,而排程是整個系統的核心,因此本書是很權威的。這本書講解淺顯易懂,全書沒有列舉一條彙編語句,但是給出了整個Linux作業系統2.6核心的概觀,使你能通過閱讀迅速獲得一個overview。而且對核心中較為混亂的部分(如下半部),它的講解是最透徹的。對沒怎麼深入核心的人來說,這是強烈推薦的一本書。
   翻譯:翻譯水平、負責任程度都不錯,但是印刷存在一些錯誤。買了此書的朋友可以參考我在Linux高階應用版的《Linux核心設計與實現中文版勘誤》:

http://bbs.chinaunix.net/forum/viewtopic.php?t=541234
另外,此書2005年有了第二版,目前尚無中譯本面世。我就是對照著2nd-en勘誤1st-cn的。

  2, 《Linux核心原始碼情景分析》上、下。毛德操、胡希明著,浙江大學出版社,上冊¥80,下冊¥70. 評說:
  本書是基於2.4.0核心的,比較早,也沒聽說會出第二版。上冊講解記憶體管理、中斷、異常與系統呼叫、程序控制、檔案系統與傳統Unix IPC;下冊講解socket、裝置驅動、SMP和引導。關於這套書的評價褒貶不一,我個人認為其深度是同類著作中最優秀的。本書基於Intel IA32體系,由於厚度大,很多體系上的知識都捎帶講解了,所以如果你想深入瞭解核心的工作機制而又不非常熟悉Intel CPU的體系構造,本書是最合適的。缺點是:版本較老,沒有TCP/IP協議棧部分(它講的socket只是Unix域協議的),圖表太少,不適合初學者入門。還有就是對學生朋友來說,可能書價偏高,這樣的話可以考慮先買上冊,因為上冊是核心部分,下冊一大部分都在講具體PCI/ISA/USB裝置的驅動。
  翻譯:沒什麼翻譯,作者是國人,而且行文流暢。本人書桌上諸多計算機經典圖書當中,這套是唯一又經典又無閱讀障礙的。
  www.linuxforum.net核心版好多朋友已經把這書讀到六七遍了,我很慚愧,上冊差不多讀熟了,下冊就SMP部分還看過──但這就花費了整整1年的時間,還有好多弄不懂的。這裡順便說明另外一個研究核心常見的誤區:目標太龐大。要知道Linux核心(最新的2.6.13)bzip2壓縮之後 37M,解壓縮之後244M,根本不是哪個人能夠吃透的。即使是核心的核心開發團隊中,恐怕也只Linus Torvalds、Alan Cox、 David Miller、Ingo Molnar寥寥數人會有比較全面的瞭解,其它人都是做自己專門的部分。 我自己來說,目前已經決定放棄記憶體管理的全部(slab層、LRU、rbtree等)、檔案系統部分、外設驅動部分,暫時也沒打算弄IA32以外的其它體系的部分。

  3, 《深入理解Linux核心》第二版。中國電力出版社。也是陳莉君譯。此書是Linux核心黑客在推薦圖書時的首選。 評說:
  此書C版的converse兄送了我一本第一版,因此就沒買第二版,比較後悔。因此只就第一版說一說,第一版基於2.2,第二版2.4 。我見 O’Reilly官方主頁上說第三版的英文版將於2005年11月出版,也不知咱們何時才能見到。此書圖表很多,形象地給出了關鍵資料結構的定義,與《情景分析》相比,本書內容緊湊,不會一個問題講解動輒上百頁,有提綱挈領的功用,但是深度上要遜於《情景分析》。

  4, 其它的幾本書。市面上能見到的其它的Linux核心的圖書,象《Linux裝置驅動程式》、《Linux核心原始碼完全註釋》以及新出的《Linux核心分析及程式設計》等。
  《Linux裝置驅動程式》第二版是基於2.4的,中文翻譯不錯,中國電力出版。這書強調動手實踐,但它是講解“裝置驅動”的,不是最核心的東西,而且有些東西沒硬體的話無法實踐,可能更適合驅動開發的程式設計師吧,不太適合那些For fun and profit的人。此書有第三版英文版,東南大學出版社影印,講解2.6的,行文流暢,講解的面也比第二版更廣泛,我讀過其中關於同步與互斥、記憶體分配的部分,感覺很不錯。
  《Linux核心原始碼完全註釋》(機械工業出版社)是同濟大學的博士生趙炯的著作,講解0.1Linux核心,我沒買也沒看,有看過的朋友說一說。
  《Linux核心分析及程式設計》(電子工業出版社)是剛剛出版的,國人寫的,講解2.6.11 。很多人說好,但有人說不夠系統,我沒買,不敢評說。
  還有一本清華出的《Linux核心程式設計指南(第三版)》,原書應該是好書,但是翻譯、排版十分糟爛,脫字跳行,根本沒法看,我買了一本又扔掉了。

  5, 其它資源。 TLDP(The Linux Documentation Project)有大量文件,其中不少是關於核心的,有些是在國外出版過的,象《Linux Kernel Interls》《The Linux Kernel》《Linux Kernel Module Programming Guide》等,作者都是親身參加開發的人,著作較為可信。
Http://www.linuxforum.net
  中國Linux論壇的核心版。該版是研究核心的中文Linux社群中水平最高的,有很多專家級別的牛人,強烈推薦去學習一下(但建議不要問太過分簡單的問題,人家脾氣再好也會煩的^_^),它的置頂貼簡直是一個包羅永珍的FAQ,精華區也有很多資料。只可惜太過曲高和寡,人氣不是很旺。

  6, 一本不是講解Linux的書:《現代體系結構上的Unix系統:核心程式設計師的SMP和Caching技術》,人民郵電出版社2003版,定價¥39. 本書雖然不是講解Linux,但是對所有Unix核心都是適用的,適合對SMP和CPU的Cache這些組成原理知識不是很熟的朋友,而且是很多國外牛人推薦的書。中文版翻譯非常負責。

  還有個很重要的問題:怎樣瀏覽核心原始碼。有的朋友喜歡在Windows上工作,用Source Insight;有的在Linux,用Source Navigator;還有專門瀏覽原始碼的軟體,象lxr (Linux Cross Reference);還有用ctags/ectags/cscope等,這些都是很優秀的軟體。我個人用Vim + ctags瀏覽(參考了www.linuxforum.net核心版wheelz大俠的文件,)。

  此外,前邊已經提到的一個重要的問題是:你研究核心的目的是什麼, 開發? 樂趣?如果是開發,而且是國內做開發,把kernel API熟悉一下就差不太多了(你也知道國內的水平有多差),比方說copy_from_user()、kmalloc()函式等,kernel API在Internet上找得到,編譯核心時也可以用 DocBook生成(具體請參考核心原始碼包下的README檔案);如果是研究,那就差別很大了,需要下很大的苦功:會用kmalloc()絕不說明你懂得Linux核心的虛存管理子系統,正如同會講漢語不說明你懂中國文化一樣。

相關推薦

獻給新手如何閱讀Linux原始碼()

常常有人問:我想學習核心,需要什麼基礎嗎?Linus Torvalds本人是這樣回答的:你必須使用過Linux。 這個……還是有點太泛了吧,我想下面幾個基礎可能還是需要的,儘管不一定必需:   1, 關於作業系統理論的最初級的知識。不需要通讀並理解《作業系統

獻給新手如何閱讀Linux原始碼

常常有人問:我想學習核心,需要什麼基礎嗎?Linus Torvalds本人是這樣回答的:你必須使用過Linux。 這個……還是有點太泛了吧,我想下面幾個基礎可能還是需要的,儘管不一定必需:    1, 關於作業系統理論的最初級的知識。不需要通讀並理解《作業系統概念》《現代作業系統》等鉅

「Do.016」AS不用編譯閱讀Android原始碼

首發公眾號:Android程式設計師日記 作者:賢榆的榆 如果你覺得有幫助歡迎關注、讚賞、轉發 閱讀時間:2616字 6分鐘 寫在前面 很早就像自己搭一個Android原始碼閱讀環境,折騰了幾次無果,就擱置了。最近有點閒暇時間,再加上也覺得是時候更深刻的認

linux-Tcp IP協議棧原始碼閱讀筆記【

0 推薦 一.linux核心網路棧程式碼的準備知識 1. linux核心ipv4網路部分分層結構: BSD socket層: 這一部分處理BSD socket相關操作,每個socket在核心中以struct socket結構體現。這一部分的檔案 主要有:/net/socket.c /net/protoc

使用VMware將Linux裝在物理硬盤上開機即可進入Linux

width system 成了 保存 2.6 圖片地址 init bold boot 目錄(?)[-] 本文目的 具體操作 1 軟件準備 2 安裝 21 對硬盤操作 22 創建虛擬機並安裝 23 使用Grub引導Linux 1. 本文目的 適合於

linux驅動current,引用當前進程及task_struct(

結束運行 可執行文件 頁面 window contex round save () 喚醒 盡管內核模塊不象應用程序一樣順序執行, 內核做的大部分動作是代表一個特定進程的. 內核代碼可以引用當前進程, 通過存取全局項 current, 它在 <asm/current.h

論文閱讀獻給新手的深度學習綜述——Recent Advances in Deep Learning: An Overview

這篇綜述論文列舉出了近年來深度學習的重要研究成果,從方法、架構,以及正則化、優化技術方面進行概述。本人認為,這篇綜述對於剛入門的深度學習新手是一份不錯的參考資料,在形成基本學術界圖景、指導文獻查詢等方面都能提供幫助。 論文地址:https://arxiv.org/pdf/1807.08169v1

linux原始碼閱讀--cmdline.c

簡單的命令列引數解析 static int get_range(char **str, int *pint, int n) { int x, inc_counter, upper_range; (*str)++; upper_range = simple_strtol((*str), NU

Linux 原始碼閱讀 程序管理

Linux 原始碼閱讀 程序管理 版本:2.6.24 1.準備知識 1.1 Linux系統中,程序是最小的排程單位; 1.2 PCB資料結構:task_struct (Location:linux-2.6.24\include\linux\sched.h) 1 struct

Ubuntu18.04 桌面美化方案常見問題寫給初次接觸Linux-Ubuntu的新手

                                                     Ubuntu 18.04 注意事項,避免盲目錯誤操作浪費時間,一定要注意 ! 千萬不在認為在

關於linux核心模組程式設計時多個原始碼檔案Makefile書寫的問題

在學習核心模組程式設計的時候遇到了一些由於Makefile書寫不正確導致的問題。一個.c原始檔的Makefile按照網上的大部分資料介紹那樣是沒有問題的,多個原始檔的核心模組程式設計時,就出現問題了,自己糾結了半天,最後查資料、請教大神才搞定的。把過程和解決方法貼出來,供

使用Qt Creator作為Linux IDE實現Redis原始碼編譯和斷點除錯

2、原始碼準備 我們解壓原始碼,先使用gcc編譯,主要的目的是把deps庫編譯出來 [[email protected] redis_study]# chmod -R 777 re

Linux原始碼解析-記憶體描述符(mm_struct)(

轉自 1.簡介 一個程序的虛擬地址空間主要由兩個資料結構來描述。一個是最高層次的:mm_struct(定義在mm_types.h中),一個是較高層次的:vm_area_structs。最高層次的mm_struct結構描述了一個程序的整個虛擬地址空間。較高層次的結構vm

向大神看齊: 如何閱讀大型前端開源專案的原始碼()

作者簡介 Daniel 螞蟻金服·資料體驗技術團隊轉自: https://github.com/ProtoTeam/blog/blob/master/201805/3.md目前網上有很多「XX原始碼分析」這樣的文章,不過這些文章分析原始碼的範圍有限,有時候講的內容不是讀者最關

Linux原始碼包裡有個scripts資料夾裡面放的東西起什麼作用?

1.核心構建分兩塊,配置和構建,先要把配置系統建起來然後去構建核心。scripts 目錄下的檔案是用於配置系統構建的程式原始檔。在一級Mafile中有*config目標,它代表所有和配置有關的目標,這個目標的動作就是進入 scripts目錄去建配置系統  ,根據不同的使用者

04Django Form原始碼閱讀

  .wiz-editor-body .wiz-code-container { position: relative; padding: 8px 0; margin: 5px 25px 5px 5px; text-indent: 0; text-align: left } .CodeMirror

從cvLoadImage開始--OpenCV原始碼閱讀之三[]

cvSaveImage/cvLoadImage函式用於儲存和讀取影象,兩者的結構基本相似。下面我們主要分析cvSaveImage函式的實現。cvLoadImage函式位於"OpenCV/otherlibs/highgui/loadsave.cpp"檔案: CV_IMPL Ip

【轉發】centos 7開啟FTP以及新增使用者配置許可權只允許訪問自身目錄不能跳根目錄 linux下ftp配置檔案詳解

1.切換到root使用者 2.檢視是否安裝vsftp,我這個是已經安裝的。 [[email protected] vsftpd]# rpm -qa |grep vsftpd vsftpd-3.0.2-11.el7_2.x86_64 3.如果沒有發現,則安裝。 yum ins

建立Linux 0.11完整的系統linux 0.11真正起來!方便大家學習。 中文版權所有: OldLinux論壇 

為了配合Linux 0.11核心工作原理的學習,本章介紹了利用PC機模擬軟體和在實際計算機上執行Linux 0.11系統的方法。其中包括核心的編譯過程、PC模擬環境下檔案的訪問和複製、引導盤和根檔案系統的製作方法以及Linux 0.11系統的使用方法。最後還說明了如何對核心程

作為一個新人怎樣學習嵌入式Linux?(自韋東山)

>和第1期視訊吧,別擔心,不用花錢。照著視訊把硬體相關的實驗做了,這些概念就清楚了。我還沒有發現第2套講這些概念的書或視訊,允許我盲目吹噓一回。        對於bootloader,我學習時是先看了,然後自己寫程式把各個硬體的實驗都做了一遍,比如GPIO、時鐘、SDRAM、UART、NAND。把它們