2013-04-03 62 views
7

據我所知,一個彙編程序分爲兩個 - 1)代碼2)數據。 現在,當我們編碼時,在c \ C++上說,代碼被加載到內存中,然後CPU開始執行代碼,一個接一個地執行,作爲彙編程序。 我的問題是: 1.在哪裏存儲c代碼?我的意思是,當我在Visual Studio中運行一個程序時,是將代碼加載到其中的一個 - 堆,堆棧..?因此,內存被虛擬地分割爲堆棧,堆和日期段,但是當CPU執行程序時,作爲彙編程序,它們全部是1個彙編程序,它們具有相同的數據區域,或者它們被形成爲,可以說2或3個程序從一個跳到另一個?堆,堆棧和數據段在同一個彙編程序上嗎?

**讓我添加這個問題,也許它會闡明我的意圖: 當我啓動一個C程序時,代碼(機器指令)被加載到內存中。所以,這是一個彙編程序。但是記憶分裂是如何發生的?我的意思是,不同的存儲器部分(如堆棧,數據段等)如何修改彙編程序?

回答

3

部分在對象和可執行文件連續師,很像一本書的章節。堆棧和bss部分不存在於文件中,而是在運行時創建。

這些部分的重點主要是將程序分成操作系統可以用不同方式保護的區域。爲了安排那個,這些部分必須從頁面邊界開始並且在內存中是連續的。

基本的(「重要」)部分是...

文本代碼 - 操作系統將寫保護這部分,因爲它是不可變的,它也可以在多個進程間共享或線程中運行相同的可執行

數據 - 操作系統將映射此R/W也不會直接份額它

bss - 此部分由零初始化數據組成。

- 通常是從程序分開,它通常由高地址

最後兩個部分不是可執行文件,因爲他們不需要任何intiialization向下增長。

如果您在詢問它們是如何實現的,那麼彙編器和鏈接器就會創建一個目錄,並用書中的章節形式寫出這些部分。 OS然後分別讀取它們,並將它們放在地址空間的不同部分。

類Unix系統和Windows之間的細節和術語是不同的,但其原理是相同的。


1.是啊是啊,寫入時複製允許過,那種共享數據。

5

維基百科:

的PC架構 支持一些基本的讀寫存儲器區域的程序,即:堆棧,數據和代碼。堆是另一個可用於程序的地址空間區域,從中可以得到動態分配或釋放內存的 作爲對系統調用(如malloc和free)響應的操作系統。

我建議你閱讀full article

也有這個問題上的SO: How are the different segments like heap, stack, text related to the physical memory?

而且,這些文章可能是值得一讀。尤其是最後一個:

回答您的問題:

1.存儲在C代碼在哪裏?

在代碼段中。

2.因此內存實際上被劃分到棧,堆和日期段,

在實模式下,是的。在保護模式下...取決於。爲了簡化:程序存儲器映射到物理內存。每個程序都存在於自己的地址空間中。

我建議這些文章,如果你想知道更多:

3.但是當CPU執行程序,作爲組件程序,它們都是1個彙編程序,具有相同的數據區,或者它們是以2個或3個程序組成的程序組成的程序,即j從一個到另一個umps?

不,沒有跳躍。處理器寄存器指向要執行的下一條指令。其他人則指向堆棧等

+0

謝謝,但這不完全是我問的。 – user2162550

+0

@ user2162550更新對您有用嗎?如果不是,那麼您需要尋求哪些附加信息?要理解這些基礎知識,最好的方法就是保持實模式下的內存映射。事情更簡單。 – Jean

+0

「否。沒有跳轉,處理器寄存器指向要執行的下一條指令,其他指向堆棧等。」如果有其他寄存器指向堆棧等。正如你所說,所以有不同的彙編程序,並且CPU確實從一個跳轉到另一個,這不正確嗎? – user2162550