在linux中,每个进程都有地址空间,当创建子进程时,这个地址空间将被 exec() 系统调用覆盖。我想知道这个地址空间是由什么组成的?地址空间中会有什么样的信息?
问问题
2915 次
1 回答
3
地址空间由许多内存段组成。其中:
- 程序的可执行代码和静态数据
- 堆
- 堆栈
- 程序启动时加载的共享库
- 使用 .映射到地址空间的其他文件
mmap()
。 - 共享内存段
- ETC...
有些段是只读的(如程序的可执行代码,aka .text
),有些是可写的(如堆)。有些是由磁盘上的文件支持的,有些是纯粹基于内存的。
在 Linux 中,您可以查看/proc/<pid>/maps
任何进程 ID 的内容,以了解哪些段是该进程地址空间的一部分。
当您成功调用exec()
时,当前进程地址空间中的所有段都未映射,新的可执行文件在启动时会获得一组全新的基本映射(堆栈、堆、程序代码等)。
于 2013-03-18T02:37:16.410 回答