我正在研究Ubuntu 14.04 LTS。
file1.c
和file2.c
exec1
和exec2
。 file2.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);
发生以下一系列事件:
exec1
已执行。 exec1
mmaps exec2
到它的虚拟地址空间(这里到底发生了什么?)exec2
已执行(在此阶段,exec1
一直在后台运行。现在到底发生了什么?) PS:我打算知道当exec2
在磁盘上时会发生什么,而mmap
是exec1
?虚拟地址空间和与exec1
对应的页面表如何变化?
接下来,当exec2
实际执行时,它将被带到主存储器。事情如何变化?内存中的哪些是file2.c
中使用的静态库函数?我对这个过程并不清楚。任何人都可以阐明这个话题吗?
答案 0 :(得分:1)
从逻辑角度来看,这就是你要做的。我的意思是说,我简化了在一些太监系统上发生的文件系统问题。
您的mmap调用正在有效地创建新的页面文件,其中exec2_path指定该页面文件。您正在使用此文件设置只读页面,并且addr指向页面范围的开头。如果您开始访问addr指定的内存,它将触发将从文件exec2_path加载数据的页面错误。
因为您只对exec2_path文件具有读访问权限,所以运行它对执行映射的可执行文件没有影响。
mmap有两个用途,我可以想到我的头脑。只读memmaps通常是读取必须在内存中处理的大文件的最有效方法,例如解码图像。
可以使用读/写memmaps(与锁定机制结合)在进程间交换数据。