linux系統呼叫
系統呼叫(system call)是使用者空間訪問核心的唯一手段,除異常和陷入外,他們是核心唯一的合法入口。通常情況下應用程式是通過應用程式設計介面api來訪問函式,而不是直接使用系統呼叫來程式設計。
作業系統通常是通過中斷從使用者態切換到核心態。中斷就是乙個硬體或軟體請求,要求cpu暫停當前的工作,去處理更重要的事情。
比方。在x86機器上能夠通過int指令進行軟體中斷。而在磁碟完畢讀寫操作後會向cpu發起硬體中斷。
中斷有兩個重要的屬性,中斷號和中斷處理程式。中斷號用來標識不同的中斷,不同的中斷具有不同的中斷處理程式。在作業系統核心中維護著乙個中斷向量表(interrupt vector table)。這個陣列儲存了全部中斷處理程式的位址,而中斷號就是對應中斷在中斷向量表中的偏移量。
一般地,系統呼叫都是通過軟體中斷實現的,x86系統上的軟體中斷由int $0x80指令產生。
系統呼叫時會進行使用者態到核心態的切換(linux下的系統呼叫達到319個),在作業系統中,無論使用者級程序還是核心級程序,本質上都屬於同乙個程序,只是執行在核心態的程序可以毫無限制的訪問各種資源,而在使用者態下的使用者程序的各種操作都有著限制,比如不能隨意的訪問記憶體、不能開閉中斷以及切換執行的特權級別。所以它們屬於同一塊pcb,各自擁有使用者棧和核心棧。
系統呼叫需要提供引數及返回值,所以就涉及到:
1、系統呼叫的函式名轉換;
2、系統呼叫的引數傳遞。
(一)、函式名的轉換
每個系統呼叫都有乙個系統呼叫號作為唯一的識別符號,在核心中有一張核心系統呼叫表,表中的元素是系統呼叫函式的起始位址,系統呼叫號是系統呼叫函式在表中的偏移量。所以只要指定系統呼叫號,就可以確定相應的系統呼叫,從而完成函式名的轉換。
舉例來說,exit的呼叫號為1號(不同版本之間存在差異)
通過eax暫存器傳遞系統呼叫號,將1給eax,然後用int指令進行系統呼叫。
(二)、引數傳遞
系統呼叫的引數傳遞使用暫存器,linux最多可以向系統呼叫傳遞6個引數,分別使用%ebx、%ecx、%edx、%esi、%edi和%epb來完成。
當進行系統呼叫時,程序不僅要從使用者態切換到核心態,同時也要完成棧切換,這樣處於核心態的系統呼叫才能在核心棧上完成呼叫。系統呼叫返回時,還要切換回使用者棧,繼續完成使用者態下的函式呼叫。
暫存器%esp(棧指標,指向棧頂)所在的記憶體空間叫做當前棧,比如%esp在使用者空間則當前棧就是使用者棧,否則是核心棧。棧切換主要就是%esp在使用者空間和核心空間間的來回賦值。在linux中,每個程序都有乙個私有的核心棧,當從使用者棧切換到核心棧時,需完成儲存%esp以及相關暫存器的值(%ebx,%ecx…)並將%esp設定成核心棧的相應值。而從核心棧切換會使用者棧時,需要恢復使用者棧的%esp及相關暫存器的值以及儲存核心棧的資訊。在呼叫int指令機型系統呼叫後會把使用者棧的%esp的值及相關暫存器壓入核心棧中,系統呼叫通過iret指令返回,在返回之前會從核心棧彈出使用者棧的%esp和暫存器的狀態,然後進行恢復。
系統呼叫很耗時,要盡量少用。第一,系統呼叫通過中斷實現,需要完成棧切換。第二,使用暫存器傳參,這需要額外的儲存和恢復的過程。
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系統有一套標準的系統呼叫介面,然後硬體驅動會去實現這一系列標準的系統呼叫介面,而使用者空間程序只需去呼叫這些標準系統呼叫介面來操作硬體,這樣寫出的應用程式就是易於移植的。...