我有一個關於操作系統和頁面錯誤處理程序的概念性問題。讓我們考慮內核具有虛擬地址空間的情況。所以如果出現頁面錯誤並且執行跳轉到頁面錯誤處理程序。如果用於執行頁面錯誤處理程序的堆棧導致頁面錯誤,那麼會發生什麼情況?遞歸頁錯誤處理程序
回答
如果執行頁面錯誤處理程序的堆棧導致頁面錯誤,那麼會發生什麼情況?
處理程序沒有保留堆棧。
頁面錯誤處理例程是操作系統內核的一部分,因此在內核空間中。即使內核內存仍然組織成頁面,這些頁面仍然駐留在物理內存中,不會被換出到磁盤。換出到磁盤的東西在用戶空間中。因此,由於內核內存不會被換出,因此在內核嘗試處理頁面錯誤時不會生成頁面錯誤。
如果您仔細考慮,這是有道理的。如果處理頁面錯誤的代碼要求頁面錯誤處理程序將自己恢復到物理內存中,內核將無法處理任何頁面錯誤。它不能這樣做。
原則上,如果我們還是儘量假設你的情況,那麼我認爲,內核會:
- 需要成爲以處理這種情況下,你帶來了更加複雜;
- 無法使用或支持虛擬地址空間和/或交換內存;
- 將作爲第一頁故障發生(例如,可能是一個內核恐慌)
對不起,我上面發表了一條評論,生病只是在這裏複製它 - 但是如果這個例程的執行堆棧增長到它的內存部分被映射到某個其他進程的虛擬地址的時候呢? – Curious
@Curious:我不確定我是否按照你的問題。我想你可能會混合一些東西。虛擬地址映射到物理地址,而不是相反。最終,如果在內核中發生無法處理的重大混亂,那麼很可能會出現不可預知的行爲,陷入僵局,或者最糟糕的情況是恐慌。這[osdev wiki](http://wiki.osdev.org/Paging)可能對你有用。 – ray
抱歉,不清楚!這就是我的意思 - 假設進程A在內存位置4000訪問內存,然後出現頁面錯誤,執行切換到頁錯誤處理程序(假設在此方案中我們有一個虛擬地址空間的內核),現在當頁面錯誤處理程序正在運行,並且它會增加堆棧指針並在地址4020處存儲堆棧中的內容,但還有另一個頁面錯誤。然後會發生什麼? – Curious
- 1. 遞歸錯誤處理程序
- 2. 遞歸過程錯誤處理
- 3. 「太多遞歸」錯誤在jQuery的現場處理程序1.3.2
- 4. 遞歸時如何處理StackOverflow錯誤?
- 5. 錯誤處理中的遞歸?
- 6. 如何處理這種遞歸程序
- 7. xv6 rev6頁面錯誤處理程序
- 8. 錯誤處理頁面上遞歸重定向
- 9. Java錯誤處理程序
- 10. Java處理程序錯誤
- 11. Flask錯誤處理程序
- 12. 錯誤處理Java程序
- 13. Ajax.PageHandlerFactory錯誤處理程序
- 14. 遞歸程序中的錯誤
- 15. 遞歸處理KeyError
- 16. Python遞歸處理
- 17. 堆棧跟蹤錯誤處理程序,並承諾錯誤處理程序
- 18. 未處理的異常排序遞歸
- 19. 遞歸錯誤
- 20. 遞歸錯誤
- 21. 頁面錯誤異常處理程序和更新頁表
- 22. 遞歸Bus.Send()帶處理程序(事務,線程,任務)
- 23. 哪個錯誤將由express錯誤和uncaughtException錯誤處理程序處理?
- 24. 在Node.js中遞歸setTimeout函數中的錯誤處理
- 25. 在遞歸函數中使用'Either'的錯誤處理
- 26. 在Python中處理遞歸錯誤回溯
- 27. 一些成功處理後遞歸方法出界錯誤
- 28. 遞歸觸發處理
- 29. 遞歸圖像處理
- 30. XSLT處理遞歸深度
我不能完全回答你的問題,但內核本身擁有內存完全統治,並能確保重要的,一旦崩潰像這樣的例程不會被分頁到磁盤。實際上,您可以使用[mlock]鎖定用戶空間應用程序中的頁面(http://man7.org/linux/man-pages/man2/mlock.2.html)。 – Yuushi
哇,我沒有線索mlock存在!謝謝你告訴我!那麼中斷向量表中的每個處理程序都有一個保留的堆棧? – Curious
@Curious:處理程序沒有保留堆棧。他們始終處於物理記憶狀態,並且始終不會出去。他們在內核空間,而不是用戶空間。 – ray