linux内核全局变量重定位,动态链接库中全局变量的重定位问题

原帖由 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值