Linux內核分析:期中總結

第一章:計算機是如何工做的

計算機大部分都是用馮諾依曼體系結構,即存儲程序計算機。

兩個層面:

1.硬件: cpu(IP寄存器:指針,指向內存的某塊區域)——總線——內存(代碼與數據)

2.程序員:  內存存儲指令與數據,
 CPU解釋執行指令

   計算機在執行程序時須先將要執行的相關程序和數據放入內存儲器中,
在執行程序時CPU根據當前程序指針寄存器的內容取出指令並執行指令,
而後再取出下一條指令並執行,如此循環下去直到程序結束指令時才停
止執行。其工做過程就是不斷地取指令和執行指令的過程,最後將計算
的結果放入指令指定的存儲器地址中。

  


 

第二章:操做系統是如何工做的

學習內容:

函數調用堆棧

藉助Linux內核部分源代碼模擬存儲程序計算機工做模型及時鐘中斷

構造一個簡單的操做系統內核

經過內核源代碼瞭解,從環境搭建起來,mystartkernerl開始初始化至完成,啓動0號進程,
利用時間片,每一個進程每隔1000萬次,判斷是否須要調度,調度使用myshedule()進行調度.
設置時間片的大小,時間片用完時,設置一下調度標識。 
if(timecount%1000==0&&myneedsched!=1) 當進程執行到的時候,發現
needsched==1,就執行myschedule,調度分兩種狀況,一種是下一個進程正在進行的,
另外一種是從未調度過的,進程從未執行過,執行起來特殊點,將狀態轉成運行時狀態,做爲當
前執行的進程,esp,ebp指向同一位置兩種彙編代碼略有不一樣,是關鍵。

  


 

第三章:構造一個簡單的Linux系統MenuOS

    Linux的啓動過程:內核啓動相關的代碼基本在init目錄下,init/main.c內核啓動起點
    start_kernel函數至關於普通C程序中的main函數,搭建環境,啓動內核。
    start_kernel的最後一句rest_init建立0號進程裏的kernel_init建立1號進程,
    run_init_process建立1號進程,是第1個用戶態進程。pid_kernel_thread(kthreadd,..)用內核線程管理系統資源(建立其餘內核服務線程)。
    rest_init啓動完後,call ..  cpu_idl , call_startup_entry,cpu_idle_loop裏面while(1)0號進程,當系統無進程須執行時就調度到idle進程

課本第一章Linux的發展過程 與UNIX的關係html

課本第二章Linux內核源代碼的獲取、解壓、配置、編譯與安裝linux


 

第四章:系統調用

1
系統調用經過軟中斷向內核發出明確的請求。(eg:sysenter)

  

1
2
3
4
5
6
7
8
9
10
操做系統提供API和系統調用的關係
Libc庫定義的一些API引用封裝例程(wrapper routine).
通常每一個系統調用對應一個封裝例程。
庫再用這些封裝例程定義給用戶的API.
     
不是每一個API對應一個特定系統調用
 
返回值:1.大部分封裝例程返回一個整數,值含義依賴於相應的系統調用;
2.-1,多數狀況——內核不知足進程請求。
3.Libc定義errno變量包含特定出錯碼
使用庫函數觸發一個系統調用

C代碼中嵌入彙編代碼的寫法

使用嵌入式彙編代碼觸發同一個系統調用

系統調用在內核代碼中的處理過程

  

應用程序應該以某種方式(庫函數或彙編代碼)通知系統
告訴內核本身須要執行一個系統調用,但願系統切換到內核態。
內核就能夠表明應用程序在內核空間執行系統調用。
通知內核的機制是靠軟中斷實現的:
經過引起異常將系統切換內核態執行異常處理程序(系統調用處理程序)。 

自學課本第五章 系統調用 系統調用與API的異同 系統調用觸發過程、參數傳遞程序員

自學課本第十八章 調試數據結構


 

第五章 進程的描述和進程的建立

自學課本第三章 進程管理app

進程提供兩種虛擬機制:虛擬處理器和虛擬內存函數

