Chinaunix首页 | 论坛 | 博客
  • 博客访问: 265666
  • 博文数量: 107
  • 博客积分: 305
  • 博客等级: 二等列兵
  • 技术积分: 417
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-22 09:42
文章分类

全部博文(107)

文章存档

2014年(3)

2013年(41)

2012年(34)

2011年(28)

2008年(1)

分类:

2011-07-04 10:33:27

原文地址:进程内存结构实验 作者:lisongggg

  1. #include <stdlib.h>

  2. extern char **environ;
  3. int globalvar = 0;
  4. const int globalconst;

  5. int main(int argc, char *argv[])
  6. {
  7.     static int staticvar = 0;
  8.     int localvar;
  9.     const int localconst;
  10.     char localarray[16];
  11.     char *p1;
  12.     char *p2="1111111111111";
  13.     char *p3;
  14.     
  15.     p1=(char*)malloc(16);
  16.     p3=(char*)malloc(16);

  17.     printf("item \t\taddress\n");
  18.     printf("---------------------\n");
  19.     printf("main entry\t0x%x\n",main);
  20.     printf("staticvar\t0x%x\n",&staticvar);
  21.     printf("globalvar\t0x%x\n",&globalvar);
  22.     printf("globalconst\t0x%x\n",&globalconst);
  23.     printf("111111111\t0x%x\n",p2);
  24.     printf("argc\t\t0x%x\n",&argc);
  25.     printf("argv\t\t0x%x\n",&argv);
  26.     printf("argv[0]\t\t0x%x\n",argv);
  27.     printf("localvar\t0x%x\n",&localvar);
  28.     printf("localconst\t0x%x\n",&localconst);
  29.     printf("localarray\t0x%x\n",localarray);
  30.     printf("malloc1\t\t0x%x\n",p1);
  31.     printf("malloc2\t\t0x%x\n",p3);
  32.     printf("environ[0]\t0x%x\n",environ);
  33.     printf("environ[0][0]\t0x%x\n",environ[0]);
  34.     return;
  35. }

实验结果:
lisong@lisong:~/code/experiment/proc/proc_struct$ ./proc_struct
item         address
---------------------
main entry    0x80484c4
staticvar    0x804a030
globalvar    0x804a02c
globalconst    0x804a034
111111111    0x8048730
argc        0xbfcec010
argv        0xbfcebfcc
argv[0]        0xbfcec0b4
localvar    0xbfcebfdc
localconst    0xbfcebfd8
localarray    0xbfcebfec
malloc1        0x90a6008
malloc2        0x90a6020
environ[0]    0xbfcec0bc
environ[0][0]    0xbfcec57f
lisong@lisong:~/code/experiment/proc/proc_struct$ ./proc_struct
item         address
---------------------
main entry    0x80484c4
staticvar    0x804a030
globalvar    0x804a02c
globalconst    0x804a034
111111111    0x8048730
argc        0xbfe50580
argv        0xbfe5053c
argv[0]        0xbfe50624
localvar    0xbfe5054c
localconst    0xbfe50548
localarray    0xbfe5055c
malloc1        0x8e48008
malloc2        0x8e48020
environ[0]    0xbfe5062c
environ[0][0]    0xbfe5257f
lisong@lisong:~/code/experiment/proc/proc_struct$ ./proc_struct
item         address
---------------------
main entry    0x80484c4
staticvar    0x804a030
globalvar    0x804a02c
globalconst    0x804a034
111111111    0x8048730
argc        0xbfeaede0
argv        0xbfeaed9c
argv[0]        0xbfeaee84
localvar    0xbfeaedac
localconst    0xbfeaeda8
localarray    0xbfeaedbc
malloc1        0x83d0008
malloc2        0x83d0020
environ[0]    0xbfeaee8c
environ[0][0]    0xbfeaf57f

运行多次发现:
1、代码段和全局数据段的内存地址没有变化;而堆栈区的地址每次都不同。基本摆布结构按照低地址到高地址排序,依次是:
代码段
已初始化全局数据段
未初始化全局数据段


命令行参数
环境表
2、堆的增长方向: 低地址-->高地址
3、栈的增长方向:高地址-->低地址。变量的排布顺序似乎是不定的,但变量之间的地址偏移总是一样,可见变量的分布结构是固定的。由高地址到低地址排序,变量依次为:
localarray
localvar
localconst
推测编译器是按照一定的变量类型规则排布的,具体方式有待研究。
4、代码段是只读的,一个程序运行的多个进程之间共享代码段。如果程序中做修改代码段数据的操作,程序会发生段错误。

程序结构:
lisong@lisong:~/code/experiment/proc/proc_struct$ size proc_struct
   text       data        bss        dec        hex    filename
   1926        268         24       2218        8aa    proc_struct
程序的基本结构有三段:代码段text,数据段,非初始化数据段bss,其中:text和data在进程执行的时候直接复制到内存中,bss中的变量由内核运行程序时赋值为0.
阅读(674) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~