Linux內核分析(四)Linux系統調用初探

系統調用是操作系統爲用戶態進程提供的一組可以與硬件設備進行交互的接口,可以幫助應用程序開發者從處理底層硬件的細節中解放出來。所以系統調用的上層就是我們的應用程序,而下層就是操作系統管理下的各種硬件設備和其他資源。應用程序是通過中斷的方式向內核發出一個明確的請求的。本文的目的就是用一個直觀的例子展示一下系統調用的過程。

    先來看一個使用系統調用的小程序,這個程序用追加模式打開一個文件,在裏面寫入當前的時間戳,然後關閉這個文件,C代碼如下:

     程序用到了系統調用open,用於打開一個文件,其中第一個參數是文件名,第二個參數是對文件的操作方式,這裏是只寫且追加的方式,並且指定了如果文件不存在則創建文件,第三個參數指定了新創建的文件的讀寫模式,這裏是僅文件擁有者具有讀寫權限。隨後又用了time系統調用獲得了當前的時間戳,然後將得到的時間戳用write系統調用寫入到文件中,最後關閉文件。編譯運行程序,就能在當前目錄下得到一個名爲timestamp.txt的新文件,文件內容如下:

    

     文件的函數取決於我們運行過幾次這個程序。

 

    隨後,爲了證明我們的系統調用是用中斷方式實現的,我們重寫這個小程序,不直接使用系統調用,而是用中斷並指定中斷號及參數的方法,替換掉open系統調用。應該使用哪個中斷號呢?這裏有一個32位系統調用號及入口向量的參考可以查到,我們可以知道open系統調用對應的入口向量是5.因此重寫之後的程序爲:

 

    編譯運行這個程序,然後重新查看我們的timestamp.txt文件,結果如下:

     可見這個程序實現的功能和上面的C程序完全相同,也是在timestamp.txt文件中追加了一行當前系統時間戳的內容。

在回頭仔細看看我們的第二段程序,會發現他和第一個程序的區別只是用一段彙編代碼替換了原來的open系統調用。而彙編代碼就是執行了一次0x80也就是十進制128的中斷請求,同時EAX的值設置爲了open對應的入口向量號5,給open傳遞的三個參數是通過分別在三個寄存器EBX,ECX和EDX中各自傳入對應的變量值來實現的。

     由此實驗可以看到,直接在用戶層程序中使用中斷指令並傳遞合適的參數和使用系統調用可以達到完全相同的效果。由此我們也就可以窺見系統調用的基本原理了,即使用中斷指令,實現用戶態到內核態的切換。

 

    本文就僅僅到此了,因爲題目也叫初探,系統讀者能通過這個直觀的例子加深一下對系統調用的理解。更細節的內容會在下一篇博文中介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章