Linux內核設計第一週——從彙編語言出發理解計算機工做原理html
咱們學習了彙編語言的基礎知識,這一部分和內核代碼沒有直接的關係,可是,老師具體帶咱們瞭解了函數調用過程當中的堆棧變化,以及函數在調用的過程當中是如何傳遞參數的。這一部分是爲了以後學習進程上下文切換、中斷上下文切換打基礎的。java
老師編寫了一個簡單小型的內核代碼,並帶領咱們閱讀了其中的關鍵代碼。主要介紹了my_ schedule函數、my_ start_ kernel函數以及本身編寫的中斷處理程序my_ time_ handler函數。利用這三個函數,就能夠模擬內核進行中斷上下文切換的過程。與之相關的,還定義了mypcd的數據結構,經過自定義進程PCB結構,理解進程調度級進程上下文切換的大體過程。windows
Linux內核設計第三週——構造一個簡單的Linux系統數據結構
老師利用了一個簡單的Linux內核MenuOS系統,來爲咱們介紹了操做系統內核啓動的過程。學習瞭如何使用gdb進行內核調試,經過在關鍵函數位置設置斷點,單步調試,逐步分析每一句代碼的做用。這一週最重要的部分就是教給咱們如何經過gdb調試學習內核代碼,這個能力在以後的各個章節中都有體現。函數
第四周咱們學習了系統調用的相關知識,理解了系統調用是溝通用戶態和內核態的樞紐,是二者間聯繫的通道。其次,咱們經過編寫彙編代碼,來理解系統調用機制。要注意,使用匯編語言編寫系統調用代碼時,要注意寄存器傳遞參數和堆棧傳遞參數的區別,不要弄混,在系統調用中,使用的是寄存器傳遞參數。操作系統
第五週是在第四周的基礎上,將本身用匯編代碼修改的系統調用函數,添加到MenuOS中,這就須要咱們修改內核代碼,增長新的系統調用,以及學習如何從新加載,編譯寫好的代碼。在這個周,老師重點帶咱們分析了系統調用是如何返回的,即內核如何執行從syscall_ call到iret的過程,包括一些具體的細節。設計
主要講了進程的描述和建立,具體到進程的控制塊pcb的組織形式,以及進程建立設計到的數據結構;詳細分析了task_ struct結構的組成,以及其各部分的用途;分析了fork系統調用的執行過程和返回原理,強調了fork建立的子進程時經過ret_ from_ fork返回的;從sys_ clone代碼出發,分析了do_ fork函數執行的關鍵過程。
本週主要講解了Linux系統中的文件格式——ELF格式,具體到ELF格式的起源發展、ELF文件格式的分類、具體文件頭的組成等。還介紹了程序是如何在計算機中執行的,即通過預編譯、編譯、彙編、連接的過程完成的。同時介紹了可執行程序的靜態加載過程和動態加載過程。
本週主要圍繞進程的切換講解,分析了I/O型進程調度和CPU密集型進程調度的區別和設計原則,介紹了批處理進程、實時進程和交互式進程的優劣;以及Linux內核的優先級策略的設計;分析了用戶態進程調度和內核態進程調度的不一樣;分析了進程上下文切換過程當中,關鍵部分的代碼,包括堆棧的變化,以及內核態堆棧中傳遞參數的過程;分析彙編代碼,從細節出發,分析先後兩個進程切換的交界點;最終,總結出Linux系統的通常執行過程。
0、具體理解詳見博客彙總中的每週總結。
一、內核設計是針對操做系統而言的。不一樣的操做系統內核的設計是不一樣的。
(咱們爲何研究linux系統是由於Linux系統的內核代碼是開源的,咱們能夠直接分析它的源代碼,而windows系統的內核代碼是私有的,咱們不易得到,不過,內核的設計雖然有細節的差別,可是總的思路和原理是共通的)。
我認爲linux系統是這樣運行的:
- 首先由0號進程idle建立其子進程1號進程init和2號進程kthreadd;
- 1號進程init是全部用戶態進程的祖先,init將會建立新的子進程用來執行用戶命令;
- 2號進程kthreadd是全部內核線程的祖先。
- 在這個過程當中,有可能會發生衝突,根據進程優先級的不一樣,或者該進程是不是I/O密集型進程來決定誰先搶佔CPU,這涉及到進程調度策略,而且在這個過程當中會發生進程切換。
- 進程切換的具體細節,就涉及到內核堆棧和用戶堆棧之間數據保存和交換,即保存進程上下文。
- 進程是依附於程序存在的,這就須要讀取文件信息,經過預編譯、編譯、彙編、連接,生成可執行未見,才能執行。Linux中大部分可執行文件都是ELF格式,經過該格式文件頭信息,能夠找到程序執行的起點。
- 第一次瞭解了操做系統內核的相關結構和設計原理;
- 被內核設計者嚴謹的邏輯和巧妙的設計所折服;
- 雖然,學完linux內核分析以後我並不能本身編寫一個小型的操做系統,可是我學會了分析內核代碼的方法,如何使用gdb調試內核代碼,以及在調試的過程當中,理解內核代碼的具體實現。
- 授人以魚不如授人以漁。我感受學習這麼課我最大的收穫,就是學會了學習內核代碼的方法,這遠比理解一種內核設計重要的多,也有用的多。
我最大的遺憾就是,在進程課程的過程當中,對內核代碼沒有徹底理解,只是對關鍵代碼有必定的瞭解,我相信內核部分的學習遠遠不是短短几個周就能夠學習的充分的,我應該在之後的學習中,多多關注內核部分的設計和實現,必要的時候,親自動手實踐。在實踐的過程當中,加深對所學知識的理解。