首页 > *nix技术, 内存管理 > Linux X86-64 进程内存空间布局

Linux X86-64 进程内存空间布局

2011年12月28日 发表评论 阅读评论 9,670 次浏览

随着硬件的快速发展,大多数操作系统都已经在使用64位系统,对于Linux下X86-64的进程内存空间布局并没有Google到很好的资料,而对于32位系统倒有不少描述得非常清晰的文档,比如:【图解】Linux下C程序进程地址空间布局linux 下 C 程序(进程) 内存布局,等等。对于Linux X86-64,刚好利用现成的系统环境做了一下简单的对比测试。测试的代码:

/**
  * malloc_addr.c
  */
#include <stdio.h>
#include <stdlib.h>

#define LARGE_SIZE   (5*(1<<20))
#define SMALL_SIZE   (1<<5)

int g;

int main (int argc, char *argv[])
{
  int l;
  int  *lp = malloc (LARGE_SIZE*sizeof(int));
  int  *sp = malloc (SMALL_SIZE*sizeof(int));

  printf ("address of g = %p\n", &g);
  printf ("address of l = %p\n", &l);
  printf ("address of lp = %p\n", lp);
  printf ("address of sp = %p\n", sp);

  free (lp);
  free (sp);

  exit (EXIT_SUCCESS);
}

在64位和32位系统上分别测试的结果如下:

[root@localhost test]# uname -a
Linux localhost.localdomain 2.6.36 #2 SMP Fri Nov 26 06:06:02 EST 2010 x86_64 x86_64 x86_64 GNU/Linux

[root@localhost test]# gdb ./a.out 
...
(gdb) c
Continuing.
address of g = 0x600a1c
address of l = 0x7fffffffe87c
address of lp = 0x7ffff6bdd010
address of sp = 0x601010

[root@localhost ~]# cat /proc/7431/maps 
00400000-00401000 r-xp 00000000 fd:00 33129547                           /root/lenky/test/a.out
00600000-00601000 rw-p 00000000 fd:00 33129547                           /root/lenky/test/a.out
00601000-00622000 rw-p 00000000 00:00 0                                  [heap]
3734600000-373461c000 r-xp 00000000 fd:00 18219336                       /lib64/ld-2.5.so
373481b000-373481c000 r--p 0001b000 fd:00 18219336                       /lib64/ld-2.5.so
373481c000-373481d000 rw-p 0001c000 fd:00 18219336                       /lib64/ld-2.5.so
3735600000-373574e000 r-xp 00000000 fd:00 18219337                       /lib64/libc-2.5.so
373574e000-373594d000 ---p 0014e000 fd:00 18219337                       /lib64/libc-2.5.so
373594d000-3735951000 r--p 0014d000 fd:00 18219337                       /lib64/libc-2.5.so
3735951000-3735952000 rw-p 00151000 fd:00 18219337                       /lib64/libc-2.5.so
3735952000-3735957000 rw-p 00000000 00:00 0 
7ffff6bdd000-7ffff7fe0000 rw-p 00000000 00:00 0 
7ffff7ffb000-7ffff7ffe000 rw-p 00000000 00:00 0 
7ffff7ffe000-7ffff7fff000 r-xp 00000000 00:00 0                          [vdso]
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
[root@localhost test]# uname -a
Linux localhost.localdomain 2.6.32-71.29.1.el6.i686 #1 SMP Mon Jun 27 18:07:00 BST 2011 i686 i686 i386 GNU/Linux

[root@localhost test]# gdb ./a.out 
...
(gdb) c
Continuing.
address of g = 0x80497c4
address of l = 0xbffff294
address of lp = 0xb6bf2008
address of sp = 0x804a008

[root@localhost test]# cat /proc/11620/maps 
00110000-00111000 r-xp 00000000 00:00 0          [vdso]
00788000-007a6000 r-xp 00000000 08:02 3408776    /lib/ld-2.12.so
007a6000-007a7000 r--p 0001d000 08:02 3408776    /lib/ld-2.12.so
007a7000-007a8000 rw-p 0001e000 08:02 3408776    /lib/ld-2.12.so
007ae000-00933000 r-xp 00000000 08:02 3408780    /lib/libc-2.12.so
00933000-00934000 ---p 00185000 08:02 3408780    /lib/libc-2.12.so
00934000-00936000 r--p 00185000 08:02 3408780    /lib/libc-2.12.so
00936000-00937000 rw-p 00187000 08:02 3408780    /lib/libc-2.12.so
00937000-0093a000 rw-p 00000000 00:00 0 
08048000-08049000 r-xp 00000000 08:05 7299076    /home/lenky/test/a.out
08049000-0804a000 rw-p 00000000 08:05 7299076    /home/lenky/test/a.out
0804a000-0806b000 rw-p 00000000 00:00 0          [heap]
b6bf2000-b7ff4000 rw-p 00000000 00:00 0 
b7ffe000-b8000000 rw-p 00000000 00:00 0 
bffeb000-c0000000 rw-p 00000000 00:00 0          [stack]

根据测试结果,可以初步看到:
32位的内存布局是[vdso]-[lib]-[txt]-[small_heap]-[large_heap/mmap]-[stack]
64位的内存布局是[txt]-[small_heap]-[lib]-[large_heap/mmap]-[vdso]-[stack]
虽然有一些变化,但基本的text/heap/stack顺序还是没变,但64位下的代码段起始地址将从0x400000开始,而不再是32位下的0x8048000,小容量堆内存申请的地址也将落在0x600000区,这些都需要注意。更深入的相关内容等待后续。

转载请保留地址:http://www.lenky.info/archives/2011/12/600http://lenky.info/?p=600


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.