2010-07-09 56 views
13

當談論一個進程的內存時,我聽說過類似於代碼的內存數據內存如何管理代碼內存?

而對於數據存儲器,有兩個主要的管理機制,堆棧和堆。

我現在想知道如何管理代碼存儲器?誰來管理它?

如果我的陳述不那麼清楚,請原諒我。

謝謝。

回答

17

如果您有興趣瞭解更多關於進程內存管理細節的信息,我推薦http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory(和其他內存相關文章)。

代碼存儲器=文本段

通知地址空間如何爲4GB。當內核創建一個進程時,它會爲其提供虛擬內存。下面是一個32位操作系統的例子。內核管理通過處理器的MMU映射到實際RAM的地址。因此,內核和MMU管理代碼內存,就像管理進程的整個地址空間一樣。

Borrowed from duartes.org http://static.duartes.org/img/blogPosts/linuxFlexibleAddressSpaceLayout.png

+1

非常不錯的鏈接... – wrapperm 2010-07-09 09:18:39

+0

我第二個包裹。 :) – smwikipedia 2010-07-09 10:11:23

+2

佈局通常由鏈接器而不是內核設置(和管理)。內核只讀取可執行映像中的信息並相應地設置內存映射。如果可執行文件指定了動態鏈接器(這對動態鏈接的可執行文件來說)並且處理很多事情,動態鏈接器將被映射。您可以考慮鏈接程序是操作系統的一部分,但您可以創建一個自定義鏈接程序,它可以執行您想要的任何操作,感謝文章鏈接,感謝您的支持, – 2010-07-14 06:32:12

2

它由操作系統管理。程序運行時,代碼從可執行文件加載到某個內存地址。根據程序的性質,對代碼段進行一些改變,例如,跳轉到動態鏈接庫已解決。

正如Space_C0wb0y提出的那樣,請查看en.wikipedia.org/wiki/Dynamic_linker以瞭解正在發生的事情。

+1

查看這個維基百科的文章關於動態加載的一些洞察到正在發生什麼:http://en.wikipedia.org/wiki/Dynamic_linker – 2010-07-09 08:33:11

+0

謝謝Space_C0wb0y,該鏈接是有幫助的。 – smwikipedia 2010-07-11 01:53:38

0

你的操作系統提供所謂的系統調用來動態分配內存(malloc的,免費的,等等),它也提供了機制來加載和執行程序。

當程序被os加載時,文本段(代碼存儲器)被設置並且程序中靜態分配的內存立即可用。當你的代碼調用函數時,你的函數中的(靜態分配的)變量被分配到堆棧上,並且你的動態分配的內存(例如使用malloc())被分配到堆上。在程序運行期間,程序員負責管理內存(缺少這樣做會導致內存泄漏,並最終導致長時間運行的程序耗盡內存,並且會崩潰或處於極端根據操作系統的不同,將整個操作系統放在一起)。

請參見這篇文章:http://www.maxi-pedia.com/what+is+heap+and+stack

+0

在大多數操作系統上,堆不由內核管理。它通常是駐留在某種運行時庫(例如ntdll,libc)中的純粹用戶模式組件,然後系統調用低層頁面處理函數(例如NtAllocateVirtualMemory)。 – wj32 2010-07-09 12:28:08

4

的碼存儲器不需要管理,因爲它不會改變。當一個可執行文件被加載到地址空間時,代碼只是從可執行文件讀入內存。事實上,在現代操作系統中,代碼段只是內存映射到可執行文件。

+1

嗯,那麼....它取決於操作系統。正如我從A. Silberschatz關於操作系統的書中記得的,一些體系結構可能能夠移動代碼,但它必須對程序員是透明的。另外加載/卸載動態庫涉及代碼的一些內存管理。 – doc 2010-07-09 14:21:43

+0

@doc:是的,但它在操作系統和體系結構之間有所不同。我上面所說的主要是基於OS X可執行文件格式。 – JeremyP 2010-07-09 14:30:11