導航:首頁 > 操作系統 > linux源代碼導讀

linux源代碼導讀

發布時間:2024-05-04 14:54:35

linux內核源碼解析-list.h

開頭就說明了這里的 list.h 文件來自 Linux Kernel ( */include/linux/list.h ),只是去除了列表項的硬體預載入部分。

進行宏替換後就是

Note: 沒搞懂這里為什麼加個 osn 前綴,原本是 list_add ,現在是 osn_list_add 。

可以看到就是個簡單的鏈表節點刪除過程,同時把刪除節點的前後指針設為無法訪問。

刪除節點後初始化,前後指針都指向自己

從A鏈表刪除後頭插法插入B鏈表

從A鏈表刪除後尾插法插入B鏈表

先對 list 判空,非空就把 list 鏈表除頭節點外裁剪到 head 頭節點在的鏈表中。函數不安全, list 節點可以繼續訪問其他節點。

多了一步 list 重新初始化的過程。

(unsigned long)(&((type *)0)->member))) 將0x0地址強制轉換為 type * 類型,然後取 type 中的成員 member 地址,因為起始地址為0,得到的 member 的地址就直接是該成員相對於 type 對象的偏移地址了。
所以該語句的功能是:得到 type 類型對象中 member 成員的地址偏移量。
先將 ptr 強制轉換為 char * 類型(因為 char * 類型進行加減的話,加減量為 sizeof(char)*offset , char 佔一個位元組空間,這樣指針加減的步長就是1個位元組,實現加一減一。)
整句話的意思就是:得到指向 type 的指針,已知成員的地址,然後減去這個成員相對於整個結構對象的地址偏移量,得到這個數據對象的地址。

就是從前往後,從後往前的區別

Note: 從head節點開始(不包括head節點!)遍歷它的每一個節點!它用n先將下一個要遍歷的節點保存起來,防止刪除本節點後,無法找到下一個節點,而出現錯誤!

已知指向某個結構體的指針pos,以及指向它中member成員的指針head,從下一個結構體開始向後遍歷這個結構體鏈

Note: 同理,先保存下一個要遍歷的節點!從head下一個節點向後遍歷鏈表。

list.h使用說明
linux內核list.h分析(一)
linux內核list.h分析(二)
【Linux內核數據結構】最為經典的鏈表list

Ⅱ 有沒有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內核源碼

本人是一名 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內核源代碼導讀的作者簡介

李雲華,是一名內核技術的狂熱愛好者,長期從事操作系統內核、計算機網路、設備驅動程序、以及嵌入系統方面的開發和研究。擁有豐富的設備驅動開發、網路優化、內核及驅動移植、嵌入式系統構建等方面的開發經驗。對Windows內核驅動及Linux內核驅動均有豐富的開發經驗及心得體會。

Ⅳ Linux內核源代碼導讀的介紹

本書根據最新的2.6.24內核為基礎。在講述方式上,本書注重實例分析,盡量在討論「如何做」的基礎上,深入討論為什麼要這么做,從而實現本書的寫作宗旨:「授人以漁」。在內容安排上,本書包含以下章節x86硬體基礎;基礎知識;Linux內核Makefile分析;Linux內核啟動;內存管理;中斷和異常處理;系統調用;信號機制在類UNIX系統中;時鍾機制;進程管理;調度器;文件系統;常用內核分析方法。

Ⅵ 濡備綍鏌ョ湅linux鍛戒護婧愪唬鐮

鐢╨inux涓孌墊椂闂翠簡錛屾湁鏃跺欐兂鐪嬬湅ls銆乧at銆乵ore絳夊懡浠ょ殑婧愪唬鐮侊紝鍦ㄤ笅杞界殑鍐呮牳婧愮爜涓鐢╟scope娌¤兘鎵懼埌錛屽湪緗戜笂鎼滅儲浜嗕竴涓嬶紝灝嗘柟 娉曟葷粨濡備笅錛氫互鎼滅儲ls鍛戒護婧愮爜涓轟緥錛屽厛鎼滅儲鍛戒護鎵鍦ㄥ寘錛屽懡浠ゅ備笅錛
lpj@lpj-linux:~$ which ls /bin/ls鐢ㄥ懡浠ゆ悳緔㈣ヨ蔣浠舵墍鍦ㄥ寘錛屼唬鐮佸備笅錛
lpj@lpj-linux:~$ dpkg -S /bin/ls coreutils: /bin/ls浠庝笂涓姝ヤ腑鍙浠ョ煡閬搇s鍛戒護鐨勫疄鐜板湪鍖卌oreutils涓錛岀敤apt瀹夎(璇村畨瑁呮湁浜涙т箟錛屼富瑕佹槸鍖哄垎apt-get -d)璇ュ寘鐨勬簮浠g爜鐒跺悗瑙e帇錛屼唬鐮佸備笅錛
sudo apt-get source coreutils cd /usr/src/coreutils-XXX #XXX琛ㄧず鐗堟湰鍙 sudo tar zxvf coreutils-XXX.tar.gz 鎴栬呭彧涓嬭澆婧愮爜錛岀劧鍚庢墜鍔ㄦ墦琛ヤ竵鍐嶈В鍘嬶紝浠g爜濡備笅錛
sudo apt-get -d source coreutils cd /usr/src tar zxvf coreutils-XXX.tar.gz gzip -d coreutils-XXX.diff.gz #榪欎竴姝ヤ細鐢熸垚coreutils-XXX.diff鏂囦歡 patch -p0 < coreutils-XXX.diff cd coreutils-XXX tar zxvf coreutils-XXX.tar.gzOK錛岃繖鍑犳ユ墽琛屽畬鍚庯紝灝卞彲浠ヨ繘鍏/usr/src/coreutils-XXX/coreutils-XXX/src涓鏌ョ湅鍚勫懡浠ゅ瑰簲鐨勬簮浠g爜浜

閱讀全文

與linux源代碼導讀相關的資料

熱點內容
進化演算法和啟發式演算法的區別 瀏覽:602
android組件是什麼 瀏覽:973
安卓手機微信怎麼同步信息 瀏覽:181
小人pdf 瀏覽:806
我的世界伺服器怎麼造好看的建築 瀏覽:307
兄弟連培訓php多少錢 瀏覽:249
1523鋪地面的演算法 瀏覽:746
linux源碼安裝php環境 瀏覽:821
ping命令用法 瀏覽:717
日本海軍pdf 瀏覽:469
哪個app有大臉特效 瀏覽:140
自己生活需要解壓嗎 瀏覽:946
考研究生演算法 瀏覽:528
java撤銷 瀏覽:442
學完單片機做點什麼好 瀏覽:312
編譯後運行不了 瀏覽:404
安卓如何設置手機鍵盤大小 瀏覽:847
室內程序員表白方式 瀏覽:694
全民去哪裡找app 瀏覽:124
表格命令CAD 瀏覽:244