看興趣了,喜歡就多看點,不喜歡就少看點。讀內核讓人受益是肯定的,你寫linux應用程序,卻不懂linux那和寫VC沒啥區別,就像不懂JVM機制的JAVA工程師就肯定算不上精通。
『貳』 Linux內核源代碼導讀的圖書目錄
1.1 保護模式
1.1.1 分頁機制
1.1.2 分段機制
1.2 系統門
1.3 x86的寄存器
1.4 典型的PC系統結構簡介 2.1 AT&T與Intel匯編語法比較
2.2 gcc內嵌匯編
2.3 同步與互斥
2.3.1 原子操作
2.3.2 信號量
2.3.3 自旋鎖
2.3.4 RCU機制
2.3.5 percpu變數
2.4 內存屏障
2.4.1 編譯器引起的內存屏障
2.4.2 緩存引起的內存屏障
2.4.3 亂序執行引起的內存屏障
2.5 高級語言的函數調用規范 3.1 Linux內核編譯概述
3.2 內核編譯過程分析
3.3 內核鏈接腳本分析 4.1 BIOS啟動階段
4.2 實模式setup階段
4.3 保護模式startup_32
4.4 內核啟動start_kernel()
4.5 內核啟動時的參數傳遞
4.5.1 內核參數處理
4.5.2 模塊參數處理 5.1 內存地址空間
5.1.1 物理內存地址空間
5.1.2 虛擬地址空間
5.2 內存管理的基本數據結構
5.2.1 物理內存頁面描述符
5.2.2 內存管理區
5.2.3 非一致性內存管理
5.3 內存管理初始化
5.3.1 bootmemalloctor的初始化
5.3.2 頁表初始化
5.3.3 內存管理結構的初始化
5.4 內存的分配與回收
5.4.1 夥伴演算法
5.4.2 SLUB分配器 6.1 中斷的分類
6.2 中斷的初始化
6.2.1 異常初始化
6.2.2 中斷的初始化
6.2.3 中斷請求服務隊列的初始化
6.3 中斷與異常處理
6.3.1 特權轉換與堆棧變化
6.3.2 中斷處理
6.3.3 異常處理
6.4 軟體中斷與延遲函數
6.4.1 softirq
6.4.2 tasklet
6.5 中斷與異常返回
6.6 中斷優先順序回顧
6.7 關於高級可編程中斷控制器
6.7.1 APIC初始化 7.1 信號機制的管理結構
7.2 信號發送
7.3 信號處理 9.1 clocksource對象
9.1.1 clocksource概述
9.1.2 clocksource初始化
9.2 tickless機制
9.2.1 tickless由來
9.2.2 clockeventdevice對象概述
9.2.3 clockeventdevice對象的初始化
9.3 High-ResolutionTimers
9.3.1 High-ResolutionTimers管理結構
9.3.2 High-ResolutionTimers初始化
9.3.3 High-ResolutionTimers操作
9.4 時鍾中斷處理
9.4.1 時鍾維護
9.4.2 進程時間信息統計
9.5 軟體定時器
9.5.1 基本管理結構
9.5.2 初始化
9.5.3 注冊與過期處理 10.1 進程描述符
10.1.1 進程狀態
10.1.2 進程標識
10.1.3 進程的親緣關系
10.1.4 進程的內核態堆棧
10.1.5 進程的虛擬內存布局
10.1.6 進程的文件信息
10.2 進程的建立
10.2.1 建立子進程的task_struct對象
10.2.2 子進程的內存區域
10.2.3 子進程的內核態堆棧
10.2.4 0號進程的建立
10.3 進程切換
10.4 進程的退出
10.4.1 do_exit函數
10.4.2 task_struct結構的刪除
10.4.3 通知父進程
10.5 do_wait()函數
10.6 程序的載入 11.1 早期的調度器
11.2 CFS調度器的虛擬時鍾
11.3 CFS調度器的基本管理結構
11.4 CFS調度器對象
11.5 CFS調度操作
11.5.1 update_curr()函數
11.5.2 scheler_tick()函數
11.5.3 put_prev_task_fair()函數
11.5.4 pick_next_task()函數
11.5.5 等待和喚醒操作
11.5.6 nice系統調用 12.1 Ext2的磁碟結構
12.2 Ext2的內存結構
12.3 虛擬文件系統的管理結構
12.3.1 文件系統對象
12.3.2 VFS的超級塊
12.3.3 VFS的inode結構
12.3.4 VFS的文件對象
12.3.5 VFS的目錄對象
12.3.6 VFS在進程中的文件結構
12.4 文件系統的掛載
12.5 路徑定位
12.6 文件打開與關閉
12.7 文件讀寫
12.7.1 緩沖區管理
12.7.2 文件讀寫操作分析 13.1 准確定位同名宏及結構體
13.2 准確定位同名函數
13.3 利用linkmap文件定位全局變數
13.4 准確定位函數調用線索
13.5 SystemTap在代碼分析中的使用
『叄』 有沒有Linux內核源碼指導書籍
1.《Linux內核設計與實現》
本書重在原理。適合入門的最佳圖書。作者是為2.6內核加入了搶占的人,對調度部分非常精通,而調度是整個系統的核心,因此本書是很權威的。
2.《深入理解Linux內核》
此書比上一本多了些細節。是Linux內核黑客在推薦圖書時的首選。寫的比較簡單易懂,適合剛剛接觸LINUX內核的。
此書圖表很多,形象地給出了關鍵數據結構的定義,與《Linux內核源代碼情景分析》相比,本書內容緊湊,不會一個問題講解動輒上百頁,有提綱挈領的功用,但是深度上要遜於《Linux內核源代碼情景分析》。
3.《LINUX設備驅動程序(第3版)》
這書強調動手實踐!但它是講解「設備驅動」的,不是最核心的東西,而且有些東西沒硬體的話無法實踐,可能更適合驅動開發的程序員吧
其中關於同步與互斥、內存分配的部分,感覺很不錯。
4.《Linux內核源代碼情景分析》
好,很經典,是浙大教授毛德操寫的,可惜成書於2001年之後一直沒有更新。分上下冊。
很多是基於2.4內核講解的需要注意。如果學習的話也建議學習2.6,2.6跟2.4比發生了很多顯著改善,應該學習的。
全書內容博大精深,不是非常好懂,對細節問題描述比較清晰。但是感覺對內核的整體感覺不夠強。另外缺少網路部分的分析。覺得不是很適合初學者。
5.《Linux內核源代碼分析》
點評:面對中高級,這本書很好,對了解操作系統是一本不可多得的好書。
6. 《LINUXKERNEL技術手冊》
參考手冊,很薄,值得一看。
7.《深入Linux內核架構》
這本書針對的是比較新的內核版本2.6.24;內容比較全面,深入淺出。
如果沒有對Linux內核的初步結構的認識,那麼會看得比較吃力。建議可以一邊去翻在國內已經聞名已經久的四本Linux內核著作(《Linux內核原代碼情景分析》、《Linux內核設計與實現》、《深入理解Linux內核》、《Linux設備驅動程序》),再一邊看這本書,把這本書當作一個補充或者當作一個內核框架圖譜說明書來閱讀,收效會更好。
8.《Linux內核完全注釋》
主要描述和注釋了Linux0.11內核全部源代碼。對於初學Linux內核操作系統的人來講,該書能夠引領讀者快速入門,並且能全面了解一個簡單操作系統的工作機理。對於進一步學習現在的Linux內核具有非常大的指導作用。對於學習嵌入式應用的技術人員來講,通過《完全注釋》一書的學習也能迅速融入嵌入式應用領域。
9.《Orange S:一個操作系統的實現》
從只有二十行的引導扇區代碼出發,一步一步地向讀者呈現一個操作系統框架的完成過程。
『肆』 Linux內核源碼剖析的介紹
《Linux內核源碼剖析》是由樊東東,莫瀾編著,機械工業出版社於2011年1月1日出版的一本書籍。本書詳細論述了Linux內核2.6.20版本中TCP/IP的實現。書中給出了大量的源代碼,通過對源代碼的詳細注釋,幫助讀者掌握TCP/IP的實現。本書根據協議棧層次,從驅動層逐步論述到傳輸層,包括驅動的實現、介面層的輸入輸出、IP層的輸入輸出以及IP選項的處理、鄰居子系統、路由、套介面及傳輸層等內容,全書基本涵蓋了網路體系架構全部的知識點。特別是TCP,包括TCP連接的建立和終止、輸入與輸出,以及擁塞控制的實現。
『伍』 跪求強淫解答Linux網路內核源碼導讀問題。
定義結構體類型S 定義指向結構體S的指針P 把s的首地址賦值給指針
『陸』 怎麼開始讀Linux內核源碼
本人是一名 android display方面的工程師,結合實際工作經驗聊聊(觀點未必正確)
1. 准備工作:選擇什麼樣的版本,使用什麼樣的工具,這個需要考慮好。
如果是要參考書的話,kernel版本一般都應該選擇和書裡面同步的版本,不要去選擇最新的版本。因為最新的版本,各種改動比較多,反而對不上書了。
工具問題,你可以選擇windows下的source insight,也可以選擇linux下vim+ctags;
2. 第一遍瀏覽,我建議是先把kernel裡面的 start_kernel() 函數裡面的東西看清楚(不一定看明白),看看這個過程中,出現了什麼玩意,有哪些分支,並將分支初略的畫出一張圖來(當然,我自己並沒做到這一點,有點諷刺了)。
這裡面最重要的幾個地方,我個人認為,應該搞明白mole機制,它是怎麼通過編譯鏈接腳本放在特定的區域,然後系統起來後,又是如何去(按照什麼規則)去載入這些模塊;
應該搞明白sysfs系統,這個對於驅動和用戶空間的連接,有非常大的作用;
系統調用的open()應該走一遭,看看用戶空間到kernel之間參數是如何傳遞,又是怎麼通過vfs系統,把open的動作最終落實到某一個驅動的open()上去的;
對kernel啟動過程中,內存的分配演算法,是怎麼從夥伴演算法切換到最終的演算法上,也應該略有耳聞;對fork()函數的過程有所明白。
對kernel中基本的數據結構實現過程、鎖機制實現過程要有概念:
這一部分,總結起來,應該看的路線是:
start_kernel()
mole_init() 宏實現 // 看這個的時候,強烈建議,把makefile真正的意圖弄明白
open() 系統調用
fork() 系統調用
sysfs 框架實現
雙鏈表是如何實現的;
鎖最終是依靠什麼來保證的?(其實還是硬體來保證的)
對於數據結構和鎖這部分,就按照《Linux內核設計與實現》裡面的東西挨個挨個看。有興趣,自己也可以實現一個雙鏈表公共API,隨便哪個項目,一旦用上,直接拋進去,也未嘗不可。
第一遍瀏覽,竊以為,上面這幾部分看明白後,kernel的代碼對你依然很難,但已經不再有神秘的面紗。
後續,你想研究某個模塊,直接快速定位到那邊去就行。
3. 在完全用眼睛看完上面這部分內容後,kernel的路或許找到了,但是,萬里長征的第一步,並沒有邁出。這個時候,動手是很重要的了。
網上有各種方法,比如說,去kernel maillist裡面訂閱bug,然後自己試著解bug,此方法可取,而且是非常好。這里會遇到一個問題是,我們該怎麼調試?
有人是架各種虛擬機或者多台物理機一起開干,這個可以有。(但是本人動手能力確實有限,這個沒干成,本人是後面藉助了公司的開發板)
如果你也像我一樣,動手能力不足,如果你恰巧是手機或者類似手機開發公司的,你可以直接使用公司的開發機,通過串口log,將printk()的級別設置為3,把你需要的信息列印出來;
如果你是學生或者愛好者,可以花500左右人民幣,去淘寶上買一個開發板,也是帶串口的,所有的debug信息都是通過串口列印出來,保存到一個Log文件中,然後分析;
至於買什麼樣的板子,你可以隨便選擇,經典的s3c2440也行,高端點的樹莓派,或者全志什麼的,都可以。(不推薦全志,他們添加和修改硬體比較多,驅動也許不好搞)
4. 選擇你喜歡的模塊,進行深入研究,通過log列印,反復推敲,這個時候,bug是最好的導師。多關注kernel/Documents/ 目錄下的文檔。
你需要注意的是,一定要把該模塊無關的東西砍掉,否則,生命是有限的,而代碼是無限的。
最後一句話是,在用眼睛看完後,思考過後,還得動手,然後再思考。否則,只讀的話,僅能掃盲。
『柒』 Linux內核源代碼導讀的介紹
本書根據最新的2.6.24內核為基礎。在講述方式上,本書注重實例分析,盡量在討論「如何做」的基礎上,深入討論為什麼要這么做,從而實現本書的寫作宗旨:「授人以漁」。在內容安排上,本書包含以下章節x86硬體基礎;基礎知識;Linux內核Makefile分析;Linux內核啟動;內存管理;中斷和異常處理;系統調用;信號機制在類UNIX系統中;時鍾機制;進程管理;調度器;文件系統;常用內核分析方法。
『捌』 如何讀懂linux內核源碼
Linux的內核源代碼可以從很多途徑得到。一般來講,在安裝的linux系統下,/usr/src/linux目錄下的東西就是內核源代碼。
對於源代碼的閱讀,要想比較順利,事先最好對源代碼的知識背景有一定的了解。對於linux內核源代碼來講,我認為,基本要求是:1、操作系統的基本知識; 2、對C語言比較熟悉,最好要有匯編語言的知識和GNU C對標准C的擴展的知識的了解。
另外在閱讀之前,還應該知道Linux內核源代碼的整體分布情況。我們知道現代的操作系統一般由進程管理、內存管理、文件系統、驅動程序、網路等組成。看一下Linux內核源代碼就可看出,各個目錄大致對應了這些方面。Linux內核源代碼的組成如下(假設相對於linux目錄):
arch 這個子目錄包含了此核心源代碼所支持的硬體體系結構相關的核心代碼。如對於X86平台就是i386。
include 這個目錄包括了核心的大多數include文件。另外對於每種支持的體系結構分別有一個子目錄。
init 此目錄包含核心啟動代碼。
mm 此目錄包含了所有的內存管理代碼。與具體硬體體系結構相關的內存管理代碼位於arch/-/mm目錄下,如對應於X86的就是arch/i386/mm/fault.c 。
drivers 系統中所有的設備驅動都位於此目錄中。它又進一步劃分成幾類設備驅動,每一種也有對應的子目錄,如音效卡的驅動對應於drivers/sound。
ipc 此目錄包含了核心的進程間通訊代碼。
moles 此目錄包含已建好可動態載入的模塊。
fs Linux支持的文件系統代碼。不同的文件系統有不同的子目錄對應,如ext2文件系統對應的就是ext2子目錄。
kernel 主要核心代碼。同時與處理器結構相關代碼都放在arch/-/kernel目錄下。
net 核心的網路部分代碼。裡面的每個子目錄對應於網路的一個方面。
lib 此目錄包含了核心的庫代碼。與處理器結構相關庫代碼被放在arch/-/lib/目錄下。
scripts 此目錄包含用於配置核心的腳本文件。
Documentation 此目錄是一些文檔,起參考作用。
『玖』 如何查看 linux 內核源代碼
Linux的內核源代碼可以從很多途徑得到。一般來講,在安裝的linux系統下,/usr/src/linux目錄下的東西就是內核源代碼。
對於源代碼的閱讀,要想比較順利,事先最好對源代碼的知識背景有一定的了解。對於linux內核源代碼來講,我認為,基本要求是:1、操作系統的基本知識;2、對C語言比較熟悉,最好要有匯編語言的知識和GNU C對標准C的擴展的知識的了解。另外在閱讀之前,還應該知道Linux內核源代碼的整體分布情況。我們知道現代的操作系統一般由進程管理、內存管理、文件系統、驅動程序、網路等組成。看一下Linux內核源代碼就可看出,各個目錄大致對應了這些方面。Linux內核源代碼的組成如下(假設相對於linux目錄):
arch 這個子目錄包含了此核心源代碼所支持的硬體體系結構相關的核心代碼。如對於X86平台就是i386。
include 這個目錄包括了核心的大多數include文件。另外對於每種支持的體系結構分別有一個子目錄。
init 此目錄包含核心啟動代碼。
mm 此目錄包含了所有的內存管理代碼。與具體硬體體系結構相關的內存管理代碼位於arch/*/mm目錄下,如對應於X86的就是arch/i386/mm/fault.c 。
drivers 系統中所有的設備驅動都位於此目錄中。它又進一步劃分成幾類設備驅動,每一種也有對應的子目錄,如音效卡的驅動對應於drivers/sound。
ipc 此目錄包含了核心的進程間通訊代碼。
moles 此目錄包含已建好可動態載入的模塊。
fs Linux支持的文件系統代碼。不同的文件系統有不同的子目錄對應,如ext2文件系統對應的就是ext2子目錄。
kernel 主要核心代碼。同時與處理器結構相關代碼都放在arch/*/kernel目錄下。
net 核心的網路部分代碼。裡面的每個子目錄對應於網路的一個方面。
lib 此目錄包含了核心的庫代碼。與處理器結構相關庫代碼被放在arch/*/lib/目錄下。
scripts此目錄包含用於配置核心的腳本文件。
Documentation 此目錄是一些文檔,起參考作用。
俗話說:「工欲善其事,必先利其器」。 閱讀象Linux核心代碼這樣的復雜程序令人望而生畏。它象一個越滾越大的雪球,閱讀核心某個部分經常要用到好幾個其他的相關文件,不久你將會忘記你原來在干什麼。所以沒有一個好的工具是不行的。由於大部分愛好者對於Window平台比較熟悉,並且還是常用Window系列平台,所以在此我介紹一個Window下的一個工具軟體:Source Insight。這是一個有30天免費期的軟體,可以從www.sourcedyn.com下載。安裝非常簡單,和別的安裝一樣,雙擊安裝文件名,然後按提示進行就可以了。安裝完成後,就可啟動該程序。這個軟體使用起來非常簡單,是一個閱讀源代碼的好工具。它的使用簡單介紹如下:先選擇Project菜單下的new,新建一個工程,輸入工程名,接著要求你把欲讀的源代碼加入(可以整個目錄加)後,該軟體就分析你所加的源代碼。分析完後,就可以進行閱讀了。對於打開的閱讀文件,如果想看某一變數的定義,先把游標定位於該變數,然後點擊工具條上的相應選項,該變數的定義就顯示出來。對於函數的定義與實現也可以同樣操作。別的功能在這里就不說了,有興趣的朋友可以裝一個Source Insight,那樣你閱讀源代碼的效率會有很大提高的。怎麼樣,試試吧!
『拾』 Linux內核源代碼導讀的作者簡介
李雲華,是一名內核技術的狂熱愛好者,長期從事操作系統內核、計算機網路、設備驅動程序、以及嵌入系統方面的開發和研究。擁有豐富的設備驅動開發、網路優化、內核及驅動移植、嵌入式系統構建等方面的開發經驗。對Windows內核驅動及Linux內核驅動均有豐富的開發經驗及心得體會。