張若嘉 + 原創做品轉載請註明出處 + 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000
知識歸納:
html
簡單模擬內核代碼
主要包括:linux
操做系統三個法寶:算法
操做系統核心功能:進程調度和中斷機制,經過與硬件的配合實現多任務處理,再加上上層應用軟件的支持,最終變成可使用戶能夠很容易操做的計算機系統
多進程的Linux操做系統:進程必須等到正在運行的進程空閒CPU後才能運行
進程切換:當正在運行的進程等待其餘的系統資源時,Linux內核將取得CPU的控制權,並將CPU分配給其餘正在等待的進程。進程切換機制中包含esp的切換、堆棧的切換數據結構
跟蹤調試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
系統調用在內核代碼中的工做機制和初始化操作系統
系統調用就是特殊的一種中斷
系統調用:線程
進程的描述:進程描述符task_struct數據結構翻譯
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開始執行的
進程的建立:
使用gdb跟蹤建立新進程的過程
可執行程序的裝載
------------------
淺析動態連接的可執行程序的裝載
進程切換的關鍵代碼switch_to分析:
首先系統的瞭解操做系統內核的相關結構和設計原理,學會了新知識gdb調試的與分析內核代碼的方法。並且經過本次mooc的學習過程當中,我學到的不只是知識,還有的就是學習的能力。一方面是本身學習知識的能力本身閱讀書籍,從書中得到知識的能力。還有就是本身動手作實驗的能力,再也不是單純的從課堂中從課本里從老師地口中獲取知識,也能夠從本身的自主地學習中獲取知識。
可是因爲基礎知識的不夠紮實致使了後面學習上遇到了一些困難,之後學習須要重視基礎知識的掌握。在關於操做系統內核的學習還並非那麼的清晰,有些知識點雖然已經學到但運用起來還並不熟練。還有就是關於操做系統內核的知識還沒能很好的將其組架成一個完整的知識框架,該部分知識還有待學習。
學習總結:
第一週:http://www.cnblogs.com/SUJUr/p/5211488.html
第二週:http://www.cnblogs.com/SUJUr/p/5244505.html
第三週:http://www.cnblogs.com/SUJUr/p/5255808.html
第四周:http://www.cnblogs.com/SUJUr/p/5281234.html
第五週:http://www.cnblogs.com/SUJUr/p/5316270.html
第六週:http://www.cnblogs.com/SUJUr/p/5330536.html
第七週:http://www.cnblogs.com/SUJUr/p/5359978.html
第八週:http://www.cnblogs.com/SUJUr/p/5392271.html