系統呼叫二

2021-09-21 18:45:19 字數 1863 閱讀 8502

關於系統呼叫地舉例:

一、與核心通訊

系統呼叫在使用者空間程序和硬體裝置之間新增了乙個中間層,該層主要作用有三個:

(1)它為使用者空間提供了一種硬體的抽象介面。舉例來說,當需要讀寫檔案的時候,應用程式就可以不去管磁碟型別和介質,甚至不用去管檔案所在的檔案系統到底是哪種型別

(2)系統呼叫保證了系統的穩定和安全。作為硬體裝置和應用程式之間的中間人,核心可以基於許可權、使用者型別和其他一些規則對需要進行的訪問進行裁決。舉例:這樣可以避免應用程式不正確的使用硬體裝置,竊取其他程序的資源,或做出其他危害系統的事情。

(3)每個程序都執行在虛擬系統中,而在使用者空間和系統的其餘部分提供這樣一層公共介面,也是處於這種考慮。如果應用程式可以隨意訪問硬體而核心又對此一無所知的話,幾乎就沒法實現多工和虛擬記憶體,當然也不可能實現良好的穩定性和安全性。

二、api、posix和c庫

一般情況下,應用程式通過在使用者空間實現的應用程式設計介面(api)而不是直接通過系統呼叫來程式設計。這點很重要,因為應用程式使用的這種程式設計介面實際上並不需要和核心提供的系統呼叫對應。乙個api定義了一組應用程式使用的程式設計介面。它們可以實現成乙個系統呼叫,也可以通過多個系統呼叫來實現,而完全不使用任何系統呼叫也不存在問題。實際上,api可以在各種不同的作業系統上實現,給應用程式提供完全相同的介面,而它們本身在這些系統上的實現可能迥異。

三、系統呼叫處理程式

(1)使用者空間的程式無法直接執行核心**。它們不能直接呼叫核心空間的函式,因為核心駐留在受保護的位址空間上。如果程序可以直接在核心的位址空間上讀的話,系統的安全性和穩定性將不復存在。

所以,應用程式應該以某種方式通知系統,告訴核心自己需要執行乙個系統呼叫,希望切換到核心態,這樣核心就可以代表應用程式在核心空間執行系統呼叫。

(2)通知核心的機制是靠軟中斷實現的:通過引發乙個異常來促使系統切換到核心態去執行異常處理程式。此時的異常處理程式實際上就是系統呼叫處理程式。在x86的系統上預定義的軟中斷是中斷號128,通過int$0x80指令觸發該中斷。這條指令會觸發乙個異常導致系統切換到核心態並執行第128號異常處理程式,而該程式正是系統呼叫處理程式。在這個處理程式名字起的很貼切,叫system_call().它與硬體體系結構緊密相關,x86-64的系統上在entry_64.s檔案中用組合語言編寫。最近,x86處理器增加了一條叫做sysenter的指令。與int中斷指令相比,這條指令提供了更快、更專業的陷入核心執行系統呼叫的方式。對這條指令的支援很快被加入核心。且不管系統呼叫處理程式被如何呼叫,使用者空間引起異常或陷入核心就是乙個重要的概念。

四、指定恰當的系統呼叫

因為所有的系統呼叫陷入核心的方式都一樣,所以僅僅是陷入核心空間是不夠的。因此必須把系統呼叫號一併傳給核心。在x86上,系統呼叫號是通過eax暫存器傳遞給核心的。在陷入核心之前,使用者空間就把相應系統呼叫所對應的號放入eax中。這樣系統呼叫處理程式一旦執行就可以從eax中得到資料。system_call()函式通過將給定的系統呼叫號與nr_syscalls做比較來檢查其有效性。如果前者大於或者等於後者,該函式就返回-enosys。否則執行相應的系統呼叫

五、引數傳遞

除了系統呼叫號以外,大部分系統呼叫都還需要一些外部的引數輸入。所以,在發生陷入的時候,應該把這些引數從使用者空間傳給核心。最簡單的辦法就是像傳遞系統呼叫號一樣,把這些引數也存在暫存器裡

Linux系統呼叫列表(二)

ioctl i o總控制函式 sysctl 讀 寫系統引數 acct 啟用或禁止程序記賬 getrlimit 獲取系統資源上限 setrlimit 設定系統資源上限 getrusage 獲取系統資源使用情況 uselib 選擇要使用的二進位制函式庫 ioperm 設定埠i o許可權 iopl 改變程...

read系統呼叫,mmap系統呼叫

read系統呼叫,mmap系統呼叫 2012 07 23 09 54 28 分類 linux 標籤 linux 檔案系統 虛擬記憶體 儲存系統 字型大小 訂閱 一般情況下,操作檔案既可以使用標準i o,也可直接使用系統呼叫。兩者有何區別呢?在輸入輸出中,直接使用底層的系統呼叫效率是非常低的,為什麼?...

庫呼叫,系統呼叫

通過這個問題,可以判斷候選人是否具有豐富的程式設計經驗以及是否具有找出這類問題答案的敏銳感覺。簡明的回答是 函式庫呼叫是語言或應用程式的一部分,而系統呼叫是作業系統 的一部分。你要確保弄懂 trap 自陷 這個關鍵字的含義。系統呼叫是在作業系統核心發現乙個 trap 或中斷後進行的。函式庫呼叫 vs...