系統呼叫實現過程

2021-08-10 02:25:58 字數 2047 閱讀 1739

系統呼叫的實現與一般過程呼叫的實現相比,兩者間有很大差異。對於系統呼叫,控制是由原來的使用者態轉換為系統態,這是借助於中斷和陷入機制來完成的,在該機制中包括中斷和陷入硬體機構及中斷與陷入處理程式兩部分。

中斷和陷入硬體機構

圖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查詢法。如果在檔案目錄中找到了指定檔案的目錄項,表示使用者要利用乙個已有檔案來建立乙個新檔案。但如果在該巳有(存)檔案的屬性中有不允許寫屬性,或者建立者不具有對該檔案進行修改的許可權,便認為是出錯,隨即做出錯處理;若不存在訪問許可權問題,便將巳存檔案的資料盤塊釋放掉,準備寫入新的資料檔案。如未找到指名檔案,則表示要建立乙個新檔案,核心便從其目錄檔案中找出乙個空目錄項,並初始化該目錄項,包括填寫檔名、檔案屬性、檔案建立日期等,然後將新建檔案開啟。

linux 系統呼叫執行過程

簡單總結一下linux的系統呼叫過程 層次如下 使用者程式 c庫 即api int 0x80 system call 系統呼叫服務例程 核心程式 先說明一下,我們常說的使用者api其實就是系統提供的c庫。系統呼叫是通過軟中斷指令 int 0x80 實現的,而這條int 0x80指令就被封裝在c庫的函...

系統呼叫過程詳解

整個過程如下 首先指令流執行到系統呼叫函式時,系統呼叫函式通過int 0x80指令進入系統呼叫入口程式,並且把系統呼叫號放入 eax中,如果需要傳遞引數,則把引數放入 ebx,ecx和 edx中。進入系統呼叫入口程式 system call 後,它首先把相關的暫存器壓入核心堆疊 以備將來恢復 這個過...

系統呼叫sys write的過程

user space 只能通過系統呼叫來訪問kernel提供的函式,下面以sys read 為例 sys write函式宣告在include linux syscalls.h檔案中。這個檔案中申明了linux kernel提供的所有系統呼叫 asmlinkage long sys write uns...