linux 系統調用的來龍去脈 -上-

作者:頭條 程序猿李巍

《linux 系統調用的來龍去脈》分爲上下兩篇,本文爲上篇。

1. 前言

開始正題前先講兩個生活小案例來引出系統調用的意義。

案例一:圖書館

安居不用架高堂,書中自有黃金屋。娶妻莫恨無良媒,書中自有顏如玉。

圖書館是我喜歡去的一個地方,相信大家也都去過。在圖書館我們可以自由閱讀任何書,廣泛地汲取各種知識。正是由於所有人都可以自由地閱讀任意書籍,所以經常就會出現書籍位置出現錯亂,書籍頁面出現損壞,甚至還會出現書籍遺失的情況。

實例二:收藏館
價值連城的藝術品往往存放在特定溫度和溼度的存儲櫃中,爲了確保藝術品的安全,通常將它們存放到安全級別很高的收藏館中。如果客戶希望參觀它們,先需要提交申請,進入收藏館後,由專門的人員拿出藝術品供客戶參觀欣賞。這樣保證了藝術品不受破壞,也保證了藝術品的安全。

根據上述兩個例子得出以下結論:
如果每個用戶都能自由使用 “資源”,隨着時間的推移,“資源” 就會出現損壞。
如果 “資源” 由 “專業人員” 管理,每個用戶只能間接的使用 “資源”,這樣就可以安全的長久的使用 “資源”。

2. 如何保證系統安全性

操作系統提供給應用程序運行環境,讓各種應用得以運行。在應用程序運行過程中有些操作是非常危險的,如果每個應用程序都能自由進行任何操作,就有可能帶來如下各種問題:

1、多個應用程序直接去操作硬件外設,就會出現相互衝突,可能會出現需要應用程序 A 的讀取數據,被應用程序 B 讀取的情況。

2、多個應用程序被加載到內存,應用程序 A 佔用了一個內存區域 Z,應用程序 B 自己強制清空內存區域 Z,那麼就給應用程序 A 帶來致命問題。

3、部分應用程序需要硬件中斷讓自己在合適的時機開始執行,如果其它應用程序把中斷關掉,那麼這些依靠中斷觸發的應用程序將再也得不到執行。

在應用程序運行過程中有些危險的操作將會對其它應用程序造成傷害,甚至會對操作系統造成傷害,導致系統崩潰。如果所有應用程序都可以使用這些操作,那麼整個系統將是不穩定的,不安全的。

如何防止應用程序對其它應用程序和操作系統造成傷害?

造成這種問題的原因是每個應用程序都可以自由的使用關鍵 “資源”,這就類似上文提到的圖書館模式,每個人都可以自由閱讀所有書籍,所以容易出現書籍損壞(影響其它人閱讀)。

爲了讓應用程序都能正常運行不受其它應用程序傷害,爲了系統能安全,穩定的長久運行,系統需要使用收藏館模式。在收藏館模式下關鍵 “資源” 由“專業人員”管理,每個應用程序只能間接的使用“資源”。

3. 特權級

爲了讓系統系統能安全,穩定的長久運行,必須有一個有特權的 “專業人員” 對核心資源進行管理,那麼就帶來兩個問題:
1、專業人員的特權是什麼?
2、如何獲取特權?

特權是啥?
計算機的硬件和軟件是共同在發展,爲了適應操作系統,處理器發展出兩種權限模式:用戶模式和特權模式。
以 ARM V7 體系架構爲例,爲了提高穩定性,ARM V7 體系處理器有 7 種運行模式,每種運行模式的使用權限不一樣,有六種特權模式和一種用戶模式,如下圖所示:

由圖可知:FIQ,IRQ,SVC,ABT,UND,SYS 這六種模式是特權模式,USR 是用戶模式。在用戶模式下有些指令是無法操作的,如進行 MMU 或 cache 的操作,在特權模式下任何指令都是可以操作的。

這就回答了第一個問題 “專業人員的特權是什麼”,“專業人員”可以使用處理的特權模式,這樣 “專業人員” 就可以在處理器上進行任何操作。而應用程序則在用戶模式下,只運行在處理器上進行部分操作。在 ARM V7 體系架構種 SVC 模式是爲 “專業人員” 提供的特權模式。

如何獲取特權?

硬件中斷是在電平變化時引發中斷操作,而軟中斷是通過一條具體指令 SWI,當 CPU 執行到 SWI 指令時會觸發中斷,進入中斷程序(中斷模式是特權模式)。

以 ARM V7 體系架構爲例,軟件中斷指令(SVC)用於產生軟中斷,實現從用戶模式變換到特權模式。

SVC 彙編指令如下:

SVC  {cond}  immed_24
//其中immed_24  24位立即數,值爲從0~16777215之間的整數。

這就回答了第二個問題 “如何獲取特權?”,使用軟件中斷指令進入中斷,“專業人員” 在中斷模式下,中斷模式也是特權模式。

總結:爲了讓系統系統能安全,穩定運行,重要資源有 “專業人員” 操作,應用程序可以通過軟中斷指令 “召喚”“專業人員” 來完成相關操作。

4. 內核態

在計算機軟件系統中包含一個名爲操作系統的程序集合,在這個程序集合包括內核,設備驅動程序,啓動引導程序,shell 程序,文件管理工具等,其中最重要的程序稱爲內核(kernel)。計算機的軟件系統的模式和能力由內核決定,內核爲操作系統中的所有事物提供了主要的功能,同時決定了上層應用軟件的很多特性。

