Linux操做系統學習_操做系統是如何工做的

實驗五:Linux操做系統是如何工做的?php

學號:SA1****369html

操做系統工做的基礎:存儲程序計算機、堆棧(函數調用堆棧)機制和中斷機制linux

      首先要整明白的一個問題是什麼是存儲程序計算機?其實存儲程序計算機正是馮.諾依曼最初提出的計算機體系模型,如今咱們一提到馮.諾依曼體系結構首先會想到的應該是包含輸入設備、輸出設備、存儲器、控制器、運算器組成的經典模型,可是這裏咱們強調的存儲程序計算機的主要特徵實際上並不是如此,存儲程序計算機的概念至關因而褪去現代計算機華麗的外衣,所呈現出來的實實在在的計算機的本質。主要由處理器和存儲器組成,中間以總線相連。函數

       CPU經過總線從存儲器中讀取指令和數據進行處理,採用的主要機制是函數調用推棧機制。在不發生中斷、異常以及系統調用的過程當中,每一個進程的執行都符合函數調用堆棧機制。post

      接下來講說堆棧機制。具體的函數調用堆棧機制,在我以前的博文中已經詳細闡述,具體見實驗一 計算機是怎樣工做的 SA*****369 張*銘 。學習

PS:另外也可參閱C函數調用機制(x86的linux環境下) spa

      中斷機制是現代操做系統的特徵所在,即這是區分操做系統是否爲現代操做系統的一個重要依據,也是現代操做系統可以實現多任務的一個重要因素。咱們能夠將硬件中斷(即外圍設備產生的中斷)與軟中斷(即系統調用)共同稱爲中斷。CPU在運行一個進程的過程當中,接受到一箇中斷信號,則CPU會停下正在執行的任務,轉而去處理相應的中斷服務例程。每一個不一樣的中斷都對應着一個相應的中斷服務處理程序。操作系統

簡述操做系統(內核)是如何工做.net

參考材料:unix

 

Linux操做系統學習_用戶態與內核態之切換過程

分析進程切換宏 switch_to

 

linux2.6.29 swtich_to 詳細分析

      在個人上一篇博文Linux操做系統學習_用戶態與內核態之切換過程當中,我已經詳細介紹了Linux操做系統中爲何要分爲用戶態和內核態兩種狀態,以及用戶態和內核態的區別。同時也從虛擬地址空間的角度闡述了內核空間與用戶空間的概念,更是由此引出了內核棧與用戶棧的概念及區別。在操做系統工做的過程當中,大多數時間都是運行在用戶態下。只有當用戶態下的程序發生了系統調用,或者當進程在用戶態下執行時發生了硬件中斷,再或者當進程執行在用戶態下時,發生了異常,這些狀況下,系統都會發生用戶態和內核態之間的切換,即由用戶態切換到內核態。

      下面簡要的敘述一下操做系統的工做機制。首先一個進程,這裏咱們假設爲A,運行在用戶態下,此時產生了中斷,這時須要調用操做系統內核態下的中斷處理函數來對中斷進行處理,所以,這時就會發生用戶態和內核態之間的切換,將進程由運行於用戶態切換到運行於內核態。具體詳細的過程,前一篇博文中已經介紹了。在這一過程當中,首先將esp寄存器的值指向內核空間的內核棧,將eip寄存器指向中斷處理程序的入口地址,即中斷處理程序的第一條指令。而後,將進程A用戶態下的用戶棧的esp值和eip值入棧。(可能有人會在這裏產生疑惑,esp和eip的值都已經改變了,怎麼還要將用戶態下的值入棧呢?另一個疑問就是,你怎麼知道是壓入到內核棧。對於第一個問題,關鍵在於TSS,雖然在以前將esp和eip的值都改變了,可是TSS中仍保存着用戶態下的各個寄存器的信息,所以,將TSS中的esp和eip的信息入棧,便是將用戶態下的用戶棧的信息入棧,其實是對進程前一狀態進行保存,以便中斷返回後能夠繼續正確的執行以前正在執行的任務。第二個問題其實很簡單,由於第一步中已經將esp指向了內核棧的棧頂,而咱們知道,每次由用戶態切換到內核態時,內核棧都是空的,所以內核棧的棧頂和棧底其實是一個地址,所以咱們能夠肯定是壓入到了內核棧)。而後將以前在用戶態運行的應用程序的eflags,cs等寄存器的內容壓入到內核棧中。而後調用SAVE_ALL宏來將其餘全部的寄存器信息入棧保存。因爲此時cs、eip已經指向了中斷處理程序,所以,開始執行中斷處理程序,對中斷進行處理。當中斷處理程序執行完畢後,會判斷是否須要進行進程調度,如果須要,則調用schedule函數,而後在schedule中會調用switch_to宏,在switch_to宏中又會調用_switch_to函數來進行進程調度。具體的switch_to函數的原理,見上面的參考資料。

      當進程須要從內核態返回到用戶態時,主要是對前面所進行過的全部改變的一種恢復,首先調用restore_all來將eax、ebx等寄存器保存於內核棧中的值出棧,而後調用iret來恢復其餘寄存器的狀態,能夠看出,iret是與SAVE_ALL相反的過程。整體來講,restore_all和iret都是在恢復以前由用戶態切換到內核態時,各個寄存器的狀態的變化。到此,咱們的系統又由運行於內核態切換到了用戶態。

相關文章
相關標籤/搜索