2011-09-21 65 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

在所有有现代的桌面操作系统没有分割。内存有一个平坦的模型。任何您发现讨论的部分都是指二进制可执行格式,而不是过程或操作系统。