一个C程序的内存布局(memory layout)
2012-02-29 00:07
218 查看
【吾阅吾评】:
【转自】:/article/10568122.html
一个C程序一直以来都是由以下5个段(pieces)组成:
int maxcount = 99;
使得变量maxcount根据其初始值被存储到初始化数据段。
long sum[1000];
使得变量sum被存储到未初始化数据段/bss段中。
frame)就会被使用,这样这个新实例栈里的一组变量就不会和该函数的另一个实例栈里面的变量互相干扰。
在一个a.out中,还有许多段类型存在(Several more segment types exist in an a.out)。 如符号表(symbol table),调试信息(debugging information),动态共享库的连接表(linkage tables for dynamic shared libraries)等。这些额外的section(不是segment)不会作为被一个进程执行的程序映象的一部分。
从图7.6中要注意到bss段的内容没有被存储到磁盘上的程序文件中(the program file on disk)。这是因为kernel在程序开始运行之前将该段都置为0。程序中唯一需要被存储到程序文件中的部分是代码段和初始化数据段。运行在Intel x86处理器上的linux,代码段(text segment)从地址0x08048000开始(往上),栈底从地址0xC0000000往下(在这个特定的表示结构中,栈段从高地址向低地址扩展)。 在堆顶和栈顶之间的虚拟地址空间是很大的(这保证了2个段不会互相干扰)。
命令size会报告这3个段的大小:代码段,初始化数据段,未初始化数据段。例如:
$ size /usr/bin/cc /bin/sh
text data bss dec hex filename
79606 1536 916 82058 1408a /usr/bin/cc
619234 21120 18260 658614 a0cb6 /bin/sh
第四和第五列是这3个段的总计大小,分别以十进制和十六进制表示出来。
【转自】:/article/10568122.html
一个C程序一直以来都是由以下5个段(pieces)组成:
代码段(text segment):
存放CPU执行的机器指令(machine instructions)。通常情况下,代码段是可共享的,使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份拷贝即可,比如文本编辑器 (text editors),C编译器,shell等等。另外,代码段也通常是只读的,使其只读的原因是防止一个程序意外地修改了它的指令(prevent a program from accidentally modifying its instructions)。初始化数据段/数据段(initialized data segment/data segment):
该段包含了在程序中明确被初始化的变量。例如,一个不在任何函数内的C声明(C declaration)int maxcount = 99;
使得变量maxcount根据其初始值被存储到初始化数据段。
未 初始化数据段/bss段(uninitialized data segment/"bss" segment):
bss这个叫法是根据一个早期的汇编运算符而来,这个汇编运算符标志着一个块的开始(stood for "block started by symbol")。在程序开始执行之前,bss段的数据被kernel初始化为0或者空指针(null pointers)。一个不在任何函数内的C声明long sum[1000];
使得变量sum被存储到未初始化数据段/bss段中。
栈 段(stack):
where automatic variables are stored, along with information that is saved each time a function is called. 每次当一个函数被调用,该函数的返回地址和一些关于caller的信息,比如某些寄存器的内容,将被首先存储到栈段。然后这个被调用的函数 (caller)再为它的自动变量和临时变量(automatic and temporary variables)在栈段上分配空间。这就是C如何实现函数的递归调用。每次一个递归函数调用其本身,一个新的栈框架(stackframe)就会被使用,这样这个新实例栈里的一组变量就不会和该函数的另一个实例栈里面的变量互相干扰。
堆段(heap):
用于动态内存分配(dynamic memory allocation)。一直以来,堆在内存中的位置是介于bss段和栈段之间。在一个a.out中,还有许多段类型存在(Several more segment types exist in an a.out)。 如符号表(symbol table),调试信息(debugging information),动态共享库的连接表(linkage tables for dynamic shared libraries)等。这些额外的section(不是segment)不会作为被一个进程执行的程序映象的一部分。
从图7.6中要注意到bss段的内容没有被存储到磁盘上的程序文件中(the program file on disk)。这是因为kernel在程序开始运行之前将该段都置为0。程序中唯一需要被存储到程序文件中的部分是代码段和初始化数据段。运行在Intel x86处理器上的linux,代码段(text segment)从地址0x08048000开始(往上),栈底从地址0xC0000000往下(在这个特定的表示结构中,栈段从高地址向低地址扩展)。 在堆顶和栈顶之间的虚拟地址空间是很大的(这保证了2个段不会互相干扰)。
命令size会报告这3个段的大小:代码段,初始化数据段,未初始化数据段。例如:
$ size /usr/bin/cc /bin/sh
text data bss dec hex filename
79606 1536 916 82058 1408a /usr/bin/cc
619234 21120 18260 658614 a0cb6 /bin/sh
第四和第五列是这3个段的总计大小,分别以十进制和十六进制表示出来。
相关文章推荐
- 一个C程序的内存布局(memory layout)(转)
- 一个C程序的内存布局(memory layout)
- 一个C程序的内存布局(memory layout)
- 一个C程序的内存布局(memory layout)
- 7.6. 一个C程序的内存布局(memory layout)
- 一个Linux C进程内存布局的验证程序的分析
- Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解)
- 一个c程序的内存布局
- 用一个词(TASPK)牢记C程序内存布局
- 【翻译】Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解)
- c/c++程序的内存布局
- C语言编程程序的内存如何布局
- 程序内存空间布局以及对栈顶,栈底的理解
- 字节序,C程序内存布局【很好的文章】
- 一个C程序运行时的内存分配情况
- C/C++程序内存布局
- Unix中C程序内存布局
- C++程序运行时内存布局之----------this到底是什么?
- 在Linux 系统中,在运行一个程序时,程序中未初始化的全局变量会被加载到以下哪个内存段中?
- C程序的内存布局(Memory Layout)