Linux內核學習總結html
賀邦linux
原創做品轉載請註明出處函數
《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000學習
1、博客做業目錄。操作系統
1. 從C簡單程序的彙編代碼入手,以理解計算機工做原理。rest
http://www.cnblogs.com/L1nke/p/5218790.htmlcode
2. LINUX內核分析:完成一個簡單的時間片輪轉多道程序內核代碼。htm
http://www.cnblogs.com/L1nke/p/5247152.htmlblog
3. LINUX內核分析 實驗三:跟蹤分析LINUX內核的啓動過程。進程
http://www.cnblogs.com/L1nke/p/5270262.html
4.實驗四:使用庫函數API和C代碼中嵌入彙編代碼兩種方式使用同一個系統調用。
http://www.cnblogs.com/L1nke/p/5297663.html
5. 實驗五:分析SYSTEM_CALL中斷處理過程。(PS.提交做業的時候鏈接提交錯了 ….以至分很低)
http://www.cnblogs.com/L1nke/p/5323966.html
6. 分析LINUX內核建立一個新進程的過程。
http://www.cnblogs.com/L1nke/p/5347984.html
7. LINUX內核如何裝載和啓動一個可執行程序。
http://www.cnblogs.com/L1nke/p/5374617.html
8. 理解進程調度時機跟蹤分析進程調度與進程切換的過程。
http://www.cnblogs.com/L1nke/p/5401757.html
2、學習心得。
1. 圖解分析彙編代碼以理解計算機是如何工做的
馮諾依曼體系結構的計算機,又叫存儲程序計算機,從硬件的角度來看,其工做模型是CPU依次讀取內存中的指令來完成工做。其核心思想是:數制採用二進制,計算機應該按照程序順序執行。
彙編語言的五種尋址模式:1.寄存器尋址 registermode 2. 當即尋址 immediate 3.直接尋址 direct 4. 間接尋址 indirect 5.變址尋址 displaced
2. 基於mykernel的一個簡單的時間片輪轉多道程序內核代碼分析
mykernel是由老師創建的一個用於開放您本身的操做系統的內核平臺,它基於Linux Kernel 3.9.4 source code。經過本講的學習和實驗,咱們知道操做系統的核心功能就是:進程調度和中斷機制,經過與硬件的配合實現多任務處理,再加上上層應用軟件的支持,最終變成可使用戶能夠很容易操做的計算機系統。
3. 使用gdb跟蹤Linux內核啓動過程
start_kernel()是內核的彙編與C語言的交接點,在該函數之前,內核的代碼都是用匯編寫的,完成一些最基本的初始化與環境設置工做。start_kernel就像是c代碼中的main函數。無論你關注Linux的內核模塊,老是離不開start_kernel函數的,由於大部分模塊的初始化工做都是在start_kernel中完成的。按照這節課的實驗步驟,咱們能夠跟蹤Linux內核的啓動過程。
4. 使用庫函數API和C代碼中嵌入彙編代碼兩種方式使用同一個系統調用
即使是最簡單的程序,也不免要用到諸如輸入、輸出以及退出等操做,而要進行這些操做則須要調用操做系統所提供的服務,也就是系統調用。除非你的程序只完成加減乘除等數學運算,不然將很難避免使用系統調用。在 Linux 平臺下有兩種方式來使用系統調用:利用封裝後的 C 庫(libc)或者經過彙編直接調用。這篇文章從示例出發,介紹了系統調用的概念,以及如何使用系統調用。
5. 分析system_call中斷處裏過程
經過gdb咱們能夠給系統調用內核處里程序如sys_write, sys_time設置斷點,並讓程序停在斷點處,進行斷點跟蹤系統調用處裏過程。因爲system_call是徹底用匯編寫就一個的函數,雖然咱們也能夠在system_call處設置斷點,但卻沒法讓系統停在system_call處,因此也沒法經過單步跟蹤學習其處裏流程。但system_call是全部系統調用的入口,也是程序由用戶態轉入內核態執行時沒法越過的一個函數,其重要性不言而喻,因此咱們跟隨老師簡化的彙編代碼以及源代碼學習其主要的流程。
6. 初學Linux進程的描述和進程的建立
爲了管理進程,內核必須對每一個進程進行清晰的描述,進程描述符提供了內核所需瞭解的進程信息。進程描述符task_struct的源碼連接:http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235。在Linux應用程序的開發中,能夠經過fork、vfork和clone等API來建立一個子進程,它們在Linux內核中對應的系統調用分別爲sys_fork、sys_vfork和sys_clone函數,而這些函數最終都會調用do_fork完成子進程的建立。do_fork主要是複製了父進程的task_struct,而後修改必要的信息,從而獲得子進程的task_struct。
7. 初學《Linux內核如何裝載和啓動一個可執行程序》
Linux系統能夠經過execve API啓動一個新進程,該API又呼叫sys_execve系統調用,負責將新的程序代碼和數據替換到新的進程中,打開可執行 文件,載入依賴的庫文件,申請新的內存空間,最後執行 start_thread(regs, elf_entry, bprm->p) ,設置 new_ip, new_sp ,完成新進程的代碼和數據替換,而後返回,接下來就是執行新的進程代碼了。
8. 初學Linux中進程調度與進程切換過程
Linux系統的通常執行過程,最通常的狀況是:正在運行的用戶態進程X切換到運行用戶態進程Y的過程要通過如下步驟
1). 正在運行的用戶態進程X
2). 發生中斷:save cs:eip/esp/eflags(current) to kernel stack, then load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).
3). SAVE_ALL //保存現場,這裏是已經進入內核中斷處裏過程
4). 中斷處理過程當中或中斷返回前調用了schedule(),其中的switch_to作了關鍵的進程上下文切換
5). 標號1以後開始運行用戶態進程Y(這裏Y曾經經過以上步驟被切換出去過所以能夠從標號1繼續執行)
6). restore_all //恢復現場
7). iret - pop cs:eip/ss:esp/eflags from kernel stack
8). 繼續運行用戶態進程Y
3、收穫與感悟。
八週的學習,轉瞬即逝,孟老師爲咱們在LINUX學習道路上打開了一扇窗,很感激老師的辛苦付出。八週的學習,也只是淺嘗輒止,將來我也會繼續學習LINUX。
前幾周的內容仍是很輕鬆的,不過進程切換仍是很難以理解,還須要再學習。