PS:線程之間能夠共享虛擬內存,但每一個都擁有各自的虛擬處理器
1.fork()建立新進程,父進程用fork建立子進程。fork系統調用從內核返回兩次:一次回到父進程,一次回到子進程。
2.exec()能夠建立新的地址空間,把新的程序載入其中
3.在Linux內核中,fork()實際有clone()系統調用實現的。
4.程序經過exit()系統調用退出執行。最終中介進程並將其佔用的資源釋放掉。
5.父進程經過wait4()系統調用查詢子進程是否終結,這使得進程擁有了等待特定進程執行
完畢的能力。

  

第六章:程序和進程

進程描述符PCB----task_struct數據結構

 操做系統:1.進程管理 2.內存管理 3 文件系統

新進程如何建立和修改task_struct數據結構

1.複製當前進程(建立新進程經過複製當前進程來實現)
2.給新進程分配新的內核堆棧
3.修改複製過來的進程數據(如pid,狀態鏈表,內核堆棧,ip,sp)

  

進程:處於執行期的程序以及相關的資源的總稱。oop

1.fork()建立新進程,父進程用fork建立子進程。fork系統調用從內核返回兩次:一次回到父進程,一次回到子進程。
2.在Linux內核中,fork()實際有clone()系統調用實現的。
3.程序經過exit()系統調用退出執行。最終中介進程並將其佔用的資源釋放掉。

  

進程描述符及任務結構學習

內核把進程的列表存放在任務隊列的雙向循環列表中
鏈表中每一項都是類型爲task_struck,稱爲進程描述符的結構,該結構定義在<linux/sched.h>文件中

  

進程狀態spa

(1)TASK_RUNNING(運行)——進程是可執行。進程在用戶空間中執行的惟一可能的狀態,也能夠應用到內核空間中正在執行的
    (2)TSK_INTERRUPTIBLE
    (3) TASK_UNINTERRUPTIBLE 
    (4)_TASK_TRACED 
    (5)_TASK_STOOPED

  

進程上下文操作系統

通常程序在用戶空間執行。當一個程序調執行了系統調用或者觸發了某個異常,它就陷入了內核空間。成內核「表明進程執行」,並處於進程上下文中。

  

進程家族數
全部的進程都是PID爲1的init進程的後代,內核在系統啓動的最後階段啓動init進程。

  

Linux系統建立一個新進程的理解
1.fork實際開銷是複製父進程的頁表以及給子進程建立惟一的進程描述符**

2.Linux經過clone()系統調用實現fork()**

3.fork(),vfork(),和clone()庫函數都是根據各自須要的參數標誌去調用clone(),而後由clone()調用do_fork**

do_fork函數調用了copy_process()函數,而後讓進程執行



  Linux經過複製父進程建立新進程,fork、vfork、clone都是經過do_exit實現進程的建立。
 -A.複製一個PCB
 -B.給新進程分配一個新的內核堆棧(複製了thread_info,不是複製了內核堆棧)    
 -C.修改複製的數據,即子進程初始化。

 從用戶態代碼看父進程和子進程各返回一次,而子進程從ret_from_fork函數開始執行,從函數中跳轉到syscall_exit,即system_call中的語句。   

  

 

自學 《深刻理解計算機系統》第七章 連接

第七章 進程的切換和執行過程概覽

  • 用戶態堆棧和內核態堆棧
  • 進程上下文的保存和恢復
  • 進程切換的關鍵代碼switch_to分析
內核是各類中斷處理過程和內核線程的集合
 
(1)中斷處理過程(包括時鐘中斷、I/O中斷、系統調用和異常)中,直接調用schedule(),或者返回用戶態時根據need_resched標記調用schedule();
 
(2)內核線程能夠直接調用schedule()進行進程切換,也能夠在中斷處理過程當中進行調度,也就是說內核線程做爲一類的特殊的進程能夠主動調度,也能夠被動調度;
 
(3)用戶態進程沒法實現主動調度,僅能經過陷入內核態後的某個時機點進行調度,即在中斷處理過程當中進行調度。
中斷和中斷返回:有一個CPU上下文的切換
進程調度過程當中:有一個進程上下文的切換,從一個進程的內核態堆棧切換到另外一個進程的內核態堆棧。

  

自學課本第四章 進程調度 

期中總結

前八週重點與難點 :

 

感想:期中感想,這幾周的重點在於進程切換這段彙編代碼,堆棧的變化的分析,總是記得有點混,因此特此百度的堆棧變化圖片,以便查閱複習。

相關文章
相關標籤/搜索