关于维基百科上数据段解释的问题

Question about the explanation of data segment on Wikipedia?

本文关键字:段解释 问题 数据 解释 百科 于维基      更新时间:2023-10-16

根据昨天的问题,我做了一些研究,我认为我对linux进程内存映射有了更清晰的了解。

我认为我最初困惑的一个原因是维基百科上的错误解释,它声称堆是数据段的一部分,这显然是错误的。此外,它声称数据段不是只读的,因此不同于Rodata。

但是,我的理解是数据段包含rodata, BSS和data,有人可以确认我的理解吗?(如果有专家重写维基百科的文章就更好了。)

"段"是一个相当过时的概念,可以追溯到现代分页内存架构还没有被广泛使用的时候。分段架构强制了相当严格的内存布局,而分页内存允许进程拥有许多独立的虚拟内存区域,每个区域都有自己的访问限制。

Linux进程有一个文本(或代码)区域包含可执行文件的代码(从可执行文件的文本部分初始化)和一个数据区域包含运行时数据(从可执行文件的databss和(可能)rodata部分初始化)。这些区域(或多或少)对应于老式的文本和数据。它也将有一个堆栈,也可以访问内存的其他区域,例如内存映射文件和动态库中的代码。

[文章]声称堆是数据段的一部分,这显然是错误的

不一定是错的。可以通过扩展数据段(使用brk()系统调用)或创建新的内存区域(使用mmap()创建匿名映射)或两者的组合来创建堆。由第一个方法创建的堆空间是数据段的一部分,尽管在这种情况下,文章指出段具有固定大小是不正确的。

同时,它声称数据段不是只读的,因此不同于Rodata。然而,我的理解是数据段包含rodata, BSS和data。

这篇文章在这里有点混乱;不能比较(进程的内存区域)和(可执行文件的一部分)。可以通过将只读数据放在单独的写保护区域而不是可写数据区域来保护只读数据。现代桌面/服务器操作系统会这样做(通常通过将文件的rodata部分直接映射到内存中);更简单的系统可能没有写保护内存的机制,因此更有可能将其放在数据段中。

查看Linux进程中内存布局的好方法是查看/proc/<PID>/maps文件。这将显示进程可用的每个区域的虚拟地址范围、访问限制和映射文件(如果有的话)。

在现代桌面操作系统中根本没有分段。存储器有一个平面模型。任何你发现的讨论节都是指二进制可执行格式-而不是进程或操作系统。