Linux系統調用接口、系統調用例程和內核服務例程之間的關系
發布時間:2009/2/18 0:00:00 訪問次數:1773
系統調用接口的主要任務是把進程從用戶態切換到內核態。在具有保護機制的計算機系 統中,用戶必須通過軟件中斷或陷阱,才能使進程從用戶態切換為內核態。
在i386體系中,linux的系統調用接口是通過調用軟中斷指令“int $ oxso”使進程從用戶態進入內核態的,這個過程也叫做“陷入”。當系統調用接口調用軟中斷指令“int $ ox80”時,這個指令會發生一個中斷向量碼為128的中斷請求,并在中斷響應過程中將進程由用戶態切換為內核態。
因為linux只允許系統調用接口使用128這一個軟中斷向量,這也就意味著所有的系統調用接口必須共享這一個中斷通道,并在同一個中斷服務例程中調用不同的內核服務例程,所以,系統調用接口除了要引發“int $ ox80”軟中斷之外,為了進人內核后能調用不同的內核服務例程,還要提供識別內核服務例程的參數,這個參數叫做“系統調用號”。也就是說,所有可為進程提供服務的內核服務例程都應具有一個唯一的系統調用號。當然,系統調用接口還應為內核服務例程準各必要的參數。
綜上所述,系統調用接口需要完成以下幾個任務:
●用軟中斷指令“int $ ox80”發生一個中斷向量碼為128的中斷請求,以使進程進入內核態。
●要保護用戶態的現場,即把處理器的用戶態運行環境保護到進程的內核堆棧。
●為內核服務例程準備參數,并定義返回值的存儲位置。
●跳轉到系統調用例程。
●系統調用例程結束后返回。
系統調用例程是系統提供的一個通用的匯編語言程序.其實它是一個中斷向量為128的中斷服務程序,其入口為system_call。它應完成的任務有:
●接受系統調用接口的參數。
●根據系統調用號,轉向對應的內核服務例程,并將相關參數傳遴給內核服務例程。
●在內核服務例程結束后,自中斷返田到系統凋甩接口.
系統調用的過程如圖所示。
從圖中可以看到,系統調用接口是用高級語言來編寫的,而通過調用中斷指令陷入內核后的系統調用例程(即圖中的系統調用處理程序)則是用匯編語言編寫的。
為了通過系統調用號來調用不同的內核服務例程,系統必須維護一個系統調用表,這個表實質上就是系統調用號與內核服務函數的對照表。linux是用數組sys_call_tabl來作為這個表的,在這個表的每個表項中存放著對應內核服務例程的指針,而該表項的下標就是該內核服務例程的系統調用號。linux規定,在1386體系中,系統調用號由處理器的寄存器eax來傳遞。
圖 系統調用的處理過程
系統調用表sys_call_table的部分內容列舉如下:
歡迎轉載,信息來自維庫電子市場網(www.dzsc.com)
系統調用接口的主要任務是把進程從用戶態切換到內核態。在具有保護機制的計算機系 統中,用戶必須通過軟件中斷或陷阱,才能使進程從用戶態切換為內核態。
在i386體系中,linux的系統調用接口是通過調用軟中斷指令“int $ oxso”使進程從用戶態進入內核態的,這個過程也叫做“陷入”。當系統調用接口調用軟中斷指令“int $ ox80”時,這個指令會發生一個中斷向量碼為128的中斷請求,并在中斷響應過程中將進程由用戶態切換為內核態。
因為linux只允許系統調用接口使用128這一個軟中斷向量,這也就意味著所有的系統調用接口必須共享這一個中斷通道,并在同一個中斷服務例程中調用不同的內核服務例程,所以,系統調用接口除了要引發“int $ ox80”軟中斷之外,為了進人內核后能調用不同的內核服務例程,還要提供識別內核服務例程的參數,這個參數叫做“系統調用號”。也就是說,所有可為進程提供服務的內核服務例程都應具有一個唯一的系統調用號。當然,系統調用接口還應為內核服務例程準各必要的參數。
綜上所述,系統調用接口需要完成以下幾個任務:
●用軟中斷指令“int $ ox80”發生一個中斷向量碼為128的中斷請求,以使進程進入內核態。
●要保護用戶態的現場,即把處理器的用戶態運行環境保護到進程的內核堆棧。
●為內核服務例程準備參數,并定義返回值的存儲位置。
●跳轉到系統調用例程。
●系統調用例程結束后返回。
系統調用例程是系統提供的一個通用的匯編語言程序.其實它是一個中斷向量為128的中斷服務程序,其入口為system_call。它應完成的任務有:
●接受系統調用接口的參數。
●根據系統調用號,轉向對應的內核服務例程,并將相關參數傳遴給內核服務例程。
●在內核服務例程結束后,自中斷返田到系統凋甩接口.
系統調用的過程如圖所示。
從圖中可以看到,系統調用接口是用高級語言來編寫的,而通過調用中斷指令陷入內核后的系統調用例程(即圖中的系統調用處理程序)則是用匯編語言編寫的。
為了通過系統調用號來調用不同的內核服務例程,系統必須維護一個系統調用表,這個表實質上就是系統調用號與內核服務函數的對照表。linux是用數組sys_call_tabl來作為這個表的,在這個表的每個表項中存放著對應內核服務例程的指針,而該表項的下標就是該內核服務例程的系統調用號。linux規定,在1386體系中,系統調用號由處理器的寄存器eax來傳遞。
圖 系統調用的處理過程
系統調用表sys_call_table的部分內容列舉如下:
歡迎轉載,信息來自維庫電子市場網(www.dzsc.com)
熱門點擊
- Linux設備驅動程序的函數跳轉表
- Linux系統調用例程system_call
- PIE中斷向量的映射方式
- 什么是Linux內核模塊
- PIE模塊級中斷
- Linux系統調用接口、系統調用例程和內核服
- ARM復位原理
- Linux系統調用接口、系統調用例程和內核服
- Linux字符設備驅動程序的注冊
- Linux外部設備的基本概念
推薦技術資料
- DFRobot—玩的就是
- 如果說新車間的特點是“靈動”,FQPF12N60C那么... [詳細]