c++ - 关于维基百科数据段的解释问题?

标签 c++ linux

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

我认为我最初感到困惑的一个原因是对 Wikipedia 的错误解释,它声称堆是数据段的一部分,这显然是错误的。此外,它声称数据段不是只读的,因此与 Rodata 不同。

但是,我的理解是数据段包含rodata、BSS、data,谁能证实我的理解? (如果专家能改写维基百科的文章就更好了。)

最佳答案

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

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

[the article] claims heap is a part of data segment, which is obviously wrong

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

Also, it claims that data segment is not read-only and thus different from Rodata. However, my understanding is that data segment contains rodata, BSS, and data.

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

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

关于c++ - 关于维基百科数据段的解释问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7502314/

相关文章:

linux asm 问题 : calling extern function

c++ - Tcp Client 发送的数据接收速度非常慢

linux - 用 bash 脚本中的新行替换字符串

c++ - 如何正确访问打包结构成员

c++ - 将 Windows 命名管道与 ffmpeg 管道一起使用

c - 为什么 valgrind 在调用 `pcap_open_offline` 时会报告内存泄漏?

linux - 象夫基准

linux - 如果两个进程在没有锁的情况下访问同一个文件会发生什么?

c++ - 如何使用 V2 CP 示例自定义 Windows 10 凭据提供程序?

c++ - 如何在单个删除语句中删除多个动态分配的数组?