Linux系統呼叫

2021-10-13 23:07:39 字數 1648 閱讀 6574

之前一直不太懂系統呼叫,總結一下方便自己學習。

系統呼叫是使用者空間程序和核心之間的中間層,它的作用有以下兩點:

在linux系統中,系統呼叫是使用者空間訪問核心的唯一手段。

在linux中,每個系統呼叫都有乙個系統呼叫號,通過系統呼叫號來關聯系統呼叫。當使用者空間的程序執行乙個系統呼叫時,用系統呼叫號來指明所使用的系統呼叫。

核心記錄了系統呼叫表中所有已註冊過的系統呼叫的列表,儲存在sys_call_table中。每種體系結構都明確定義了該錶,在x86-64中,它定義於arch/i386/kernel/syscall_64.c檔案中,該錶為每乙個有效的系統調指定了唯一的系統呼叫號。

linux很短的上下文切換時間使得其系統呼叫比多數作業系統執行的快,進出核心都被優化的簡潔高效。

使用者空間的程式無法直接執行核心**,不能直接呼叫核心空間中的函式,因為核心駐留在受保護的位址空間上。因此,應用程式以某種方式通知系統,告訴核心自己需要執行乙個系統呼叫,希望系統切換到核心態,這樣核心就可以代表應用程式在核心空間執行系統呼叫。

通知核心的機制是靠軟中斷實現的。通過引發乙個異常來促使系統切換到核心態去執行異常處理程式,此時的異常處理程式就是系統呼叫處理程式。在核心中有乙個中斷向量表陣列,該陣列中是中斷處理程式的指標。中斷到來時,cpu暫停執行中的**,根據中斷號在中斷向量表中找到對應的中斷處理程式並呼叫它。在x86系統上預定義的軟中斷是中斷號128,通過int $0x80指令觸發該中斷,該指令會觸發乙個異常導致系統切換到核心態並執行128號異常處理程式,叫system_call(),它與硬體體系結構緊密相關。

在陷入核心之前,使用者空間把相應系統呼叫所對應的系統呼叫號放入eax暫存器中,通過這種方式將系統呼叫號傳遞給核心,系統呼叫程式執行時就可以從eax中得到資料。system_call()函式通過比較nr_syscalls(系統呼叫的總數)和給定的系統呼叫號來檢查其有效性,如果該系統呼叫號大於等於nr_syscalls,則返回enosys,否則執行系統呼叫call *sys_call_table(,%rax,8)

除系統呼叫號以外,大部分系統呼叫還需要一些外部引數輸入。所以在發生陷入的時候,需要把這些引數從使用者空間傳遞給核心。其與傳遞系統呼叫號的方式相同,將引數存放在暫存器中。

當作業系統收到系統呼叫請求後:

根據中斷號中斷向量表中找到對應的中斷處理程式並呼叫;

根據eax暫存器中的系統呼叫號以及輸入的外部引數來執行對應的系統呼叫函式

結果返回給使用者**。

linux 系統呼叫

使用者應用可以通過兩種方式使用系統呼叫。第一種方式是通過c庫函式,包括系統呼叫在c庫中的封裝函式和其他普通函式。圖5.2 使用系統呼叫的兩種方式 第二種方式是使用 syscall巨集。2.6.18版本之前的核心,在include asm i386 unistd.h檔案中定義有7個 syscall巨集...

Linux系統呼叫

一 實驗目的和要求 1.學習linux核心的配置和編譯 2.深入理解linux系統呼叫 3.理解arm和x86的cpu模式 系統模式 使用者模式 的不同 4.掌握核心模組的編寫方法。二 實驗器材 1.linux實驗板卡一塊 2.5v 1a電源乙個 3.microusb線一根 4.macos一台 5....

Linux系統呼叫

linux系統呼叫 系統呼叫 system call 是使用者空間訪問核心的唯一手段,除異常和陷入外,他們是核心唯一的合法入口。通常情況下應用程式是通過應用程式設計介面api來訪問函式,而不是直接使用系統呼叫來程式設計。作業系統通常是通過中斷從使用者態切換到核心態。中斷就是乙個硬體或軟體請求,要求c...