03系統呼叫

2021-10-12 07:04:14 字數 1891 閱讀 3498

1、系統呼叫的作用

系統呼叫是使用者空間訪問核心的唯一手段,除異常和陷入外,它們是核心唯一的合法入口。系統呼叫在使用者空間程序和硬體裝置之間新增了乙個中間層。它有三個作用:

2、api、posix和c庫的關係

一般應用程式通過使用者空間實現的應用程式設計介面(api)而不是直接通過系統呼叫來程式設計。程式設計師只需要和api打交道。核心只跟系統呼叫打交道。在unix世界中,最流行的應用程式設計介面是基於posix標準的。

3、系統呼叫概述

系統呼叫通常通過c庫中定義的函式呼叫來進行。系統呼叫出現錯誤時c庫會把錯誤碼寫入errno全域性變數。通過呼叫perror()庫函式,可以把該變數翻譯成使用者可以理解的錯誤字串。

系統呼叫號:在linux中,每個系統呼叫被賦予乙個系統呼叫號。通過這個獨一無二的號就可以關聯系統呼叫。一旦分配就不能再有任何變更,否則編譯好的應用程式就會崩潰。核心用sys_call_table記錄註冊過的系統呼叫。

linux系統呼叫比其他作業系統執行的快有兩個原因。一是因為linux有很短的上下文切換時間。二是系統呼叫處理程式和每個系統呼叫都很簡潔。

4、系統呼叫處理程式

(1)應用程式需要通過核心執行系統呼叫的好處

核心駐留在受保護的位址空間上,如果程序可以直接在核心的位址空間上讀寫的話,系統的安全性和穩定性將不復存在。所以應用程式應該以某種方式通知系統,告訴核心自己需要執行乙個系統呼叫。

(2)應用程式通知核心執行系統呼叫的機制

應用程式實際在api中呼叫的系統呼叫也並不是直接執行核心**,而是應用程式以軟中斷的方式來通知系統執行乙個系統的呼叫,通過引發乙個異常來促使系統切換到核心態去執行異常處理程式。此時的異常處理程式就是系統呼叫處理程式system_call()

(3)應用程式如何將引數以及系統呼叫號傳遞給核心

在x86上,系統呼叫號是通過eax暫存器傳遞給核心的。除了系統呼叫號以外,一些外部的引數輸入像傳遞系統呼叫號一樣,存放在暫存器裡傳遞給核心。給使用者空間的返回值也通過暫存器傳遞。在x86系統上,也存放在eax暫存器中。

5、實現自己的系統呼叫

unix格言提供機制而不是策略。也就是unix只提供工具,具體使用什麼工具以及怎麼使用工具最終完成乙個任務unix不管。當寫乙個系統呼叫時,要時刻注意可移植性和健壯性,還要為以後做打算。

系統呼叫必須仔細檢查所有引數是否合法有效,目的是避免系統的安全和穩定將受到威脅。具體做到以下三點:

6、系統呼叫上下文

核心在執行系統呼叫的時候處於程序上下文。current指標指向引發當前系統呼叫的程序。

使用者空間訪問自己編寫的系統呼叫:系統呼叫靠c庫支援,自己實現的系統呼叫c庫並不提供支援。linux本身提供了一組巨集可以用於直接對系統呼叫進行訪問。這些巨集是_syscalln(),其中n的範圍從0到6,代表需要傳遞給系統呼叫的引數個數,直接呼叫此系統呼叫的巨集的形式如下。對於每個巨集來說,都有2+2*n個引數,第乙個引數對應返回值型別,第二個引數是系統呼叫的名稱。再以後是按照系統呼叫引數的順序排列的每個引數的型別和名稱。

#define nr_open 5

_syscall3(long, open, const char*, filename, int, flags, int ,mode)

系統呼叫的優點有:系統呼叫建立容易且使用方便;linux系統呼叫的高效能顯而易見。但還是盡量不要實現自己的系統呼叫:這樣避免每出現一種新的抽象就簡單加入乙個新的系統呼叫,使得linux穩定簡潔且功能完善。

03 系統呼叫方式檔案程式設計

上篇文章提到,linux應用程式設計中需要的外部函式主要由函式庫 標c及其拓展 和系統呼叫 posix及其拓展 來提供。本篇就通過例項,講解通過 系統呼叫 glibc呼叫linux核心的函式 來實現檔案程式設計。命令格式 man number function這個是檢視函式的命令 number的取值...

03 系統呼叫 核心處理流程

核心版本 v2.6.38 體系架構 arm 參考 檔名說明 系統呼叫介面宣告 系統呼叫號定義 arch arm kernel calls.s系統呼叫表內容 arch arm kernel entry common.s系統呼叫表定義 系統呼叫入口定義 異常向量表 arch arm kernel ent...

read系統呼叫,mmap系統呼叫

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