Linux內核學習收穫

鄭德倫 原創作品轉載請註明出處 《Linux內核分析》MOOC課程
http://mooc.study.163.com/course/USTC-1000029000
通過對MOOC Linux內核分析課程的學習,學到了以下一些知識點:
一、函數的調用堆棧:
學習了一部分彙編的基礎,通過反彙編一個C語言程序,瞭解了函數調用堆棧的詳細過程。
函數在調用的時候,參數是通過壓棧來傳遞的,在函數的內部,臨時的變量也是通過儲存在棧中,自動釋放的。通過描繪一個簡單的C程序的堆棧變化,理清了在程序執行中,棧是如何增長和縮減的。
博客地址:http://blog.csdn.net/a363344923/article/details/44116651
二、通過學習精簡的內核Mykernel,瞭解到linux內核進程調度的核心工作。
瞭解到進程的調度和時間中斷的概念。知道了一個進程在內核中,被描述爲一個結構體,儲存了進程的pid,運行狀態,堆棧,以及sp和ip等重要信息。
通過分析my_schedule的彙編代碼,瞭解到了進程切換的關鍵過程。我們可以認爲一個進程相當於一個堆棧,每個進程有自己的堆棧空間。如果將ebp和esp修改爲另一個進程的ebp和esp,並且完成一些寄存器的保存,就相當於完成的進程的切換。
博客地址:http://blog.csdn.net/a363344923/article/details/44276715
三、學習了linux內核的啓動過程:
通過自己編譯內核源碼,並且調試了啓動過程,瞭解到內核在啓動時經歷了哪些初始化。
內核幾乎所有的初始化都是在start_kernel進行的,在start_kernel之前主要是彙編代碼完成的一些操作。
在start_kernel中會初始化中斷向量,內存管理模塊,調度模塊等一系列初始化。在最後的rest_init()中會初始化0號進程和1號用戶態進程,然後最終啓動系統。
博客地址:http://blog.csdn.net/a363344923/article/details/44346997
四:系統調用過程的理解:
學習了AT&T的內聯彙編編寫方法,選擇了一個系統調用,使用C語言調用庫函數和彙編進行系統調用的兩種來完成。最終的效果是一樣的。
學習了系統調用的機制,Linux實現系統調用則是利用了i386體系結構的軟件中斷,使用int $0x80產生128號向量的編程異常。
博客地址:http://blog.csdn.net/a363344923/article/details/44624283
五、跟蹤sys_mkdir系統調用
將上一節編寫的代碼加入到MenuOS中,然後使用GDB調試代碼,跟蹤系統調用的過程。通過分析系統調用的源碼,發現了很多宏定義。這些宏定義很難理解,通過查找資料,學習了C語言宏的一些技巧,例如宏的雙井號運算符,單井號運算符,可變參數表。
通過跟蹤系統調用的代碼,可以分析出系統調用的一個簡要的流程圖:

這裏寫圖片描述
博客地址:http://blog.csdn.net/a363344923/article/details/44812293
六:分析fork的執行過程
通過GDB調試MenuOS瞭解到fork的執行過程,通過流程圖可以表現出來:
這裏寫圖片描述
七:跟蹤sys_execve的執行過程
通過GDB跟蹤sys_execve的執行過程,可以畫出如下執行的流程圖:
這裏寫圖片描述
八、分析schedule()的執行過程
通過GDB調試MenuOS,跟蹤代碼,可以畫出schedule的執行流程:
這裏寫圖片描述
博客地址:http://blog.csdn.net/a363344923/article/details/45226445

通過對比線下課程和線上課程,MOOC部分的內容和深度是略少於線下部分的,這也受限於MOOC的課程時間比線下少很多。
但是MOOC部分與實驗結合,學過之後就會對知識有比較清晰的認識,而且寫博客也是對課程學習內容的一種回顧和總結。通過本課程的學習,最大的收貨就是對Linux內核從完全陌生到有了一個認識的框架。使用GDB調試內核對理解系統調用,進程調度有了很深刻的認識。
一個比較大的遺憾,線下部分課程內容很多,而且很難理解,沒有和MOOC課程結合起來學習,造成了一些理解障礙,如果可以將文件系統加載,內存管理等過程調試一下應該會有更深刻的認識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章