0

在linux中,每个进程都有地址空间,当创建子进程时,这个地址空间将被 exec() 系统调用覆盖。我想知道这个地址空间是由什么组成的?地址空间中会有什么样的信息?

4

1 回答 1

3

地址空间由许多内存段组成。其中:

  • 程序的可执行代码和静态数据
  • 堆栈
  • 程序启动时加载的共享库
  • 使用 .映射到地址空间的其他文件mmap()
  • 共享内存段
  • ETC...

有些段是只读的(如程序的可执行代码,aka .text),有些是可写的(如堆)。有些是由磁盘上的文件支持的,有些是纯粹基于内存的。

在 Linux 中,您可以查看/proc/<pid>/maps任何进程 ID 的内容,以了解哪些段是该进程地址空间的一部分。

当您成功调用exec()时,当前进程地址空间中的所有段都未映射,新的可执行文件在启动时会获得一组全新的基本映射(堆栈、堆、程序代码等)。

于 2013-03-18T02:37:16.410 回答