2011-09-21 15 views
0

繼昨天的問題之後,我做了一些研究,我認爲我對linux進程內存映射有了更清晰的瞭解。關於維基百科數據段解釋的問題?

我想我最初的混亂的一個原因是Wikipedia不正確的解釋,聲稱堆是數據段,這顯然是錯誤的一部分。此外,它聲稱數據段不是隻讀的,因此與Rodata不同。

不過,我的理解是,數據段包含RODATA,BSS和數據,任何人可以證實我的理解? (這將會是更好的,如果一個專家可以重寫維基百科的文章。)

+0

現代桌面操作系統沒有細分。 – Puppy

+0

來自頁面本身「這篇文章的事實準確性有爭議。」可能是因爲它是錯的。 –

回答

2

「段」是一個相當老式的概念,可以追溯到當現代分頁內存架構並沒有廣泛應用。分段體系結構強制使用相當嚴格的內存佈局,而分頁內存允許進程擁有許多單獨的虛擬內存區域,每個區域都有自己的訪問限制。

Linux進程具有文本(或代碼)包含可執行的代碼(從可執行的文本部分初始化)區域,和一個數據包含區域的運行時間數據(來自數據初始化,bss和(可能)rodata部分的可執行文件)。這些區域(或多或少)與舊式文本和數據段對應。它也會有一個堆棧,並且還可以訪問其他內存區域,例如內存映射文件和來自動態庫的代碼。

[文章]聲稱堆是數據段,這顯然是錯誤

這不一定錯的一部分。可以通過擴展數據段(使用brk()系統調用)或創建新的內存區域(使用mmap()創建匿名映射)或兩者的組合來創建堆。由第一種方法創建的堆空間是數據段的一部分,但在這種情況下,文章在說明段具有固定大小時不正確。

此外,它聲稱數據段不是隻讀的,因此與Rodata不同。但是,我的理解是數據段包含rodata,BSS和數據。

的文章是在這裏稍微困惑;你不能比較與部分(可執行文件的一部分)(進程的內存區)。只讀數據可以通過將其置於單獨的寫保護區域而不是可寫數據區域來進行保護。現代的桌面/服務器操作系統會這樣做(通常通過將文件的rodata部分直接映射到內存中)。更簡單的系統可能沒有寫保護存儲器的機制,因此更可能將其放置在數據段中。

查看如何在Linux進程中佈置內存的好方法是查看/proc/<PID>/maps文件。這將顯示進程可用的每個區域的虛擬地址範圍,訪問限制和映射文件(如果有的話)。

0

在所有有現代的桌面操作系統沒有分割。內存有一個平坦的模型。任何您發現討論的部分都是指二進制可執行格式,而不是過程或操作系統。