2011-10-24 27 views

回答

2

至少文本和數據段是分開的,以防止存儲在變量中的惡意代碼被運行。

指令(編譯代碼)存儲在文本段中,而變量的內容存儲在數據段中,後者從不執行,只能讀取和寫入。

稍微有點信息here

4

將程序拆分爲內存中的各個部分有多種原因。

其中之一是指令和數據存儲器可以是架構上不同且不連續的,也就是說,從CPU內部和外部使用不同的指令和電路讀寫,形成兩個不同的地址空間(即讀取代碼從地址0開始並且從地址0讀取數據通常會從不同的存儲器返回兩個不同的值)。

另一個是可靠性/安全性。你很少希望程序的代碼和常量數據改變。發生這種情況的大部分時間是由於某些事情發生錯誤(無論是在程序本身還是在其輸入中,可能是惡意構建的)。你想防止這種情況發生,並知道是否有任何企圖。同樣,您不希望可以更改的數據區域是可執行的。如果程序中存在安全漏洞並且存在安全漏洞,當惡意代碼將其作爲數據加入程序數據區域並觸發這些安全漏洞(例如緩衝區溢出)時,程序可能會被迫做出有害的事情。

另一個是存儲......在許多程序中,許多數據區根本沒有初始化,或者初始化爲一個公共的預定義值(通常爲0)。當程序加載並即將啓動時,必須爲這些數據區保留內存,但這些區域不需要存儲在磁盤上,因爲那裏沒有有意義的數據。

在某些系統上,你可能在一個地方(節/段/等)擁有一切。這裏有一個值得注意的例子是MSDOS,其中.COM風格的程序除了必須小於大約64KB之外沒有其他結構,第一個可執行指令必須出現在文件的開頭,並假定其位置對應於IP = 0x100(其中IP是指令指針寄存器)。如何在.COM程序中放置代碼和數據以及如何交織是不重要的,並且取決於程序員。

還有其他架構工件,如x86段。同樣,MSDOS是一個處理它們的操作系統的好例子。 .EXE風格的程序可能包含多個與x86 CPU段直接對應的段,以及實模式尋址方案,其中通過稱爲段的64KB長的「窗口」查看內存。這些窗口/段的位置相對於CPU段寄存器的值。通過更改段寄存器值,可以移動「窗口」。爲了訪問超過64KB,需要使用不同的段寄存器值,這通常意味着.EXE中有多個段(可以不只是一個代碼段和一個數據段,也可以是其中任何一個的多個段)。

+0

也堆棧和堆的增長/收縮不同,所以必須分開。 –

0

難道這種區別僅僅是將安全性修補到數據和指令共享相同內存的von-Neumann體系結構中的一個很大而且很冒險的解決方法嗎?

相關問題