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