當前位置:
首頁 > 知識 > 介紹Linux下的系統調用過程

介紹Linux下的系統調用過程

過程:

先來看一張圖,有個大概的理解。

首先,應用程序能直接調用的是系統提供的API,這個在用戶態(Ring3)下就可做到。

然後相應的API就會將相應的系統調用號保存到eax寄存器中(這一步通過內聯彙編實現),之後就是使用int 0x80觸發中斷(內聯彙編),進入到中斷處理函數中(該函數是完全由彙編代碼編寫),這個時候就進入到了內核態(Ring0)了。

在中斷處理函數中就會調用與系統調用號相對應的那個系統調用。在這個函數中,會把ds、es這兩個寄存器設置為指向內核空間。這樣一來,我們無法把數據從用戶態中傳到內核態啊(如open(const char * filename, int flag, ...)中,filename指針指向的字元串的地址是在用戶空間中的,在內核空間相應的地方取的話根本沒有該字元串),這該怎麼辦呢?中斷處理函數中的fs寄存器被設置為指向了用戶空間,所以問題得以解決。

在系統調用中就是進行相應的操作了,如打開文件、寫文件等。

處理完後,將會返回到中斷處理函數,返回值保存在eax寄存器中。

從中斷處理函數中返回到API,依舊是把返回值保存到eax寄存器中。這個時候就從內核態恢復成用戶態。

在API中從eax中取出值,做相應的判斷返回不同的值,用以表示操作完成情況。

為什麼使用int 0x80中斷能調用那麼多系統調用?

在保護模式下,有各種各樣的中斷,而系統調用就和0x80號中斷綁定。當要調用系統調用時,就觸發int 0x80,中斷處理函數就通過eax獲知想要調用的是哪一個系統調用。這樣做的原因是系統調用數量太多,中斷號會不夠用,所以用一個來集中管理。

操作系統中有一個表,是用來保存各個系統調用函數的地址的。這個表是一個數組,所以通過下標就可以訪問到不同函數的地址。故可以做到一個中斷號+各樣的系統調用號就管理多個系統調用。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux資訊速推 的精彩文章:

Linux操作系統已擁有自動化的Spectre/Meltdown檢查器

TAG:Linux資訊速推 |