中斷與系統呼叫

2022-06-26 22:39:23 字數 1404 閱讀 8182

系統呼叫的概念

程式設計師或系統管理員通常並非直接和系統呼叫打交道,在實際應用中,程式設計師呼叫的的函式,或稱為應用程式介面(api),管理員使用的則是更高層次的系統命令。作業系統為每個系統呼叫在標準c函式庫中構造乙個具有相同名字的封裝函式,由它來遮蔽下層的複雜性,負責把作業系統提供的服務介面----系統呼叫-----封裝成應用程式能夠直接呼叫的函式(庫函式)

系統呼叫通過中斷機制向核心提交請求,它的功能由核心函式實現,進入核心後不同系統呼叫找到各自對應的核心函式,這些核心函式就是系統呼叫的「服務例程」。api實質上是乙個函式定義,說明如何獲得乙個給定服務,如read(),malloc(),free()等。它有可能和系統呼叫形式上一致,如read()函式就和read()系統呼叫對應,但未必總是一一對應,往往會出現不同函式的內部用到同乙個核心函式,如malloc(),free()內部均利用sys_brk()核心函式來擴大或縮小程序堆;乙個函式也可利用幾個核心函式組合完成任務,有些函式不需要任何核心函式,它的實現與核心無關。系統命令相對與程式設計介面有更高的層次,它們是內部引用函式的可執行程式,如常用的系統命令ls,hostname等,而這些命令的實現大多數依靠系統呼叫。

下面以read()為例來了解系統呼叫的執行流程,當應用程式呼叫read(fd,buffer,nbytes)函式時,該函式在linux/gnu提供的標準c庫,即libc中,對應的封裝函式由下面彙編指令實現:

movel  $3,%eax

movel  fd,%ebx

movel  buffer,%ecx

movel  nbutes,%edx      

int  $0x80

在linux中規定int  $0x80指令是系統呼叫的總入口,若干個暫存器中存放應用程式傳遞個核心的引數。核心為了區分不同的系統呼叫,需要給每個都分配唯一的系統呼叫號,而相對應的核心函式的入口位址都放在系統呼叫表中。核心在獲得系統呼叫號後根據暫存器eax中呼叫號的值跳轉到系統呼叫表相應的核心函式,以完成應用程式請求的服務。

系統呼叫的執行流程

系統呼叫與普通c語言函式呼叫最大的區別在於系統呼叫需要陷入核心態,發生特權級的轉換。

1.儲存現場  2.跳到核心函式  3.引數傳遞  

4.系統呼叫封裝

應用程式發出的系統呼叫是同步事件,雖然它在核心態執行,但卻在呼叫程序的上下文中,所以既可以訪問程序位址空間,也可以訪問核心空間。system_call()在核心棧上儲存硬體上下文,然後使用系統呼叫號作為系統呼叫表system_call_table的索引,以確定system_call()應該執行哪個系統呼叫對應的核心函式。當系統呼叫執行結束後,system_call()在對應的暫存器eax中放入返回的int值或錯誤碼,並從核心棧恢復硬體上下文,回到使用者態並把控制權交給庫函式,庫函式再返回給應用程式。

5.系統呼叫上下文

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

linux中斷與系統呼叫

1.系統使用巨集syscallx 將相應的系統呼叫定義為其同名函式。呼叫中斷int 0x80.並將引數傳送到相應的暫存器中,供entry system call 使用。2.進入entry system call 中,當系統呼叫合法時,根據索引值,在sys call table中找到相應的實際服務程式...

中斷 異常 系統呼叫

還是之前計算機只能乙個乙個的處理作業,cpu資源利用率低下,為了解決這個問題,人們發明了作業系統,引入中斷機制,實現了多道程式併發執行。本質 發生中斷就意味著需要作業系統的介入,開展管理工作。當中斷發生時,cpu立即進入核心態 當中斷發生後,當前執行的程序暫停執行,並由作業系統核心對中斷進行處理。對...

可被中斷的系統呼叫

早期的unix系統,如果程序在乙個 慢 系統呼叫中阻塞時,捕獲到乙個訊號,這個系統呼叫被中斷,呼叫返回錯誤,設定errno為eintr。這表明,不是這個系統呼叫錯出了,而是被中斷了,需要再次啟動。系統呼叫被分為慢系統呼叫和其他兩大類別。慢系統呼叫可以被永久阻塞,包括以下幾個類別 1 讀寫 慢 裝置 ...