工程師們在"摔倒"後如何不尷尬

 Anker 360雲計算 linux


女主宣言安全


這兩天被上海維密秀的奚夢瑤摔倒事件刷屏,其實可怕的不是模特界資深的她在衆目睽睽之下摔倒,而是在技術界高級的你對專業知識體系的匱乏,和麪對疑問而回答不上來時的尷尬。今天小主就爲你們補習一下關於linux系統內核方面的基礎知識,鞏固知識體系。數據結構

PS:豐富的一線技術、多元化的表現形式,盡在「HULK一線技術雜談」,點關注哦!ide


 

介紹
雲計算

在咱們平時和linux的平常工做中,常常會看到用戶空間內核空間進程上下文中斷上下文。看着很熟悉,半天又說不出究竟是怎麼回事,有什麼區別。看書過程常常感受到被欺騙,似懂非懂的感受,非常不爽,今天就來爲你們加深一下對它的理解,今後擺脫對它的「尷尬症」spa


 

用戶空間與內核空間
操作系統

操做系統都是採用虛擬存儲器,那麼對32位操做系統而言,它的尋址空間(虛擬存儲空間)爲4G(2的32次方)。操做系統的核心是內核,獨立於普通的應用程序,能夠訪問受保護的內存空間,也有訪問底層硬件設備的全部權限。爲了保證用戶進程不能直接操做內核,從而保護內核的安全,操做系統將虛擬空間劃分爲兩部分,一部分爲內核空間,一部分爲用戶空間。設計


內核空間:針對linux操做系統而言,將最高的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱爲內核空間。指針


用戶空間:將較低的3G字節(從虛擬地址0x00000000到0xBFFFFFFF)供各個進程使用,稱爲用戶空間。blog


每一個進程能夠經過系統調用進入內核,所以,Linux內核與系統內的全部進程共享。因而,從具體進程的角度來看,每一個進程能夠擁有4G字節的虛擬空間。空間分配以下圖所示:


圖片


有了用戶空間和內核空間,整個linux內部結構能夠分爲三部分,從最底層到最上層依次是:硬件-->內核空間-->用戶空間。以下圖所示:


image.png


須要注意的細節問題:

  1. 內核空間中存放的是內核代碼和數據,而進程的用戶空間中存放的是用戶程序的代碼和數據。不論是內核空間仍是用戶空間,它們都處於虛擬空間中。

  2. Linux使用兩級保護機制:0級供內核使用,3級供用戶程序使用。


內核態與用戶態:

  1. 當一個任務(進程)執行系統調用而陷入內核代碼中執行時,稱進程處於內核運行態(內核態)。此時處理器處於特權級最高的(0級)內核代碼中執行。當進程處於內核態時,執行的內核代碼會使用當前進程的內核棧。每一個進程都有本身的內核棧。


  2. 當進程在執行用戶本身的代碼時,則稱其處於用戶運行態(用戶態)。此時處理器在特權級最低的(3級)用戶代碼中運行。當正在執行用戶程序而忽然被中斷程序中斷時,此時用戶程序也能夠象徵性地稱爲處於進程的內核態。由於中斷處理程序將使用當前進程的內核棧。


 

進程上下文與中斷上下文

什麼是進程上下文?

《linux內核設計與實現》書中進程管理的章節對進程上下文有介紹到,書中說當一個程序執行了系統調用或者觸發某個異常(軟中斷),此時就會陷入內核空間,內核此時表明進程執行,並處於進程上下文中。爲了更好的加深理解,總結以下:

程序在執行過程當中一般有用戶態和內核態兩種狀態,CPU對處於內核態根據上下文環境進一步細分,所以有了下面三種狀態:

  1. 內核態,運行於進程上下文,內核表明進程運行於內核空間。

  2. 內核態,運行於中斷上下文,內核表明硬件運行於內核空間。

  3. 用戶態,運行於用戶空間。


上下文context: 上下文簡單說來就是一個環境。

用戶空間的應用程序,經過系統調用,進入內核空間。這個時候用戶空間的進程要傳遞不少變量、參數的值給內核,內核態運行的時候也要保存用戶進程的一些寄存 器值、變量等。所謂的「進程上下文」,能夠看做是用戶進程傳遞給內核的這些參數以及內核要保存的那一整套的變量和寄存器值和當時的環境等。


相對於進程而言,就是進程執行時的環境。具體來講就是各個變量和數據,包括全部的寄存器變量、進程打開的文件、內存信息等。一個進程的上下文能夠分爲三個部分:用戶級上下文、寄存器上下文以及系統級上下文

  1. 用戶級上下文: 正文、數據、用戶堆棧以及共享存儲區;

  2. 寄存器上下文: 通用寄存器、程序寄存器(IP)、處理器狀態寄存器(EFLAGS)、棧指針(ESP);

  3. 系統級上下文: 進程控制塊task_struct、內存管理信息(mm_struct、vm_area_struct、pgd、pte)、內核棧。


當發生進程調度時,進行進程切換就是上下文切換(context switch).操做系統必須對上面提到的所有信息進行切換,新調度的進程才能運行。而系統調用進行的模式切換(mode switch)。模式切換與進程切換比較起來,容易不少,並且節省時間,由於模式切換最主要的任務只是切換進程寄存器上下文的切換。


什麼是中斷上下文?

硬件經過觸發信號,致使內核調用中斷處理程序,進入內核空間。這個過程當中,硬件的一些變量和參數也要傳遞給內核,內核經過這些參數進行中斷處理。所謂的「中斷上下文」,其實也能夠看做就是硬件傳遞過來的這些參數和內核須要保存的一些其餘環境(主要是當前被打斷執行的進程環境)。中斷時,內核不表明任何進程運行,它通常只訪問系統空間,而不會訪問進程空間,內核在中斷上下文中執行時通常不會阻塞。


 

總結

當一個進程在執行時,CPU的全部寄存器中的值、進程的狀態以及堆棧中的內容被稱爲該進程的上下文。

當內核須要切換到另外一個進程時,它須要保存當前進程的全部狀態,即保存當前進程的上下文,以便在再次執行該進程時,可以獲得切換時的狀態執行下去。

在LINUX中,當前進程上下文均保存在進程的任務數據結構中。在發生中斷時,內核就在被中斷進程的上下文中,在內核態下執行中斷服務例程。但同時會保留全部須要用到的資源,以便中繼服務結束時能恢復被中斷進程的執行。


耐心的品味一下這篇文章,多讀幾遍,相信你的專業知識體系會有必定的提升!

相關文章
相關標籤/搜索