爲什麼進程的地址空間必須分爲四個部分(文本,數據,堆棧和堆)?什麼是advandatage?是否有可能只有一個整體大部分?爲什麼一個進程的地址空間被分成四個部分(文本,數據,堆棧和堆)?
回答
將程序拆分爲內存中的各個部分有多種原因。
其中之一是指令和數據存儲器可以是架構上不同且不連續的,也就是說,從CPU內部和外部使用不同的指令和電路讀寫,形成兩個不同的地址空間(即讀取代碼從地址0開始並且從地址0讀取數據通常會從不同的存儲器返回兩個不同的值)。
另一個是可靠性/安全性。你很少希望程序的代碼和常量數據改變。發生這種情況的大部分時間是由於某些事情發生錯誤(無論是在程序本身還是在其輸入中,可能是惡意構建的)。你想防止這種情況發生,並知道是否有任何企圖。同樣,您不希望可以更改的數據區域是可執行的。如果程序中存在安全漏洞並且存在安全漏洞,當惡意代碼將其作爲數據加入程序數據區域並觸發這些安全漏洞(例如緩衝區溢出)時,程序可能會被迫做出有害的事情。
另一個是存儲......在許多程序中,許多數據區根本沒有初始化,或者初始化爲一個公共的預定義值(通常爲0)。當程序加載並即將啓動時,必須爲這些數據區保留內存,但這些區域不需要存儲在磁盤上,因爲那裏沒有有意義的數據。
在某些系統上,你可能在一個地方(節/段/等)擁有一切。這裏有一個值得注意的例子是MSDOS,其中.COM風格的程序除了必須小於大約64KB之外沒有其他結構,第一個可執行指令必須出現在文件的開頭,並假定其位置對應於IP = 0x100(其中IP是指令指針寄存器)。如何在.COM程序中放置代碼和數據以及如何交織是不重要的,並且取決於程序員。
還有其他架構工件,如x86段。同樣,MSDOS是一個處理它們的操作系統的好例子。 .EXE風格的程序可能包含多個與x86 CPU段直接對應的段,以及實模式尋址方案,其中通過稱爲段的64KB長的「窗口」查看內存。這些窗口/段的位置相對於CPU段寄存器的值。通過更改段寄存器值,可以移動「窗口」。爲了訪問超過64KB,需要使用不同的段寄存器值,這通常意味着.EXE中有多個段(可以不只是一個代碼段和一個數據段,也可以是其中任何一個的多個段)。
難道這種區別僅僅是將安全性修補到數據和指令共享相同內存的von-Neumann體系結構中的一個很大而且很冒險的解決方法嗎?
- 1. 數據和堆棧部分
- 2. 爲什麼內存分成堆棧和堆?
- 3. 爲什麼堆棧地址低於Visual C++中的堆棧地址?
- 4. 爲什麼這個分配堆棧而不是堆?
- 5. 爲什麼在堆棧上分配這麼多空間?
- 6. 堆棧爲空...爲什麼?
- 7. 堆棧分配,爲什麼多餘的空間?
- 8. 進程虛擬內存 - 堆棧和堆之間的空間
- 9. 靜態,堆棧和堆內存分配的地址排序?
- 10. 何時爲本地變量分配堆棧空間?
- 11. 線程堆棧和進程堆棧有什麼區別
- 12. 這個(部分)MergeSort實現爲什麼吹出堆棧?
- 13. 堆棧UICollectionView部分
- 14. 爲什麼堆棧和堆都需要內存分配
- 15. C++堆棧/堆棧。爲什麼只有一個新操作員?
- 16. 進程堆棧和CPU堆棧有什麼區別?
- 17. 堆VS數據段VS堆棧分配
- 18. 爲什麼堆棧被稱爲抽象數據類型。如果堆棧是adt,那麼如何實現堆棧?
- 19. 內存分配,堆棧和堆棧
- 20. 爲什麼我的const數組存儲在堆棧而不是文本部分?
- 21. 堆/堆棧上的類成員分配?
- 22. 將堆棧的值分配給另一個堆棧
- 23. 如果大部分數據都堆在堆棧上,堆棧內存的主要重要性/作用是什麼?
- 24. 堆棧上分配多少空間
- 25. 堆棧在c分配空間
- 26. 爲什麼GHC爲每個線程都有一個堆棧?
- 27. 分形和「java.lang.OutOfMemoryError:Java堆空間」
- 28. 兩個進程具有相同的堆棧指針。爲什麼?
- 29. 我的程序,以簡化分數被打調用堆棧限制。爲什麼?
- 30. 爲什麼堆棧結束爲空?
也堆棧和堆的增長/收縮不同,所以必須分開。 –