當談論一個進程的內存時,我聽說過類似於代碼的內存和數據內存。如何管理代碼內存?
而對於數據存儲器,有兩個主要的管理機制,堆棧和堆。
我現在想知道如何管理代碼存儲器?誰來管理它?
如果我的陳述不那麼清楚,請原諒我。
謝謝。
當談論一個進程的內存時,我聽說過類似於代碼的內存和數據內存。如何管理代碼內存?
而對於數據存儲器,有兩個主要的管理機制,堆棧和堆。
我現在想知道如何管理代碼存儲器?誰來管理它?
如果我的陳述不那麼清楚,請原諒我。
謝謝。
如果您有興趣瞭解更多關於進程內存管理細節的信息,我推薦http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory(和其他內存相關文章)。
代碼存儲器=文本段
通知地址空間如何爲4GB。當內核創建一個進程時,它會爲其提供虛擬內存。下面是一個32位操作系統的例子。內核管理通過處理器的MMU映射到實際RAM的地址。因此,內核和MMU管理代碼內存,就像管理進程的整個地址空間一樣。
它由操作系統管理。程序運行時,代碼從可執行文件加載到某個內存地址。根據程序的性質,對代碼段進行一些改變,例如,跳轉到動態鏈接庫已解決。
正如Space_C0wb0y提出的那樣,請查看en.wikipedia.org/wiki/Dynamic_linker以瞭解正在發生的事情。
查看這個維基百科的文章關於動態加載的一些洞察到正在發生什麼:http://en.wikipedia.org/wiki/Dynamic_linker – 2010-07-09 08:33:11
謝謝Space_C0wb0y,該鏈接是有幫助的。 – smwikipedia 2010-07-11 01:53:38
你的操作系統提供所謂的系統調用來動態分配內存(malloc的,免費的,等等),它也提供了機制來加載和執行程序。
當程序被os加載時,文本段(代碼存儲器)被設置並且程序中靜態分配的內存立即可用。當你的代碼調用函數時,你的函數中的(靜態分配的)變量被分配到堆棧上,並且你的動態分配的內存(例如使用malloc())被分配到堆上。在程序運行期間,程序員負責管理內存(缺少這樣做會導致內存泄漏,並最終導致長時間運行的程序耗盡內存,並且會崩潰或處於極端根據操作系統的不同,將整個操作系統放在一起)。
在大多數操作系統上,堆不由內核管理。它通常是駐留在某種運行時庫(例如ntdll,libc)中的純粹用戶模式組件,然後系統調用低層頁面處理函數(例如NtAllocateVirtualMemory)。 – wj32 2010-07-09 12:28:08
非常不錯的鏈接... – wrapperm 2010-07-09 09:18:39
我第二個包裹。 :) – smwikipedia 2010-07-09 10:11:23
佈局通常由鏈接器而不是內核設置(和管理)。內核只讀取可執行映像中的信息並相應地設置內存映射。如果可執行文件指定了動態鏈接器(這對動態鏈接的可執行文件來說)並且處理很多事情,動態鏈接器將被映射。您可以考慮鏈接程序是操作系統的一部分,但您可以創建一個自定義鏈接程序,它可以執行您想要的任何操作,感謝文章鏈接,感謝您的支持, – 2010-07-14 06:32:12