2016-01-28 15 views
1

前一段時間我問了一個類似的問題,但我可能沒有正確地寫過它。因此,如果進程A正在運行並且它在內存中的位置4000處導致頁面錯誤,並且導致頁面錯誤。執行將轉移到內核。那麼頁面錯誤處理程序將運行在哪個堆棧上?這是在內核的虛擬地址空間嗎?還是爲這種類型的所有中斷保留了堆棧空間?哪個堆棧在運行的操作系統中執行頁面錯誤處理程序

+0

與PL無關,或者 - 如問 - 操作系統。 – Olaf

+0

對不起!這是習慣。 – Curious

+0

如果問題是關於Linux內核(如最初標記的)那麼'Linux'標籤是相關的? –

回答

2

Linux並不關心你是否正在運行C或C++程序。

當CPU檢測到有故障的地址時,會引發中斷。沒有合理的方式來使用用戶堆棧,因爲它可能處於完全損壞的狀態。內核擁有自己的專用堆棧來處理這類嚴重故障。

這不是普遍的情況。如果您通常會調用內核爲您執行某些操作,那麼內核可能會認爲您有合理的堆棧可用。

+0

對不起,標籤已成爲某種習慣。那麼爲某些操作保留了堆棧? – Curious

+0

@Curious:至少有一個,可能更多。 (實施細節)。 – MSalters

+0

非常感謝你! – Curious

0

在風險超過simpliciation和忽略的細節任何特定的操作系統 -

然後堆棧將頁面錯誤處理程序上運行?

大多數操作系統爲每個進程分配一個(相對)小的內核模式堆棧。

當進程訪問有效的內存位置但未映射到物理頁框時,處理器會引發頁面FAULT(異常)。這會導致CPU切換到內核模式。這會導致處理器切換到進程的內核模式堆棧並調用操作系統設置的頁面錯誤處理程序。

因爲多個處理器可以同時處於內核模式(即使在單個處理器系統中),所以每個進程(甚至是線程)都必須有單獨的內核模式堆棧。

中斷和異常處理程序必須使用內核堆棧(受用戶模式訪問保護)作爲安全措施。如果可以在用戶模式下訪問堆棧,那麼有人可能會使用堆棧,然後調用內核模式處理程序。

這是在內核的虛擬地址空間嗎?

異常(故障和陷阱)和中斷由當前執行的進程處理,但在內核模式下完成。這是在PROCESS的虛擬地址空間中完成的。

將有一些範圍的內核模式地址,所有進程共享。因爲任何進程必須能夠處理中斷,中斷處理程序引用的所有地址必須相同。某些系統(硬件)具有專用範圍的內核地址。其他系統配置頁表具有共享的系統地址範圍。

+0

爲什麼需要在單處理器系統中爲每個進程分配多個內核堆棧?頁面錯誤處理程序不應該被大多數其他中斷搶佔嗎? – Curious

+0

另外,如果頁面錯誤處理程序在進程的虛擬地址空間中運行,並且該進程的虛擬地址空間在堆棧指針到達過程非地址空間中的某個頁面時可能導致頁面錯誤/位錯誤。 – Curious

+0

進程A觸發頁面錯誤。在讀取新頁面的磁盤時,進程B觸發頁面錯誤。在閱讀新頁面的dicks時,Process C觸發頁面錯誤。 (也可以用一個內核堆棧來實現一個系統)。 – user3344003

相關問題