簡體   English   中英

堆棧中的內存沖突

[英]Memory collision in Stacks

因此,當內存發生沖突(以及該網站的標題)時,我理解了堆棧溢出是什么,但我不明白的是為什么堆棧中的新條目位於遞減的內存地址中。 為什么它們不在隨機的內存地址中,這樣更有意義,以至於內存沖突不會成為問題? 我猜這背后有某種優化的原因嗎?

**編輯**

我沒有意識到的是給堆棧一個x的地址空間。 現在有道理,但帶我提出后續問題。 我可以明確聲明要分配給堆棧的內存量嗎?

“內存沖突”將更適合“緩沖區溢出”的用語,即您在預定空間之外進行寫操作,但是可能在不同的已分配內存塊中進行寫操作。

堆棧溢出與將一個人的內存分配之外的內容寫入另一個內存分配無關。 這只是在堆棧內存分配之外進行寫操作。 最有可能在堆棧之外的是一個保護內存頁面,該頁面未分配任何內容,並且會導致讀取或寫入嘗試出錯。

並為堆棧上推入的每個值分配一個隨機地址,這使得在堆棧上查找數據變得困難(並且不再是堆棧)。 當編譯器或程序員知道后續元素占據后續地址時,僅從堆棧幀的基本指針中計算這些地址就很容易。

這個問題的答案可能很復雜,但是基本上棧操作被認為是非常原始的功能,處理器將其作為代碼正常執行的一部分來執行。 (保存寄信人地址和其他內容。)

那么,您將內存管理代碼放在哪里? 您在哪里跟蹤分配的地址或添加代碼以分配新的地址? 確實沒有任何地方可以執行此操作,因為這些是處理器本身執行的基本操作。

與保存代碼本身的內存類似,假定在代碼運行之前就已經建立了堆棧(並由堆棧寄存器指向)。 確實沒有任何地方可以在堆棧內存中添加復雜的內存管理。 因此,是的,如果沒有提供足夠的內存,則堆棧將溢出。

堆棧溢出是指您用完了所有可用的堆棧空間。 在大多數情況下,堆棧可用的空間只是系統設計者選擇的任意限制。 可以更改此設置,但是在現代系統上,這並不是真正的問題-除非系統確實非常龐大,否則需要幾兆字節堆棧的代碼可能未正確設計。

堆棧從“自定義”增長到零-它必須沿已定義的方向運行,否則將很難進行后續操作,並且低地址和高地址一樣好。 過去,堆棧和堆是彼此接近的,這將允許使用大量堆棧而不是大量堆的代碼在使用與較少堆棧和較大數量內存相同的內存量下工作。堆。 但是現在,通常有足夠的內存(空間)可以將堆定義為與堆棧完全分開的地方。 取而代之的是,通過在堆棧的頂部使用不可用的“保留”內存區域來檢測堆棧溢出,因此操作系統會獲得一個“陷阱”以使用不可用的內存,並且可以終止應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM