歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核學習總結

Linux內核學習總結

日期:2017/3/1 12:03:15   编辑:Linux內核

課程總結

1、計算機是如何工作的

主要介紹一些基礎知識,包括匯編語言基礎知識、C語言函數調用過程中的堆棧變化和參數傳遞過程。

存儲程序計算機工作模型——馮諾依曼體系結構。程序:告訴計算機操作的步驟、輸入的數據、如何存放處理後的結果。匯編語言:匯編語言是機器語言的一種翻譯。

2、完成一個簡單的時間片輪轉多道程序內核代碼

簡單模擬內核代碼。主要包括函數調用堆棧、函數堆棧框架、內核的初始化、中斷、進程上下文切換過程的簡述以及基於時間片輪轉的多道程序模擬。

操作系統三個法寶:存儲程序計算機、函數調用堆棧、中斷機制。操作系統兩把寶劍:中斷上下文、進程上下文的切換。中斷:多道程序設計,可以多個程序同時運行,當一個中斷發生時,由CPU和內核代碼共同實現了保存現場和恢復現場。操作系統核心功能:進程調度和中斷機制,通過與硬件的配合實現多任務處理,再加上上層應用軟件的支+ 持,最終變成可以使用戶可以很容易操作的計算機系統。進程切換:當正在運行的進程等待其他的系統資源時,Linux內核將取得CPU的控制權,並將CPU分配給其他正在等待的進程。進程切換機制中包含esp的切換、堆棧的切換。

3、Linux內核啟動分析過程

這一周內,我們學習了閱讀內核源碼和構造Linux系統MenuOS,主要包括源碼主要結構、內核啟動及調試方法和start_kernel的解讀。我們總結為:道生一(start_kernel–>cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三個進程),三生萬物(1號進程是所有用戶態進程的祖先,2號進程是所有內核線程的祖先)

內核啟動完成進入menu程序,支持三個命令quit、version、help ipc和進程通信相關的目錄

4、使用庫函數API和C代碼中嵌入匯編代碼兩種方式使用同一個系統調用

關於系統調用的知識。主要包括對系統調用與用戶態、內核態的理解、通過編寫匯編代碼了解系統調用機制。

Intel x86 CPU有四種不同的執行級別0-3,Linux只使用了0級和3級分別表示內核態和用戶態。 0xc0000000以上的邏輯地址空間只能在內核態下訪問,0x00000000-0xbfffffff的邏輯地址空間在兩種狀態下都能訪問。中斷處理是從用戶態進入內核態的主要方式,而系統調用只是一種特殊的中斷。
中斷處理的完整過程:
這裡寫圖片描述 操作系統提供的API(應用編程接口)和系統調用的關系:並非一一對應系統調用的三層皮:xyz、system_call和sys_xyz
這裡寫圖片描述 在Linux中通過int$0x80來執行系統調用——產生向量為128的編程異常進程需要通過傳遞一個名為系統調用編號的參數來指明需要哪個系統調用(通過eax寄存器來實現傳遞)——系統調用號將xyz和sys_xyz關聯起來 system_call是Linux中所有系統調用的入口點,每個系統調用至少有一個參數,即由eax傳遞的系統調用號

5、分析system_call中斷處理過程

本周實驗需要我們添加一個自己編寫的系統調用,加深對系統調用在內核代碼中的處理過程的理解。

第一步,SAVE_ALL保存現場。第二步,確定中斷信息,將系統調用號通過eax傳入,通過sys_call_table查詢到調用的系統調用,然後跳轉到相應的程序進行處理。第三步,處理中斷。第四步,RESTORE_ALL恢復系統調用時的現場,iret返回用戶態

6、分析fork函數對應的系統調用處理過程

這周我們主要學習了關於進程的描述和創建。主要包括PCB的組織形式、進程的數據結構進程描述符、fork系統調用的關鍵執行過程。

操作系統三大功能:進程管理(核心)、內存管理、文件系統 PCB task_struct中包含:進程狀態、進程打開的文件、進程優先級信息進程控制塊PCB——進程描述符task_stuck提供了內核所需了解的進程信息進程的創建:start_kernel …cpu_idle –>kernel_init和kthreadd –>0、1、2號進程(其中1號進程是所有用戶線程的祖先,2號進程是所有內核線程的祖先) fork()系統調用:在用戶態創建一個子進程,在父進程和子進程中各會返回一次,在子進程中pid的返回值為0,在父進程中的返回值為子進程的pid p->thread.ip = (unsigned long) ret_from_fork; //調度到子進程時的第一條指令

7、分析exec*函數對應的系統調用處理過程

本周我們學習了關於程序的加載過程和ELF文件格式。主要包括得到一個可執行程序過程、ELF文件格式的結構和靜態鏈接、可執行程序的靜態加載過程和動態加載過程。

鏈接器的兩個任務:符號解析、重定位目標文件的三種形式:可重定位目標文件(編譯器和匯編器可生成)、可執行目標文件(鏈接器可生成)、共享目標文件(編譯器和匯編器可生成)新的可執行程序起點——一般是地址空間為0x8048000或0x8048300 execve執行靜態鏈接程序時,通過修改內核堆棧中保存的eip的值作為新進程的起點動態連接有兩種形式:可執行程序裝載時動態連接和運行時動態鏈接運行時動態裝載鏈接至少需要用到dlopen、dlsym函數

8、Linux進程調度——schedule()函數分析

本周我們主要學習了關於進程切換和整體執行過程。主要包括Linux進程調度算法簡介、進程切換代碼分析、switch_to理解、進程相關的數據結構簡析。

Linux進程調度是基於分時和優先級的 Linux中,內核線程是只有內核態沒有用戶態的特殊進程內核可以看作各種中斷處理過程和內核線程的集合用戶態進程無法主動調度,只能通過系統調用或其他中斷陷入內核的時機進行調度 Linux中,內核線程可以主動調度,主動調度時不需要中斷上下文的切換 Linux內核調用schedule()函數進行調度,並調用context_switch進行上下文的切換,這個宏調用switch_to來進行關鍵上下文切換。進程調度的時機——schedule()函數實現調度

感想

收獲

對於linux的基礎知識有了一定的了解,有些東西是之前一直想學習的卻沒有機會學習了使用系統調用以及gdb調試工具等,為以後的學習打下了基礎之前對於操作系統的很多疑惑,例如進程創建切換,都在這門課得到了一定的了解

遺憾

依然有很多不理解的地方,沒有來得及去學習,很多難點值的這門課結束之後慢慢鑽研
Copyright © Linux教程網 All Rights Reserved