2012-02-02 11 views
0

我正在開發一個操作系統程序,我想弄清楚malloc是如何工作的。當用戶調用malloc時,指針是否從堆棧頂部的malloc返回,並且位於給定空間之後還是位於給定空間的底部?malloc如何工作與堆棧有關?變量應該推在哪裏?

如果我使用匯編代碼將變量加載到此新空間中,並且它不足以填充整個空間,應該將變量推入釋放空間的開始位置,還是將其推入到最後一個變量會佔用malloc提供的最後一個可用空間量?

謝謝。

回答

3

malloc整點是到從堆棧中分配,而是從heap。如果你想從堆棧中分配,你可以使用alloca

如果您在堆棧上分配並保留當前堆棧幀(也就是從函數返回),那麼以前堆棧分配的東西可能(在大多數情況下:將被稍後的不同函數調用覆蓋) 。所以這顯然不是「長期」存儲的地方。對於需要比函數調用壽命更長的數據,您需要從堆中分配。這就是malloc所做的。

malloc如何做的工作依賴於操作系統的可用功能和實現。看到問題:How do malloc() and free() work?

+0

所以如果我想使用malloc創建另一個線程,我會將函數和變量推入堆中?不是堆棧?相反,使用alloca更好嗎? – Lucas 2012-02-02 23:02:22

+0

您不用malloc創建另一個線程。你在這裏混淆了一些東西,看起來(或者我不瞭解你;-)。您可以通過操作系統相關方法創建一個新線程,例如,在UNIX上通常使用'pthread_create'。如果要存儲新線程需要使用的數據,則需要使用'malloc'在堆上分配,並通過全局變量(錯誤;認爲「固定內存位置」)或傳遞給新線程參數給線程創建函數。 (在下一條評論中繼續) – DarkDust 2012-02-02 23:11:20

+0

如果您想編寫自己的操作系統,您需要先熟悉它如何在「正常」操作系統上運行。或者拿一本書,比如Andrew S. Tanenbaum的* Operating Systems:Design and Implementation *。您還需要熟悉您的架構(如x86)如何幫助您執行上下文切換和線程/進程處理。有幾本書談論它。這不是可以在StackOverflow,恕我直言,有用的方式回答,因爲主題太複雜了。 – DarkDust 2012-02-02 23:14:49

2

通常,malloc內存不是從堆棧中分配的,而是從堆中分配的。

+0

所以,如果我想用malloc創建另一個線程,我會將函數和變量推入堆中?不是堆棧?相反,使用alloca更好嗎? – Lucas 2012-02-02 23:02:58

0

返回的指針包含HEAP上分配內存的開始地址。 malloc的內存不在堆棧上。如果內存被用作一個數組,那麼你會從頭開始推 - 數組上的[]運算符只是起始指針的偏移量。

0

通常我們有這樣的情況:

.data | .bss | heap -> || <- stack  

我們有第一個非零初始化(.data段)靜態對象和零初始化(.bss節)靜態對象,然後堆(由malloc分配對象)然後堆棧(自動對象)。堆棧向下生長,堆棧向上生長。 (堆棧通常向下生長,但在某些系統上向上生長)。

請注意,C不需要堆棧。

+0

所以如果我想使用堆棧創建另一個線程。具有函數和變量,這會直接推送到堆棧,還是更聰明地使用malloc和堆? – Lucas 2012-02-02 23:06:52