第九周--期中總結

Linux內核分析期中知識點總結

潘恆   原創做品轉載請註明出處  《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000html

學習目錄

  • 第一週《計算機是如何工做的?》http://www.cnblogs.com/ppph1995/p/5215374.html
  • 第二週《操做系統是如何工做的?》http://www.cnblogs.com/ppph1995/p/5247287.html
  • 第三週《構建一個簡單的操做系統MenuOS》http://www.cnblogs.com/ppph1995/p/5268550.html
  • 第四周 《系統調用的工做機制》http://www.cnblogs.com/ppph1995/p/5284196.html
  • 第五週《扒開操做系統的「三層皮」》http://www.cnblogs.com/ppph1995/p/5324096.html
  • 第六週《進程的描述與建立》http://www.cnblogs.com/ppph1995/p/5351052.html
  • 第七週《可執行程序的裝載》http://www.cnblogs.com/ppph1995/p/5361134.html
  • 第八週《進程的切換和系統的通常執行過程》http://www.cnblogs.com/ppph1995/p/5390019.html

計算機是如何工做的

  • 計算機:計算機實現很複雜的功能,計算和處理大量的數據,其實是經過不斷地重複大量既定的簡單的操做
  • 程序:告訴計算機操做的步驟、輸入的數據、如何存放處理後的結果。計算機會盡量忠實地按照程序的順序將每個操做步驟的指令取出,變成機器語言,經過軟硬件協同工做
  • 彙編語言:彙編語言是機器語言的一種翻譯。如今編譯器功能強大,彙編語言真正用的時候並很少,但可以看懂彙編語句,在分析程序真正執行的流程、單步調試程序的方面都有很大幫助

操做系統是如何工做的

簡單模擬內核代碼
主要包括:linux

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

操做系統三個法寶:算法

  • 存儲程序計算機
  • 函數調用堆棧
  • 中斷機制
    操做系統兩把寶劍:中斷上下文、進程上下文的切換

操做系統核心功能:進程調度和中斷機制,經過與硬件的配合實現多任務處理,再加上上層應用軟件的支持,最終變成可使用戶能夠很容易操做的計算機系統
多進程的Linux操做系統:進程必須等到正在運行的進程空閒CPU後才能運行
進程切換:當正在運行的進程等待其餘的系統資源時,Linux內核將取得CPU的控制權,並將CPU分配給其餘正在等待的進程。進程切換機制中包含esp的切換、堆棧的切換數據結構

構造一個簡單的Linux系統MenuOS

生一(start_kernel-->cpu_idle),一輩子二(kernel_init和kthreadd),二生三(即前面0、1和2三個進程),三生萬物(1號進程是全部用戶態進程的祖先,2號進程是全部內核線程的祖先)

跟蹤調試Linux內核的啓動框架

扒開系統調用的三層皮(上)

系統調用:即使是最簡單的程序,在進行輸入輸出等操做時也會須要調用操做系統所提供的服務,也就是系統調用。Linux下的系統調用是經過中斷(int 0x80)來實現的函數

傳遞參數:在執行int 80指令時,寄存器 eax 中存放的是系統調用的功能號,而傳給系統調用的參數則必須按順序放到寄存器 ebx,ecx,edx,esi,edi 中,當系統調用完成以後,返回值能夠在寄存器 eax 中得到。Linux 採用的是 C 語言的調用模式,這就意味着全部參數必須以相反的順序進棧,即最後一個參數先入棧,而第一個參數則最後入棧。
用戶態、內核態和中斷處理過程
使用庫函數API和C代碼中嵌入彙編代碼觸發同一個系統調用
使用庫函數API獲取系統當前時間
使用C代碼中嵌入彙編代碼觸發系統調用獲取系統當前時間學習

扒開應用系統的三層皮(下)

給MenuOS增長time和time-asm命令
使用gdb跟蹤系統調用內核函數sys_time
系統調用在內核代碼中的工做機制和初始化spa

系統調用就是特殊的一種中斷
系統調用:操作系統

  • SAVE_ALL保存現場。
  • 肯定中斷信息,將系統調用號經過eax傳入,經過sys_call_table查詢到調用的系統調用,而後跳轉到相應的程序進行處理。
  • 處理中斷。
  • RESTORE_ALL恢復系統調用時的現場,iret返回用戶態。

進程的描述和進程的建立

進程的描述:進程描述符task_struct數據結構線程

從系統調用的角度理解fork():一次調用兩次返回(fork系統調用在父進程和子進程各返回一次,子進程中返回的是0,父進程中返回值是子進程的pid)

Linux經過複製父進程來建立一個新進程,經過調用do_fork來實現併爲每一個新建立的進程動態地分配一個task_struct結構
執行起點與內核堆棧保證一致:設置子進程的ip以前:childregs = current_pt_regs();將父進程的regs參數賦值到子進程的內核堆棧,其中存放了SAVE_ALL中壓入棧的參數
新進程的開始:copy_thread()中:p->thread.ip = (unsigned long) ret _from _fork;將子進程的 eip 設置爲ret_from _fork的首地址,子進程從ret_from_fork開始執行的

進程的建立:

  • 進程的建立概覽及fork一個進程的用戶態代碼
  • 理解進程建立過程複雜代碼的方法
  • 瀏覽進程建立過程相關的關鍵代碼
  • 建立的新進程是從哪裏開始執行的?
  • 使用gdb跟蹤建立新進程的過程
    可執行程序的裝載
    ------------------

    關於程序的加載過程和ELF文件格式。主要包括獲得一個可執行程序過程、ELF文件格式的結構和靜態連接、可執行程序的靜態加載過程和動態加載過程

    execve執行的時候陷入到內核態,用execve中加載的程序把當前正在執行的程序覆蓋掉,當系統調用返回的時候也就返回到新的可執行程序起點
    預處理、編譯、連接和目標文件的格式:
  • 可執行程序是怎麼得來的
  • 目標文件的格式ELF
  • 靜態連接的ELF可執行文件和進程的地址空間
    可執行程序、共享庫和動態加載:
  • 裝載可執行程序以前的工做
  • 裝載時動態連接和運行時動態連接應用舉例
    可執行程序的裝載:
  • 可執行程序的裝載相關關鍵問題分析
  • sys_execve的內部處理過程
  • 使用gdb跟蹤sys_execve內核函數的處理過程
  • 可執行程序的裝載與莊生夢蝶的故事
  • 淺析動態連接的可執行程序的裝載

進程的切換和系統的通常執行過程

進程切換的關鍵代碼switch_to分析:

  • 進程進度與進程調度的時機分析
  • 進程上下文切換相關代碼分析
    Linux系統的通常執行過程:
  • Linux系統的通常執行過程分析
  • Linux系統執行過程當中的幾個特殊狀況
    進程調度算法:根據分類不一樣,調度的設計原則也不一樣
    進程的切換:切換地址空間、切換內核堆棧、切換內核控制流程和一些必要的寄存器保存和恢復
    調度時機:內核線程能夠直接調用schedule()進行進程切換(主動),也能夠在中斷處理過程當中進行調度(被動)。用戶態進程沒法實現主動調度,僅能經過陷入內核態後的某個時機點進行調度,即在中斷處理過程當中進行調度
    內核的使用:32位x86系統下,每一個進程的地址空間有4G,用戶態0-3G,3G以上僅內核態能夠訪問。全部進程3G以上是共享的,在內核中代碼段,堆棧段都是相同的,回到用戶態纔不一樣。進程進入內核就都同樣,沒有進程陷入內核就執行0號進程。內核能夠看做各類中斷處理過程和內核線程的集合

總結:

每週若是靜下心來學習總結相應課程的話確實會感到有所收穫,但本人以爲雖然內容不錯,每每看完視頻寫完做業就不會記憶深入了,仍是要經常複習,多加以實踐才能掌握linux內核的真正原理。往後遇到實踐複習的機會必定要好好把握,就這半學期的學習來講仍是掌握的很差,深層次的理解遠遠不夠。

相關文章
相關標籤/搜索