我有一個關於linux系統調用的基本問題。
爲什麼系統調用不像正常的函數調用那樣處理,爲什麼通過軟件中斷來處理?
是否因爲在用戶應用程序的構建過程中沒有爲用戶空間應用程序與內核執行鏈接過程?爲什麼使用中斷來處理系統調用?
3
A
回答
5
單獨編譯的代碼段之間的鏈接是一個小問題。共享庫已經有相當一段時間的解決方法(可重定位的代碼,導出表等)。當您在程序中加載庫時,您通常只支付一次費用。
更大的問題是,您需要將CPU從非特權用戶模式切換到特權內核模式,並且您需要以可控制的方式執行此操作,而不會讓用戶代碼轉義並破壞內核。 。這通常是通過特殊或指定的指示完成的。在轉換到內核時,您可能也會受益於自動中斷禁用,而x86 int
指令可以爲您執行該操作。大多數CPU都有類似這樣的指令,它是實現系統調用接口的常用方式,儘管不是唯一的方式。
如果你問到MS-DOS或原始MINIX,兩者跑在真實地址模式,其中內核無法保護自身或其他程序任何東西,因爲所有的內存和系統資源是i8086所有代碼都可以訪問,那麼使用int
這樣的特殊指令的原因就會少一些,沒有兩種模式,只有一種,並且在這方面int
大體上等同於簡單的call (far)
。
同樣值得注意的是以下事實的CPU經常處理以下3種類型的事件在一個非常類似的方式:
- 硬件從I/O裝置的中斷
- 例外,從執行代碼的錯誤(例如,分裂由0,頁面錯誤等)
- 系統調用
這使得使用類似的int
指令的自然選擇你的報名表並且所有上述處理程序中的退出點如果不完全,則大部分相同。
相關問題
- 1. 中斷系統調用處理隊列
- 2. 爲什麼多處理器系統需要禁用中斷
- 3. 什麼使read()成爲系統調用?
- 4. 爲什麼用int80h代替sysenter來調用系統調用?
- 5. 使用系統調用來處理退出狀態
- 6. 如何處理EINTR(系統調用被中斷)
- 7. 在Linux中使用什麼系統調用來複制文件
- 8. 中斷系統調用
- 9. posix_memalign中斷系統調用
- 10. 在操作系統中,系統調用和中斷有什麼區別?
- 11. 什麼是系統調用?
- 12. JAVA爲什麼arrayCopy系統調用?
- 13. 爲什麼系統調用是通過中斷而不是調用門來實現的?
- 14. 如何在VM(使用KVM)中處理timeofday()系統調用?
- 15. 來自Linux的嵌入式系統中斷/硬件處理
- 16. 爲什麼中斷服務程序不能包含大多數系統調用
- 17. 在等待系統調用中使用0有什麼用?
- 18. 系統調用是否在整個軟件中斷處理程序中執行?
- 19. 爲什麼使用java.util.List而不是java.util.Set來處理Ebean中的關係
- 20. 爲什麼Perl會在系統調用中用%23替換#?
- 21. 中斷的系統調用在GIT
- 22. 阻止'connect'系統調用中斷
- 23. 龍捲風中斷系統調用
- 24. 軟件中斷系統調用
- 25. 操作系統調用中斷嗎?
- 26. python信號,中斷系統調用
- 27. Waitpid被系統調用中斷
- 28. 系統調用與中斷上下文
- 29. 信號如何中斷系統調用
- 30. pause()系統調用的系統調用處理函數在哪裏?