问题:全局变量和全局常量在进程地址空间的位置?
显然,根据前面的叙述,全局变量在用户的数据段,那么全局常量呢,是数据段吗?
同样的,可以利用mdb将test5进程挂起,然后用pmap命令求证一下:
# mdb test5
Loading modules: [ libc.so.1 ]
> ::sysbp _exit ; 在系统调用_exit处设置断点
> :r ; 运行程序
mdb: stop on entry to _exit
mdb: target stopped at:
libc.so.1`exit+0x2b: jae +0x15
>
此时,程序运行后在_exit处挂起,可以利用pmap在另一个终端内查看test5进程的地址空间了:
# ps -ef | grep test5
root 1387 1386 0 02:23:53 pts/1 0:00 test5
root 1399 1390 0 02:25:03 pts/3 0:00 grep test5
root 1386 1338 0 02:23:41 pts/1 0:00 mdb test5
# pmap -F 1387 ; 用pmap强制查看
1387: test5
08044000 16K rwx-- [ stack ] ; test5的stack
08050000 4K r-x-- /export/home/asm/L3/test5 ; test5的代码段,起始地址为0x08050000
08060000 4K rwx-- /export/home/asm/L3/test5 ; test5的数据段,起始地址为0x08060000
DDAC0000 628K r-x-- /usr/lib/libc.so.1
DDB6D000 24K rwx-- /usr/lib/libc.so.1
DDB73000 4K rwx-- /usr/lib/libc.so.1
DDB80000 4K r-x-- /usr/lib/libdl.so.1
DDB90000 292K r-x-- /usr/lib/ld.so.1
DDBE9000 16K rwx-- /usr/lib/ld.so.1
DDBED000 8K rwx-- /usr/lib/ld.so.1
total 1000K
可以看到,由于test5程序没有使用malloc来申请内存,所以没有heap的映射
前面用mdb观察过这些全局变量和常量的初始化值,它们的地址分别是:
全局变量i,j,k:
0x8060904起始的12字节
全局变量l,m,n:
0x8060948起始的12字节
全局常量o,p,q:
0x8050808起始的12字节
显然,根据这些变量的地址,我们可以初步判断出这些变量属于哪个段: