系統呼叫是核心提供的使用者程序與核心進行互動的一組介面(是應用程式受限地訪問介面、提供了建立新程序並與已有程序進行通訊的機制、提供了申請作業系統其它資源的能力),是使用者訪問核心的唯一手段。主要是為了保證系統穩定可靠,避免應用程式肆意妄為。
系統呼叫作為使用者空間程序和硬體裝置之間的中間層,主要作用有以下三個方面:
(1)為使用者空間提供了一種硬體的抽象介面,無需了解底層。
(2)保證了系統的穩定和安全。
(3)考慮到每個程序都執行在虛擬系統中。
乙個應用程式設計介面(api)可能包含零個或者多個系統呼叫。程式設計師主要是跟api打交道。類似的還有posix、susv3等。
編譯指令asmlinkage通知編譯器僅從棧中提取該函式的引數,系統呼叫號獨一無二地關聯系統呼叫。若系統呼叫被刪除,那麼用sys_ni_syscall()函式來填充系統呼叫號。系統呼叫號與系統呼叫的對應關係儲存在sys_call_table表中。
核心駐留在受保護的位址空間上,不能直接被使用者空間的程式執行。使用者程式需要告訴核心自己需要執行乙個系統呼叫,希望系統切換到核心態,這樣核心代表應用程式在核心空間中執行系統呼叫。通過引發乙個異常(軟中斷128號:通過init$0x80觸發或者sysenter)是系統切換到核心態去執行異常處理程式(系統呼叫處理程式,名稱為system_call())。
陷入核心(引發異常)同時需要通過eax暫存器將系統呼叫號傳遞給核心。在陷入核心前就需要將系統呼叫號放入eax暫存器中。系統呼叫處理程式一旦執行,就可以從eax中得到資料。
需要傳遞的引數少於等於5個時,可以通過暫存器傳遞,如果多餘5個,則需要乙個單獨的暫存器來存放指向所有這些引數的指標。
設計乙個系統呼叫時,要注意可移植性和健壯性,不但要考慮當前還要為未來做打算。
當系統呼叫返回時,控制權仍在system_call()中,他最終會負責切換到使用者空間中。並繼續執行下去。
理解linux系統呼叫
1.系統呼叫和普通函式完全不同,系統呼叫實際上是0x80號中斷對應的中斷處理程式的子程式。換句話說,在linux系統上,0x80中斷是系統呼叫的統一入口。某個具體的系統呼叫是這個中斷處理程式的子程式,進入具體某個系統呼叫是通過核心定義的系統呼叫號碼來實現的。linux通過執行如下彙編 陷入核心執行系...
Linux 系統呼叫理解
系統呼叫即為linux核心中設定的一組用於實現各種系統功能的子程式,作業系統通過系統呼叫為執行在其上的程序提供服務。由於程序一般不能訪問核心所佔記憶體空間以及呼叫核心函式,為了與使用者態程序進行互動,核心提供一組介面用於應用程式訪問。linux中系統呼叫是使用者空間訪問核心的唯一途徑,除了異常和中斷...
深入理解系統呼叫
一.實驗要求 二.實驗環境搭建 1.安裝開發工具 sudo apt install build essential sudo apt install qemu install qemu sudo apt install libncurses5 dev bison ex libssl dev libe...