系統呼叫
系統呼叫是應用程式和作業系統核心的介面,無論程式是直接進行系統呼叫還是通過執行庫,最終還是會到達系統呼叫層面上。
之所以要系統呼叫,是因為現在作業系統都將可能產生衝突的系統資源給保護起來,組織應用程式直接訪問。這些系統資源包括檔案、網路、io、各種裝置等。所有的這些操作都必須經由作業系統所規定的方式來進行。
在linux中系統呼叫使用0x80中斷作為系統呼叫的入口,windows採用0x2e中斷作為入口。
linux系統呼叫
在x86下,系統呼叫由0x80中斷完成,各個通用暫存器用於傳遞引數,eax暫存器用於表示系統呼叫的介面號,比如eax = 1 表示程序退出(exit),eax = 2 表示建立程序(fork).linux系統呼叫與eax對應如下:
eaxsystem call
exit
fork
read
write
open
close
waitpid
create
系統呼叫還涉及許可權管理(sys_setuid等)、定時器(sys_timer_create)、訊號(sys_sigaction)、網路(sys_epoll)等,這些系統可以在程式中直接使用。
系統呼叫弊端
使用不便
各個作業系統不相容
於是,執行庫就出現了。執行庫特點:
使用簡便
形式統一
系統呼叫原理
現在的cpu可以在不同的特權級別下執行指令,通常有兩種特權級別,分別為使用者模式(user mode)和核心模式(kernel mode),也稱使用者態和核心態。系統呼叫是執行在核心態的,而應用程式基本是執行在使用者態的。作業系統一般通過中斷從使用者態到核心態的。
中斷一般具有兩個屬性,乙個是中斷號,乙個是中斷處理程式(interrupt service routine,isr)。不同的中斷具有不同的中斷號,而同時乙個中斷處理程式一一對應乙個中斷號。
通常意義下,中斷有兩種型別,一種成為硬體中斷,這種中斷來自於硬體的異常或者其他事件發生。另一種成為軟體中斷,軟體中斷通常是一條指令(i386下是int),帶有乙個引數記錄中斷號,使用這條指令可以觸發中斷並執行中斷處理程式。例如在i386下,int 0x80會呼叫0x80號中斷處理程式。
由於中斷號有限,系統呼叫通常是用同乙個中斷號來對應的。用系統呼叫號來區分具體是哪個系統呼叫,例如linux中fork的系統呼叫號是2,系統呼叫號是通過eax暫存器傳入的。
系統呼叫過程
1 中斷呼叫
2 切換堆疊:在linux中,使用者態和核心態使用的是不同的堆疊,兩者各自負責各自的函式呼叫互不干擾。但在電泳0x80號中斷時,程式從使用者態切換到核心態,這是當前棧必須從使用者棧切換到核心棧。當中斷返回時,程式需要從核心棧切換到使用者棧。
系統呼叫原理
以fork 為例 int main fork fork 是乙個對系統呼叫fork的封裝,可用下列巨集來定義 syscall0 pit t,fork syscall0是乙個巨集函式,i386版本定義如下 define syscall0 type,name type name void long res...
Linux系統呼叫原理
rootfs 使用者空間 kernel 核心空間 檔案系統 裝置驅動 網路協議棧 程序管理 記憶體管理 平台 系統呼叫 七大子系統 uboot 硬體linux系統分為使用者空間和核心空間 使用者空間的特性 包含了應用軟體,c庫,對應的cpu的工作模式為usr模式 不能直接訪問硬體裝置 如果進行記憶體...
Linux 系統呼叫原理
unistd.h檔案記錄著系統呼叫中斷號的資訊。syscall nr kill,sys kill security keys keyctl.c define nr add key 217 syscall nr add key,sys add key syscall define5 add key,c...