原帖由 albcamus 于 2007-5-9 09:38 发表于 9楼
印象里整个共享库都是以MAP_PRIVATE为标志来调用mmap影射的。
你说的对,共享库的代码段和数据段一般也是以MAP_PRIVATE来影射的。不同的只是读写权限。
是我的概念有错误。在Solaris用pmap可以看每段影射的权限和方式,可以看到,所有共享库的代码段都没有s位。
又查了一下资料,共享库的共享是通过影射来实现的,无论你是MAP_PRIVATE还是MAP_SHARED。
MAP_PRIVATE还是MAP_SHARED的不同在于是否页的内容的改变对其它进程可见。
MAP_PRIVATE+只读+执行不同影响代码段及代码段内的常量在进程间共享。
MAP_PRIVATE+读写+执行则通过COW的实现使得COW发生时,原来的页面失效,重新得到一个匿名内存页来完成一次写操作。
全局变量既然在数据段内,它就是MAP_PRIVATE+读写+执行的方式,如果进程不去改变它,它就通过major fault或者minor fault实现了共享。
进程需要修改的时候就发生一次COW。
Permissions/Flags (Mode) The virtual memory permis-
sions are shown for each
mapping. Valid permissions
are:
r: The mapping can be read
by the process.
w: The mapping can be writ-
ten by the process.
x: Instructions that reside
within the mapping can
be executed by the pro-
cess.
Flags showing additional
information for each mapping
can be displayed:
s: The mapping is shared
such that changes made
in the observed address
space are committed to
the mapped file, and are
visible from all other
processes sharing the
mapping.
bash-3.00# pmap 1221
1221: bash
08044000 16K rw--- [ stack ]
08050000 588K r-x-- /usr/bin/bash
080F2000 76K rwx-- /usr/bin/bash
08105000 184K rwx-- [ heap ]
FEA00000 2176K r-x-- /usr/lib/locale/en_US.UTF-8/en_US.UTF-8.so.3
FEC2F000 8K rwx-- /usr/lib/locale/en_US.UTF-8/en_US.UTF-8.so.3
FED08000 4K rwxs- [ anon ]
FED10000 64K rwx-- [ anon ]
FED30000 4K rwx-- [ anon ]
FED40000 56K r-x-- /usr/lib/locale/common/methods_unicode.so.3
FED5D000 4K rwx-- /usr/lib/locale/common/methods_unicode.so.3
FED60000 24K rwx-- [ anon ]
FED70000 896K r-x-- /lib/libc.so.1
FEE50000 28K rw--- /lib/libc.so.1
FEE57000 8K rw--- /lib/libc.so.1
FEE70000 4K rwx-- [ anon ]
FEE80000 560K r-x-- /lib/libnsl.so.1
FEF1C000 20K rw--- /lib/libnsl.so.1
FEF21000 24K rw--- /lib/libnsl.so.1
FEF30000 48K r-x-- /lib/libsocket.so.1
FEF4C000 4K rw--- /lib/libsocket.so.1
FEF50000 156K r-x-- /lib/libcurses.so.1
FEF87000 28K rw--- /lib/libcurses.so.1
FEF8E000 8K rw--- /lib/libcurses.so.1
FEFA0000 4K r-x-- /lib/libdl.so.1
FEFB0000 4K rwx-- [ anon ]
FEFC2000 160K r-x-- /lib/ld.so.1
FEFFA000 4K rwx-- /lib/ld.so.1
FEFFB000 8K rwx-- /lib/ld.so.1