1

我正在开发 Ubuntu 14.04 LTS。

  • 有两个文件:file1.cfile2.c
  • 它们分别被编译成exec1exec2file2.c使用静态库中的函数。

exec1使用 .映射exec2到它的虚拟地址空间mmap。以下行来自file1.c

#define MAX_SIZE_BYTES 4000000
fd = open(exec2_path, O_RDONLY);
addr = mmap(NULL, MAX_SIZE_BYTES, PROT_READ, MAP_FILE | MAP_SHARED, fd, 0);

发生以下一系列事件:

  1. exec1被执行。
  2. exec1映射exec2到它的虚拟地址空间(这里到底发生了什么?)
  3. exec2被执行(在这个阶段,exec1一直在后台运行。现在到底发生了什么?)

PS:我想知道当exec2它在磁盘上并且它是mmap由 ed时会发生什么exec1?虚拟地址空间和对应的页表是如何exec1变化的?
接下来,当exec2实际执行时,它被带到主存中。事情如何变化?内存中使用的静态库函数在file2.c哪里?我对这个过程没有一个清晰的概念。任何人都可以阐明这个话题吗?

4

1 回答 1

1

从逻辑的角度来看,这就是您要做的事情。我的意思是我简化了一些太监系统上发生的文件系统问题。

您的 mmap 调用实际上是在创建一个新的页面文件,其中 exec2_path 指定了该页面文件。您正在使用此文件设置只读页面,其中 addr 指向页面范围的开头。如果您开始访问由 addr 指定的内存,它将触发页面错误,该页面错误将从文件 exec2_path 加载数据。

因为您只有 exec2_path 文件的读取权限,所以运行它也不会影响执行映射的可执行文件。

mmap 有两个用途,我可以想到我的头顶。只读 memmap 通常是读取必须在内存中处理的大文件的最有效方式,例如解码图像。

可以使用读/写内存映射(结合锁定机制)在进程之间交换数据。

于 2015-05-31T16:43:19.157 回答