2013-03-20 30 views
3

我有一個關於linux系統調用的基本問題。
爲什麼系統調用不像正常的函數調用那樣處理,爲什麼通過軟件中斷來處理?
是否因爲在用戶應用程序的構建過程中沒有爲用戶空間應用程序與內核執行鏈接過程?爲什麼使用中斷來處理系統調用?

回答

5

單獨編譯的代碼段之間的鏈接是一個小問題。共享庫已經有相當一段時間的解決方法(可重定位的代碼,導出表等)。當您在程序中加載庫時,您通常只支付一次費用。

更大的問題是,您需要將CPU從非特權用戶模式切換到特權內核模式,並且您需要以可控制的方式執行此操作,而不會讓用戶代碼轉義並破壞內核。 。這通常是通過特殊或指定的指示完成的。在轉換到內核時,您可能也會受益於自動中斷禁用,而x86 int指令可以爲您執行該操作。大多數CPU都有類似這樣的指令,它是實現系統調用接口的常用方式,儘管不是唯一的方式。

如果你問到MS-DOS或原始MINIX,兩者跑在真實地址模式,其中內核無法保護自身或其他程序任何東西,因爲所有的內存和系統資源是i8086所有代碼都可以訪問,那麼使用int這樣的特殊指令的原因就會少一些,沒有兩種模式,只有一種,並且在這方面int大體上等同於簡單的call (far)

同樣值得注意的是以下事實的CPU經常處理以下3種類型的事件在一個非常類似的方式:

  • 硬件從I/O裝置的中斷
  • 例外,從執行代碼的錯誤(例如,分裂由0,頁面錯誤等)
  • 系統調用

這使得使用類似的int指令的自然選擇你的報名表並且所有上述處理程序中的退出點如果不完全,則大部分相同。