淺談Linux系統調用

一、系統調用

       什麼是系統調用呢?所謂系統調用就是用戶在程序中調用操作系統所提供的一些子功能,系統調用可以被看作特殊的公共子程序。它把用戶從底層的硬件編程中解放出來,極大的提高了系統的安全性,同時也使用戶程序移植性變爲可能。

       說道系統調用就不得不說我們程序員熟悉的API(application program interface)。API只是一個函數定義,而系統調用通過軟中斷向內核發出一個明確的請求。注意不是每個API都對應一個特定的系統調用。也就是說API和系統調用不是一一對應的,API可能直接提供用戶態的服務,或者一個單獨的API可能調用幾個系統調用,甚至不同的API可能調用了同一個系統調用。

       系統調用大致實現過程:應用程序調用相關API;API將對應的系統調用號存入eax,然後調用int $0x80觸發中斷進入內核中的中斷處理函數;進行地址空間的轉換和堆棧的切換,執行SAVE_ALL;進行中斷處理,根據系統調用表調用內核函數; 執行內核函數;最後RESTORE_ALL並返回用戶模式。


二、系統調用的例子


       原理講了一堆,我們還是痛過一個非常簡單小程序來感受下整個過程大概是怎樣的。
       c語言代碼如下:

 

       我們來編譯運行下,看看效果:



       我們可以清楚看到當前進程的ID是7301。

       我還準備了一個內嵌式彙編版本的程序,可以對照着看,以加深理解:



       可以清楚看到,就是把原本的系統調用語句換成了一段彙編代碼。系統調用傳遞第一個參數用的是ebx,將它置零。接着把系統調用號傳給eax(一般用eax傳遞系統調用號的參數),getpid的號爲20。然後進入int 0x80中斷。最後系統調用返回,返回值和普通函數一樣,都存在eax中。這裏把eax值放到pid中,也就是我們最後看到了進程號。



       最後也可以看到進程號。注意,進程號不同是正常的。
       

三、小結

       總結下系統調用大致實現過程:首先應用程序調用相關API;API將對應的系統調用號存入eax,然後調用int $0x80觸發中斷進入內核中的中斷處理函數;進行地址空間的轉換和堆棧的切換,執行SAVE_ALL進行中斷處理,根據系統調用表調用內核函數 執行內核函數在內核中首先執行system_call 函數最後RESTORE_ALL並返回用戶態。
       系統調用也是需要輸入輸出參數的。其中系統調用號存在eax中。另外每個參數的長度不能超過寄存器的長度,參數個數一般小於6個。 
             

發佈了9 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章