
- 代码段(Text segment):程序的二进制代码,一般来说,程序PC的范围就在这段(执行动态链接库代码例外)。
- 常量数据段(Data segment):存储常量数据(初始化好了的全局变量以及静态变量),如常量字符串,一般全局常量都放在此处,但是局部常量分配和编译器相关。
- BSS段(BSS segment):存储未初始化的静态变量等。
以上程序段,都是通过操作系统的load程序在程序加载时分配的,不会动态管理。下面的堆栈段就需要动态管理了。
- 堆(Heap),这些内存由操作系统的提供的malloc等系统调用管理。其中就会用到brk以及sbrk这些函数,来设置新空间分配的起始地址,堆一般比较大,地址向上增长。
- 栈(Stack),这些空间一般由用户程序自行管理,如函数调用中传参以及返回值就需要用到该段,地址向下增长。假如堆顶和栈顶地址想撞了,malloc函数申请空间就会失败(一般来说,malloc申请空间时,回比较ld_brk_point和栈顶指针sp的值)。
======= Memory map: ======== 08048000-08118000 r-xp 00000000 08:07 32899 /home/sim-wattch-1.02e/sim-outorder 08118000-0811c000 rw-p 000cf000 08:07 32899 /home/sim-wattch-1.02e/sim-outorder 0811c000-09ffa000 rw-p 00000000 00:00 0 [heap] b7dde000-b7dfb000 r-xp 00000000 08:07 83724 /lib/libgcc_s.so.1 b7dfb000-b7dfc000 rw-p 0001c000 08:07 83724 /lib/libgcc_s.so.1 b7e0c000-b7e64000 rw-p 00000000 00:00 0 b7e64000-b7fa4000 r-xp 00000000 08:07 91024 /lib/i686/cmov/libc-2.11.2.so b7fa4000-b7fa6000 r--p 0013f000 08:07 91024 /lib/i686/cmov/libc-2.11.2.so b7fa6000-b7fa7000 rw-p 00141000 08:07 91024 /lib/i686/cmov/libc-2.11.2.so b7fa7000-b7faa000 rw-p 00000000 00:00 0 b7faa000-b7fce000 r-xp 00000000 08:07 91008 /lib/i686/cmov/libm-2.11.2.so b7fce000-b7fcf000 r--p 00023000 08:07 91008 /lib/i686/cmov/libm-2.11.2.so b7fcf000-b7fd0000 rw-p 00024000 08:07 91008 /lib/i686/cmov/libm-2.11.2.so b7fde000-b7fe2000 rw-p 00000000 00:00 0 b7fe2000-b7fe3000 r-xp 00000000 00:00 0 [vdso] b7fe3000-b7ffe000 r-xp 00000000 08:07 81305 /lib/ld-2.11.2.so b7ffe000-b7fff000 r--p 0001a000 08:07 81305 /lib/ld-2.11.2.so b7fff000-b8000000 rw-p 0001b000 08:07 81305 /lib/ld-2.11.2.so bffeb000-c0000000 rw-p 00000000 00:00 0 [stack]至于brk以及sbrk的用法,由于资料二说得比较清楚,在此不在赘述。 参考资料: http://stackoverflow.com/questions/6988487/what-does-brk-system-call-do http://www.kernel.org/doc/man-pages/online/pages/man2/brk.2.html 图片来源:http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory
Comments (1)
address space layout里 program break 是什么意思?