Linux 0.11源碼閱讀筆記-總覽 閱讀源碼的目的 加深對Linux操作系統的瞭解,瞭解Linux操作系統基本架構,熟悉進程管理、記憶體管理等主要模塊知識。 通過閱讀教複雜的代碼,鍛煉自己複雜項目代碼的閱讀能力。對於一般簡短的程式,可以從main函數逐行閱讀理解;對於複雜的項目,只能在瞭解源碼主要 ...
Linux 0.11源碼閱讀筆記-總覽
閱讀源碼的目的
加深對Linux操作系統的瞭解,瞭解Linux操作系統基本架構,熟悉進程管理、記憶體管理等主要模塊知識。
通過閱讀教複雜的代碼,鍛煉自己複雜項目代碼的閱讀能力。對於一般簡短的程式,可以從main函數逐行閱讀理解;對於複雜的項目,只能在瞭解源碼主要結構的情況下,抓住某個具體的功能進行閱讀。
選擇較早版本的理由
Linux較新版本代碼在百萬行以上,而0.11版本內核不超過2萬行代碼。比較新版本的Linux內核源碼太多且內容龐雜,自身能力不足,沒有能力閱讀。早期版本的代碼雖然功能簡陋,但基本功能都有,屬於麻雀雖小五臟俱全,對於新手來說最適合不過。
不足在於0.11版本的代碼中不包含專門的進程等待隊列、TCP/IP網路等方面非常重要的代碼,對記憶體的分配和使用與先進的內核也有所區別。可以在學習0.11版本代碼之後,通過較新版本源碼學習。
內核結構框圖
內核位於用戶層與硬體層之間,向下管理底層CPU、記憶體、磁碟等硬體,並向上通過系統調用的方式提供服務。0.11內核主要部分包括文件子系統和進程管理子系統,進程管理子系統進一步可分為記憶體管理、進程調度、進程通信三個主要模塊。
內核代碼主要部分
代碼文件從功能上可分為三類:
- 硬體(異常)中斷處理程式文件
- 系統調用服務處理程式文件
- 進程調度等通用功能文件
- 中斷處理程式
主要包括兩個代碼文件:
- asm.s:實現了大部分硬體中斷處理程式彙編代碼
- traps.c:實現了asm.s的中斷處理過程中調用的c函數,這些c函數會在中斷門中註冊函數地址
- 系統調用處理相關程式
Linux中應用程式調用內核的功能是通過中斷調用int 0x80進行的,寄存器eax中放調用號,每個調用號對應一個系統調用函數。實現系統調用的相關文件包括system_call.s、fork.c、signal.c和exit.c文件。
- system_call.s:int 80中斷調用處理程式,根據系統調用號調用相應的系統調用函數
- fork.c、signal.c、exit.c:分別包含進程fork、信號、進程exit等相關的系統調用函數代碼實現
- 其它通用類程式
包括schedule.c、mktime.c、panic.c、printk.c和vsprintf.c。
- schedule.c:進程調度代碼
- mktime.c:內核使用的時間函數mktime(),僅在init/main.c中被調用一次
- panic.c:包含panic()函數,用於內核運行出現錯誤時顯示出錯信息並停機
- printk.c、vsprintf.c:內核顯示信息的支持程式。實現了內核專用顯示函數printk()和字元串格式化輸出函數vsprintf()
內核函數調用關係圖(Linux 2.6.26)
參考
- Linux 內核完全註釋 內核版本0.11 - 趙炯