在可执行文件上使用时mmap()如何工作?

时间:2015-05-29 16:14:15

标签: linux operating-system mmap virtual-address-space page-tables

我正在研究Ubuntu 14.04 LTS。

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

exec1使用exec2mmap映射到其虚拟地址空间。以下行来自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 mmaps exec2到它的虚拟地址空间(这里到底发生了什么?)
  3. exec2已执行(在此阶段,exec1一直在后台运行。现在到底发生了什么?)
  4. PS:我打算知道当exec2在磁盘上时会发生什么,而mmapexec1?虚拟地址空间和与exec1对应的页面表如何变化?
    接下来,当exec2实际执行时,它将被带到主存储器。事情如何变化?内存中的哪些是file2.c中使用的静态库函数?我对这个过程并不清楚。任何人都可以阐明这个话题吗?

1 个答案:

答案 0 :(得分:1)

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

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

因为您只对exec2_path文件具有读访问权限,所以运行它对执行映射的可执行文件没有影响。

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

可以使用读/写memmaps(与锁定机制结合)在进程间交换数据。