系统调用syscall---用户态切换到内核态的唯一途径
1、應用程序有時需要內核協助完成一些處理,但是應用程序不可能執行內核代碼(主要是安全性考慮),
? ? ?那么,應用程序需要有一種機制告訴內核,它現在需要內核的幫助,這個機制就是系統調用。
2、系統調用的本質是,應用程序主動觸發軟中斷,這個軟中斷異常立即被系統捕獲到(cpu指令產生異常,觸發異常處理程序),在異常處理程序中發現產生的異常是128號異常,于是執行這個異常的處理程序,這個程序就是系統調用的處理程序,通過指定不同的軟中斷號,異常處理程序跳轉到對應的系統調用的內核態實現程序中執行,于是內核態代替用戶態完成處理。
3、應用程序觸發系統調用的方式,有兩種方法,
? ? ?方法一、通過系統提供的庫函數(如Libc庫)
? ? ?方法二、直接調用系統提供的系統調用函數進行。
?
4、分別舉例如下:
? ??
?
?
5、系統調用的關鍵是:系統調用號的分配。
? ? ? 目前的分配是放在 <asm/unistd.h> 中定義。
6、快速系統調用的概念,在產生一個中斷后,處理器中控制器會進行一系列權限檢查,只有得到核實后,控制單元才設置中斷處理所需要的執行環境,基于軟中斷的128號系統調用也需要作一系列的檢查,才能進入內核態進行系統調用的處理工作。
? ? ? ?由于系統調用的特點,這一系列的權限檢查變得多余,為此intel 在奔騰2處理器中,在傳統的int 128號中斷處理的基礎上,又提供了快速系統調用的匯編指令sysenter/sysexit,核心思想是,產生中斷時,避免權限檢查,直接將處理器置為預定義的級別,同時將系統調用所需的執行環境信息保存在一組型號相關寄存器中,避免了訪問內存,進一步提高進行內核態的速度。
7、自己實現一個系統調用的步驟:分配系統調用號,明確參數、在內核態校驗參數(進程id, 用戶態地址等)、執行權限檢查(例如:capable(CAP_SYS_NICE))、重編內核綁定系統調用。
? ? ?對兩個事務的說明。
? ? ?參數校驗:進程不能傳遞一個非法地址,讓內核帶它去讀取或者寫入,所以,內核必須通過copy_to_user()或者copy_from_user()來進行校驗。
? ? ?權限檢查:進程的權限也就是運行該進程的用戶權限,例如,用戶不能修改其他進程的nice值,而只有root用戶才可以。此時需要使用capable(CAP_SYS_NICE)進行檢查。
? ? ? ? ? ? ? ? ? ? ? 再比如說,普通用戶不能重啟系統,那么就需要校驗 capable(CAP_SYS_BOOT)的返回結果。
轉載于:https://www.cnblogs.com/zhouhaibing/p/7787011.html
總結
以上是生活随笔為你收集整理的系统调用syscall---用户态切换到内核态的唯一途径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS中的加号+运算符详解
- 下一篇: 管理信息系统 第三部分