前一段時間我問了一個類似的問題,但我可能沒有正確地寫過它。因此,如果進程A正在運行並且它在內存中的位置4000處導致頁面錯誤,並且導致頁面錯誤。執行將轉移到內核。那麼頁面錯誤處理程序將運行在哪個堆棧上?這是在內核的虛擬地址空間嗎?還是爲這種類型的所有中斷保留了堆棧空間?哪個堆棧在運行的操作系統中執行頁面錯誤處理程序
回答
在風險超過simpliciation和忽略的細節任何特定的操作系統 -
然後堆棧將頁面錯誤處理程序上運行?
大多數操作系統爲每個進程分配一個(相對)小的內核模式堆棧。
當進程訪問有效的內存位置但未映射到物理頁框時,處理器會引發頁面FAULT(異常)。這會導致CPU切換到內核模式。這會導致處理器切換到進程的內核模式堆棧並調用操作系統設置的頁面錯誤處理程序。
因爲多個處理器可以同時處於內核模式(即使在單個處理器系統中),所以每個進程(甚至是線程)都必須有單獨的內核模式堆棧。
中斷和異常處理程序必須使用內核堆棧(受用戶模式訪問保護)作爲安全措施。如果可以在用戶模式下訪問堆棧,那麼有人可能會使用堆棧,然後調用內核模式處理程序。
這是在內核的虛擬地址空間嗎?
異常(故障和陷阱)和中斷由當前執行的進程處理,但在內核模式下完成。這是在PROCESS的虛擬地址空間中完成的。
將有一些範圍的內核模式地址,所有進程共享。因爲任何進程必須能夠處理中斷,中斷處理程序引用的所有地址必須相同。某些系統(硬件)具有專用範圍的內核地址。其他系統配置頁表具有共享的系統地址範圍。
爲什麼需要在單處理器系統中爲每個進程分配多個內核堆棧?頁面錯誤處理程序不應該被大多數其他中斷搶佔嗎? – Curious
另外,如果頁面錯誤處理程序在進程的虛擬地址空間中運行,並且該進程的虛擬地址空間在堆棧指針到達過程非地址空間中的某個頁面時可能導致頁面錯誤/位錯誤。 – Curious
進程A觸發頁面錯誤。在讀取新頁面的磁盤時,進程B觸發頁面錯誤。在閱讀新頁面的dicks時,Process C觸發頁面錯誤。 (也可以用一個內核堆棧來實現一個系統)。 – user3344003
- 1. 此代碼未定義的行爲?那麼操作系統和堆呢?操作系統如何處理堆棧?
- 2. 通過操作系統執行程序
- 3. 在雙核處理器上執行2個操作系統
- 4. 在c中執行堆棧的錯誤
- 5. 堆棧執行錯誤
- 6. 在我的操作系統中運行兩個應用程序
- 7. 正在執行合併排序算法的系統堆棧錯誤
- 8. OS堆棧和OS堆棧在多核操作系統中
- 9. 系統堆棧錯誤
- 10. 什麼是Windows操作系統中的驅動程序堆棧?
- 11. 強制操作系統在「子程序」之後執行清理操作
- 12. 如何操作系統...運行...沒有一個操作系統運行?
- 13. 我的操作系統中的mykernel.iso執行錯誤
- 14. 在Windows操作系統中執行批處理文件時出錯
- 15. 在移動Web應用程序中處理頁面堆棧
- 16. 它是負責設置堆棧的程序或操作系統
- 17. 堆棧跟蹤錯誤處理程序,並承諾錯誤處理程序
- 18. 我的終端在哪個操作系統上運行?
- 19. 在VirtualBox中的客戶操作系統上運行程序
- 20. Rails應用程序如何找出它在哪個操作系統上運行
- 21. 如何檢測哪個操作系統正在運行該程序?
- 22. 如何檢查在Android操作系統中的後臺運行哪個進程?
- 23. LaTeX:我在哪個操作系統上運行?
- 24. 如何在xv6操作系統中運行c程序
- 25. 操作系統中斷並正在運行程序。
- 26. 堆棧錯誤按下操作對陣列進行操作
- 27. 錯誤錯誤的執行(操作系統課程)需要解釋
- 28. 處理程序不執行運行
- 29. 在全局錯誤處理程序中獲取堆棧strace
- 30. 輻射1.1.0的系統堆棧錯誤
與PL無關,或者 - 如問 - 操作系統。 – Olaf
對不起!這是習慣。 – Curious
如果問題是關於Linux內核(如最初標記的)那麼'Linux'標籤是相關的? –