Linux系統調用的層次如下:
使用者程式-------->C庫(即API):INT 0x80------------>system_call------------>系統調用服務常式--------->核心程式
***API即就是系統提供的C庫。系統調用是通過非強制中斷指令INT 0x80實現的。
(1)INT 0x80:被封裝在C庫函數中,執行此指令會讓新系統跳轉到一個預設的核心空間地址,它指向系統調用處理常式,即system_call函數
(2)system_call:根據具體的系統調用號轉到執行具體的系統調用服務常式。
過程:通過系統調用號尋找系統調用表sys_call_table,非強制中斷指令0x80執行時,系統調用號會被放入eax寄存器當中(由於系統調用服務常式只會從堆棧中擷取參數),system_call函數可以讀取eax寄存器擷取(system_call函數執行時會首先將這些寄存器壓入堆棧中),然後將其乘以4,產生位移地址,然後以sys_call_table為基址,基址加上位移地址,就可以得到具體的系統調用服務常式的地址,然後就可以得到系統服務常式(是對一個具體的系統調用的核心實現函數,系統調用處理常式是在執行系統調用服務常式之前的一個引導過程,是針對INT 0x80這條指令的,面向所有系統調用)了。
系統調用通過非強制中斷INT 0x80陷入核心,跳轉到系統調用處理常式system_call函數,然後處理相應的服務常式。但是由於是代表使用者進程,所以這個執行過程並不屬於中斷上下文,而是進程上下文。因此,在系統調用的過程中,可以訪問使用者進程的許多資訊,可以被其它進程搶佔,可以休眠。
當系統調用完成後,把控制權交回到發起調用的使用者進程,核心會有一次調度。如果發現有優先順序更高的進程或當前進程的時間片用完,那麼會選擇優先順序更高的進程或重新選擇進程執行
二。系統調用的意義
系統調用在使用者空間進程和硬體裝置之間添加了一個中介層,該層的作用:
1.為使用者空間提供了一個統一的硬體的抽象介面。
2.保證了系統的穩定和安全(可以避免應用程式不正確的使用硬體裝置,竊取其它進程的資源)
3.如果應用程式可以隨意的訪問硬體,而核心又對此一無所知的話,幾乎無法實現多任務和虛擬記憶體,當然也不能實現良好的穩定性和安全性
在Linux中,系統調用時使用者空間訪問核心的唯一手段,除異常和中斷外,他們是訪問核心的唯一入口。
參考部落格:http://blog.sina.com.cn/s/blog_9df3658301011b7f.html