系統調用的實現與一般過程調用的實現相比,兩者間有很大差異。對于系統調用,控制是由原來的用戶態轉換為系統態,這是借助于中斷和陷入機制來完成的,在該機制中包括中斷和陷入硬件機構及中斷與陷入處理程序兩部分。
中斷和陷入硬件機構
圖1所示為中斷的處理過程。中斷可進一步分為外中斷和內中斷。外中斷是指由于外部設備事件所引起的中斷,如通常的磁盤中斷、打印機中斷等;而內中斷則是指由于CPU內部事件所引起的中斷,如程序出錯(非法指令、地址越界)等。內中斷(trap)也被譯為“陷入”或“陷阱”。

通常,陷入是由于執行了現行指令引起的,而中斷則是由于系統中某事件引起的,該事件與現行指令無關。為了處理上的方便,通常針對不同的設備編制不同的中斷處理程序,并把該程序的入口地址放在某特定的內存單元中。此外,不同的設備也對應著不冋的處理機狀態字PSW,且把它放在與中斷處理程序入口指針相鄰接的特定單元中。在進行中斷處理時,只要有了這樣兩個字,便可轉入相應設備的中斷處理程序,重新裝配處理機的狀態字和優先級,進行對該設備的處理,因此這兩個字被稱為中斷向量。相應地,把存放這兩個字的單元稱為中斷向景單元。類似地,對于陷入也有陷入向量表。由所有的中斷向景和陷入向景構成了中斷和陷入向量表。
系統調用號和參數的設置
通常,一個系統中設置了幾十條甚至上百條系統調用,系統賦予每條系統調用一個唯一的系統凋用號。在有的系統中,直接把系統凋用號放在系統凋用命令中,如IBM370和早期的UNIX系統,是用系統調用命令的低8位存放系統調用號;在另一些系統中,則將系統調用號裝入某指定寄存器或內存單元中,如MS-DOS是將系統調用號放在AH寄存器中。每一條系統調用都含有若干個參數,在執行系統調用時,設置系統調用所需的系數通常有兩種方式。
(1)直接將參數送入相應的寄存器中。這是一種最簡單的方式,MS-DOS采用的便是這種方式,即用MOV指令將各個參數送入相應的寄存器中。這種方式的主要問題是由于寄存器數量有限,因而限制了所設置參數的數目。
(2)參數表方式。將系統調用所需的參數放入一張參數表中,再將指向該參數表的指針放在某個指定的寄存器中。在當前大多數的OS中,如UNIX系統,便是采用了這種方式。該方式又可進一步分成直接和間接兩種方式,如圖2所示。在直接參數方式中,將所有的參數值和參數的個數N都放入一張參數表中;而在間接參數方式中,則在參數表中僅存放參數個數和指向真正參數數據表的指針。

系統調用的處理步驟
在設置了系統凋用號和參數后,便可執行一條系統凋用命令。不同的系統可采用不同的執行方式。在UNIX系統中,是執行CHMK命令;而在MS-DOS中則是執行INT21軟中斷。
系統調用的處理過程可分成以下3步。
(1)將處理機狀態由用戶態轉為系統態;之后,由硬件和內核程序進行系統調用的一般性處理,即首先保護被中斷進程的CPU環境,將處理機狀態字PSW、程序計數器PC、系統調用號、用戶找指針以及通用寄存器內容等壓入堆棧;然后,將用戶定義的參數傳送到指定的地方保存起來。
(2)分析系統調用類型,轉入相應的系統調用處理子程序。為使不同的系統調用能方便地轉向相應的系統調用處理子程序,在系統中配置了一張系統調用入口表。表中的每個表目都對應一條系統調用,其中包含該系統調用自帶參數的數目、系統調用處理子程序的入口地址等。內核可利用系統調用號去查找該表,即可找到相應處理子程序的入口地址而轉去執行它。
(3)在系統調用處理子程序執行完后,恢復被中斷的或設置新進程的CPU現場,然后返冋被中斷進程或新進程,繼續往下執行。
系統調用處理子程序的處理過程
系統調用的功能主要是由系統調用子程序來完成的。對于不同的系統調用,其處理程序將執行不同的功能。
下面以一條在文件操作中常用的creat命令為例來說明處理子程序的處理過程。進入creat的處理子程序后,內核將根據用戶給定的文件路徑名Path,利用目錄檢索過程,去查找指定義件的目錄項。查找目錄的方式可以用順序查找法,也可用Hash查找法。如果在文件目錄中找到了指定文件的目錄項,表示用戶要利用一個已有文件來建立一個新文件。但如果在該巳有(存)文件的屬性中有不允許寫屬性,或者創建者不具有對該文件進行修改的權限,便認為是出錯,隨即做出錯處理;若不存在訪問權限問題,便將巳存文件的數據盤塊釋放掉,準備寫入新的數據文件。如未找到指名文件,則表示要創建一個新文件,內核便從其目錄文件中找出一個空目錄項,并初始化該目錄項,包括填寫文件名、文件屬性、文件建立日期等,然后將新建文件打開。
新聞熱點
疑難解答