用戶界面和應用程序是操作系統的外在表象,內核纔是操作系統的內在覈心!系統的其它部分必須依賴內核這個程序。
通俗的描述就是:內核是操作系統中最重要的一個程序!操作系統中的其它程序都依賴這個內核程序!

內核爲何如此重要?內核在操作系統中完成了以下兩個重要功能:
1、與計算機硬件交互。
2、爲計算機系統中的應用程序提供執行環境。

內核可以被稱作管理者,因此前文說到的 “專業人員” 就是指的內核。內核運行在計算機的特權模式下,這樣使得內核有了 “無所不能” 的能力,通常我們將運行在特權模式下的內核稱爲 “內核態”,運行在用戶模式的用戶程序稱爲 “用戶態”。內核擁有特權,無所不能,系統的其它部分都依賴內核,操作系統中內核就是一個王者般的存在。

5. 系統調用

爲了保證操作系統的安全性,比如創建進程或者硬件交互這種操作不能由應用程序去完成,而必須讓操作系統內核來完成。但是應用程序就有比如創建進程或者硬件交互這種操作需求,如何滿足應用程序的需求?
系統調用提供了應用程序和操作系統之間的接口,應用程序通過系統調用實現其與操作系統的通信,並可取得操作系統的服務。

當應用程序中需要操作系統提供服務時,如創建進程或執行 I/O 操作,應用程序必須使用系統調用。處理器捕獲到該命令後,便將處理器的狀態從用戶態轉換爲內核態(特權模式),然後操作系統在特權模式下執行相應的程序,執行完成後,系統又將處理器狀態從內核態轉換到用戶態,繼續執行應用程序。

系統調用是應用程序請求操作系統內核完成某功能的一種過程調用,它與一般的過程調用的最大差別:

  1. 狀態不同。一般的過程調用其調用程序和被調用程序運行在相同的狀態,而系統調用是調用程序是運行在用戶態,而被調用程序是運行在內核態態。
  2. 狀態轉換。由於系統調用的調用和被調用過程工作在不同的系統狀態,因而不能由調用過程直接轉向被調用過程,需要通過軟中斷機制。用戶態觸發中斷,處理器產生中斷,系統切換到內核態(特權態),經操作系統內核根據傳入的調用號,執行相應的系統調用處理程序。

系統調用本質上是應用程序請求操作系統內核完成某功能時的一種過程調用。通俗的說法就是遇到事情叫大哥出馬!

6. 系統調用模型

由於 linux 系統調用比較複雜,因此我們先講述系統調用的模型,然後再講述 linux 的系統調用實現。
系統調用的本質是:應用程序請求操作系統內核完成某個功能。

我們根據系統調用的本質,將系統調用分解成如下三板斧:
第一板斧:系統調用請求。
應用程序可以根據自身需求自由調用系統請求,應用程序傳遞參數給系統調用請求函數,在系統調用請求函數內部,通過指令觸發軟中斷。以 ARM V7A 體系架構爲例,軟件使用 SVC 指令產生軟中斷。

第二板斧:處理器響應請求進入特權模式。
由於在系統調用請求函數內部執行軟中斷指令,此時處理器暫停當前用戶程序,進入軟中斷函數,此時處理器進入特權模式,在中斷函數中完成一些準備工作後,執行功能函數。

第三板斧:在特權模式下內核完成某個功能。
一個特定功能的函數被軟中斷函數調用,執行功能函數期間處理器處於特權模式下。

系統調用的三板斧模型如下:

根據系統調用模型,用 C 語言實現一個簡單的系統調用,C 語言代碼實例如下:

實現的 3 個函數功能如下:
request 函數是一個調用接口函數,實現軟中斷觸發功能。
irq_handler 函數爲軟中斷響應函數,該函數主要是完成調用功能函數。
function 函數爲在內核態實現的特定功能。
C 語言實現的系統調用的基本模型的調用流程如下:

上述這個簡單的系統調用,實現了一個具體功能爲 function 函數的系統調用,並且這個系統調用只有一個功能函數,實現了從零到一的過程。
接下來增加難度,不是隻實現 1 個具體功能,而是要實現 10 個功能,如何實現?

有兩種策略可以實現多個功能的系統調用:
策略 1:使用多個軟中斷,每個軟中斷函數執行一個功能函數。

策略 2:使用一個軟中斷,在軟中斷函數中根據傳入的參數,執行不同的功能函數。

對比上述兩種策略:
策略 1 使用多個軟中斷,這種模式每個軟中斷對應一個功能函數,這樣系統響應速度會快一些,但是劣勢非常明顯,系統調用的數量直接受處理器硬件影響,系統移植性較差。

策略 2 使用一個軟中斷,這種方式在觸發軟中斷時向軟中斷函數傳入一個調用號,在中斷中函數中根據調用號執行指定的功能函數,由於多進行了一些操作,系統響應速度會慢一點,但是優勢也非常明顯,系統調用的個數幾乎不受限制,對處理器硬件要求低,系統移植性強。

Linux 系統調用就是使用的策略 2,綜上所述系統調用可以拆分爲以下 3 個基本要素:
1、調用請求,傳入參數和調用號,觸發軟中斷。
2、響應請求,進入中斷函數,根據調用號執行指定的功能函數
3、功能實現,在內核態下實現特定功能。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Y2wk82xzcgXcVzzwy-6Gkg