Linux內核學習總結

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。

前幾周的內容仍是很輕鬆的,不過進程切換仍是很難以理解,還須要再學習。

相關文章
相關標籤/搜索