2012-07-20 109 views
0

可能重複:
How does a stack memory increase?堆棧指針和分割

讓我們想到了用分割的操作系統。
我的問題是:操作系統intrecepts
或者使用一個特定聰明的策略分配更多的內存比你需要的時候,你的堆棧指針
和instanly(或相當instanly)分配/解除分配空間物理性存儲器中的每一個變化遞減sp,僅在釋放內存達到一定數量時釋放內存?

我希望我的劇集足夠清晰。

回答

1

如果我理解你的要求正確,答案是:

操作系統分配一定的空間,堆在過程中創造的開始。當堆棧操作發生時,處理器自動遞增和遞減堆棧指針,軟件和遞減堆棧指針爲臨時數據分配空間(如在函數調用中)。它會減少,因爲堆棧實際上增長下來,並且如果指針超過了給定的分配空間,將發生堆棧溢出。分配的空間量因系統而異。操作系統可以做的唯一可能的「技巧」是分頁,它可以將內存標記爲已分配,但在軟件使用之前不會真正分配物理內存。這被稱爲請求分頁,並且在堆中有更多的應用,而不是堆棧。

+0

也要添加..每個進程都有自己的地址空間,其中包括一個堆棧。解釋系統中進程的屬性具有堆棧指針。 – Deepthought 2012-07-21 08:14:16

0

同樣添加到上面的答案..
一個進程的堆棧增長到堆,操作系統必須確保這些區域不重疊。
當堆棧需要更多空間(即堆棧指針指向非法/未分配的內存)時,會導致頁面錯誤。

  1. 的頁面錯誤的interupt hanlders都寫這樣它讀取當前堆棧指針,它的最大限制以發現頁面錯誤發生,因爲堆棧的增長或者是因爲我們感動的虛擬內存的一部分(屬於碼/數據)尚未映射到物理內存(按需分頁)。
  2. 如果頁面錯誤發生,因爲堆棧增長
    • 我們檢查,看看是否達到堆棧的最大尺寸它爲8MB GNU/Linux系統(默認)
    • 接下來,我們看到如果通過分配新頁堆疊,如果它會堆與重疊
    • 這可能會跟一些更健康檢查。
    • 如果以上全部通過,則分配新頁面
    • 如果其中一個檢查失敗,則會出現seg fault或堆棧溢出,具體取決於實現。
  3. 如果我們確實在上一步中分配一個新的頁面,然後出錯進程的堆棧指針被更新,新的映射被添加到出錯進程的頁表和頁面錯誤處理程序將控制返回給錯誤指令,通常是push或pusha(在彙編中,x86)。

PS:上述步驟是基於pintos OS,實際步驟可能不同(在Linux這樣OS S爲複雜)我的UG OS當然OS分配.Heres堆棧增長的link向部分見4.3.3節。

+0

感謝您的答案,你們都在談論分頁,但在我的理解中,分段與分頁不同。看看這個鏈接:http://pages.cs.wisc.edu/~remzi/OSFEP/vm-segmentation.pdf – GionJh 2012-07-21 09:27:26

+0

很好的分割和分頁是2種不同的方式爲進程提供虛擬內存,事實上它們都可以共同 - 存在。在Linux分頁上優先分段。 – Deepthought 2012-07-21 10:05:23

+0

可能存在一個系統,其中一個進程的地址空間被分段,然後每個分段都由頁面組成。因此,虛擬到物理地址轉換必須經過1個更多級別的間接方向,在此處檢查段基址:偏移和限制,檢查我提到的想法保持不變。在linux中,用戶代碼和數據指向1段,內核代碼和數據指向1段,根據當前模式(用戶/ kerenl)將該段的基地址加載到cs:segmentation寄存器中,所有段的地址存儲在GDT(全局描述符表)中。 – Deepthought 2012-07-21 10:05:37