Linux系統呼叫

2021-08-20 04:39:23 字數 1344 閱讀 8382

系統呼叫其實就是函式呼叫,區別是呼叫核心態的函式。但是使用者態到核心態不是隨意切換的,所以通過系統呼叫介面實現使用者態到核心態的切換,在保護機制的計算機系統中,使用者必須通過軟體中斷或陷入的方式使程序從使用者態切換為核心態。

在i386體系中,linux系統呼叫介面是通過軟中斷指令int 0x80使程序從使用者態進入核心態的,這個過程也叫「陷入」。系統呼叫介面呼叫軟中斷指令int 0x80的時候,這個指令會發生乙個中斷向量碼為128的中斷請求,並在響應過程中將程序從使用者態切換為核心態。

通過軟中斷0x80,系統會跳轉到乙個預設好的核心空間位址,它指向了系統呼叫處理程式,即在entry.s檔案中的system_call函式。也就是,所有的系統呼叫都會統一跳轉到這個位址執行system_call()函式。

因為linux只允許系統呼叫介面使用128這乙個中斷向量,並在中斷號為128的中斷服務例程中,呼叫不同呼叫不同的核心服務例程,所以,系統呼叫介面除了要引發int 0x80軟中斷外,為了進入內河後呼叫不同的核心服務例程,還需要提供識別核心服務例程的引數,稱之為「系統呼叫號」。

每個系統呼叫都有對應的系統呼叫號,同時核心中有乙個system_call_table陣列,它是個函式指標陣列,每個函式指標都指向了系統呼叫的服務例程,下標就是該核心服務例程的系統呼叫號,用以指明到底執行哪個系統呼叫。當int 0x80軟中斷執行時,系統呼叫號會放入eax暫存器中,system_call函式可以讀取eax暫存器獲得系統呼叫號,將其乘以4得到偏移位址,以sys_call_table為基位址,基位址加上偏移位址就是應該執行的系統呼叫服務例程(核心服務例程)的位址。

引數依次存放在暫存器eaxebxecxedxesi中,當系統呼叫的引數大於5個時(因為上面5個暫存器用完了),執行int 0x80執行仍需將系統呼叫功能號儲存在eax中,所不同的只是引數應該依次存放在一塊連續的記憶體區域內,同時在暫存器eax中儲存指向該記憶體區域的指標。

系統呼叫完成後,返回值仍將儲存在暫存器eax中。由於只是需要一塊連續的記憶體區域來儲存系統呼叫的引數,因此可以完全像普通函式呼叫一樣使用棧(stack)來傳遞系統呼叫所需的引數。但是,注意引數以相反的順序進棧,先進後出,即應該最後乙個引數先進棧,第乙個引數最後進棧。如果採用棧來傳遞系統呼叫所需要的引數,在執行int $0x80指令時還應該將棧指標的當前值複製到暫存器ebx中。

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...