我想了解它真的意味着什麼時,一個來自某某,這樣的功能住在地址0xsuchandsuch
一個調試器,在地址地址0xpointedmemory
讀取,該變量foo
0xfoosaddress
指向的內存區域,並等等。函數,函數參數和本地堆棧如何在內存中進行物理組織?
從哪裏可以找到關於如何爲從C編譯的程序組織內存的資源?它是編譯器特定的嗎?平臺的具體情況?
我想了解它真的意味着什麼時,一個來自某某,這樣的功能住在地址0xsuchandsuch
一個調試器,在地址地址0xpointedmemory
讀取,該變量foo
0xfoosaddress
指向的內存區域,並等等。函數,函數參數和本地堆棧如何在內存中進行物理組織?
從哪裏可以找到關於如何爲從C編譯的程序組織內存的資源?它是編譯器特定的嗎?平臺的具體情況?
它是純粹的實現定義(編譯器&平臺特定)。
該標準不討論任何內存區域,它只是說明所需的行爲。
通常(再次實現具體實現),編譯的c程序將被組織到不同的內存區域。
寫偉大的代碼,第1卷通過Ryndall海德 classifys這些部分的實現方式之一爲:
一般來說,平臺(CPU和操作系統的組合)確定如何存儲器進行管理。編譯器必須遵守平臺設置的規則。這些通常被稱爲ABI(應用程序二進制接口)。對於Solaris(大部分也適用於其他類UNIX系統),您可以從Peter van der Linden編寫的「Expert C Programming」一書中學到很多東西。
對於Intel的機器,你可以在開始部分開始:8086
我要說的是,你可以把電腦分爲兩大類:
1)小型系統,就像今天的嵌入式系統(即使許多桌面電腦過去看起來像這樣,在日子裏)。只有一個大的內存範圍,並且當鏈接器說它位於特定地址時,它確實存儲在那裏。
2)大系統,內存管理系統。在這些系統中,每個進程都有一個看起來像完整內存範圍的視圖,但是它使用的地址可能與實際內存的物理地址不一致。另外,部分內存可以交換到磁盤,稍後可以在另一個物理地址重新讀取。這就是爲什麼人們經常談論位置而不是地址的對象。
我建議你從一個簡單的編譯器開始,看看它輸出了什麼。例如,您可以使用嵌入式處理器MSP430以及免費的Kickstart版本的IAR編譯器。本手冊描述了內存是如何組織的以及如何執行啓動過程等。
它是編譯器和平臺特定的:) – 2012-01-05 07:46:27