关于维基百科上数据段解释的问题
Question about the explanation of data segment on Wikipedia?
根据昨天的问题,我做了一些研究,我认为我对linux进程内存映射有了更清晰的了解。
我认为我最初困惑的一个原因是维基百科上的错误解释,它声称堆是数据段的一部分,这显然是错误的。此外,它声称数据段不是只读的,因此不同于Rodata。
但是,我的理解是数据段包含rodata, BSS和data,有人可以确认我的理解吗?(如果有专家重写维基百科的文章就更好了。)
"段"是一个相当过时的概念,可以追溯到现代分页内存架构还没有被广泛使用的时候。分段架构强制了相当严格的内存布局,而分页内存允许进程拥有许多独立的虚拟内存区域,每个区域都有自己的访问限制。
Linux进程有一个文本(或代码)区域包含可执行文件的代码(从可执行文件的文本部分初始化)和一个数据区域包含运行时数据(从可执行文件的data、bss和(可能)rodata部分初始化)。这些区域(或多或少)对应于老式的文本和数据段。它也将有一个堆栈,也可以访问内存的其他区域,例如内存映射文件和动态库中的代码。
[文章]声称堆是数据段的一部分,这显然是错误的
不一定是错的。可以通过扩展数据段(使用brk()
系统调用)或创建新的内存区域(使用mmap()
创建匿名映射)或两者的组合来创建堆。由第一个方法创建的堆空间是数据段的一部分,尽管在这种情况下,文章指出段具有固定大小是不正确的。
同时,它声称数据段不是只读的,因此不同于Rodata。然而,我的理解是数据段包含rodata, BSS和data。
这篇文章在这里有点混乱;不能比较段(进程的内存区域)和段(可执行文件的一部分)。可以通过将只读数据放在单独的写保护区域而不是可写数据区域来保护只读数据。现代桌面/服务器操作系统会这样做(通常通过将文件的rodata部分直接映射到内存中);更简单的系统可能没有写保护内存的机制,因此更有可能将其放在数据段中。
查看Linux进程中内存布局的好方法是查看/proc/<PID>/maps
文件。这将显示进程可用的每个区域的虚拟地址范围、访问限制和映射文件(如果有的话)。
在现代桌面操作系统中根本没有分段。存储器有一个平面模型。任何你发现的讨论节都是指二进制可执行格式-而不是进程或操作系统。
- 在java中解决这段代码时面临循环中的问题
- 有人可以解释一下这段代码如何能够反转字符串
- 使用同一类中的方法重新分配字段时出现问题
- 有人可以向我解释一下这段代码的作用吗?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 有谁知道这段代码有什么问题?
- 无法解释以下C++代码段的输出
- 这段简单的代码有什么问题?
- 关于如何使用此代码段实现 SFINAE 的问题
- 这段代码有什么问题?斐波那契级数
- C++:为什么这段代码给我内存问题/未定义的行为?
- 我的开关菜单在一段时间循环中出现问题
- BST插入的这段代码有什么问题?
- 谁可以帮助解释我的代码中出了什么问题.计算C ++中的数组
- 函数以相反的顺序输出输入问题,并改进算法以解释相等的数字
- 有人可以向我解释一下这段代码是如何工作的吗?(程序在预期数值且用户输入其他输入时再次要求用户输入)
- 自定义迭代器而不是解释问题
- 单链表段故障问题
- 关于维基百科上数据段解释的问题
- 释放c++映射值中的指针字段的问题