程序在内存中的分布

转载,原文地址:http://blog.csdn.net/hackbuteer1/article/details/6786811

在现代的操作系统中,当我们说到内存,往往需要分两部分来讲:物理内存和虚拟内存。从硬件上讲,虚拟空间是CPU内部的寻址空间,位于MMU之前,物理空间是总线上的寻址空间,是经过MMU转换之后的空间。

一般我们所说的程序在内存中的分布指的就是程序在虚拟内存中的存储方式。

从低地址到高地址,可分为下面几段: 
预留内存地址
(操作系统维护的内存地址,不可访问) 
程序代码区(只读,存代码和一些其他的东西); 
data段(存初始化的全局变量和static变量,另外还有文字常量区,常量字符串就是放在这里,程序结束后有系统释放); 
bss段(存未初始化的全局变量和static变量); 
(由低地址向高地址增长,一般new和malloc分配,由程序员分配释放);
共享库文件(调用的库文件,位于堆和栈之间); 
(由高地址向低地址增长,和堆的增长方式相对,对不同的OS来说,栈的初始大小有规定,可以修改,目前默认一般为2M,由编译器自动分配释放); 
再上面存的都是操作系统和内核调用的一些内存地址

如图所示:

时间: 2024-10-10 12:26:26

程序在内存中的分布的相关文章

内存管理--程序在内存中的分布

在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中.这个沙盘就是虚拟地址空间(virtual address space). 1 32位虚拟内存布局 在32位模式下虚拟地址空间总是一个4GB的内存地址块.这些虚拟地址通过页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用.每一个进程拥有一套属于它自己的页表,但是还有一个隐情.只要虚拟地址被使用,那么它就会作用于这台机器上运行的所有软件,包括内核本身.因此一部分虚拟地址必须保留给内核使用: 图 1 这并不意味

c++ 程序在内存中的分布

从低地址到高地址: 1.代码区[包含常量的]:存放函数体的二进制代码 2.全局变量区[已初始化 + 未初始化]: 全局变量和静态变量的存储是放一块的,初始化的全局变量和静态变量在一块区域, 未初始化的(全局变量和的静态变量)在相邻的另一块区域.  程序结束后有系统释放 3.堆:由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 4.栈:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.

面试经常问的C语言变量在内存中的分布(VC6.0)

C/C++变量在内存中的分布在笔试时经常考到,虽然简单,但也容易忘记,因此在这作个总结,以加深印象. 一: #include <stdio.h> #include <malloc.h> int g_i = 100; int g_j = 200; int g_k, g_h; int main() { const int MAXN = 100; int *p = (int*)malloc(MAXN * sizeof(int)); static int s_i = 5; static i

程序在内存中的分配方式

1 桟区(stack):由编译器自动分配和释放,存放函数的参数值,局部变量的值,其操作方式类似于数据结构中的栈. 若申请的内存小于系统所剩内存则成功,否则就会发生栈溢出错误. 栈的增长方向是向下的,通常栈的初始化指针指向内存的最高地址,它是连续的.系统自动分配,因此速度很快. 在函数调用时,第一个进栈的是主函数的下一条指令的地址,然后是各个函数的参数,参数从右向左进栈,然后是函数中的局部变量.静态变量是不入栈的. 2 堆区(heap):一般有程序员分配和释放,若不释放,最后由操作系统回收. 它与

对一个程序在内存中的分析【转】

转自:http://blog.csdn.net/bullbat/article/details/7304404 bullbat  译 内存管理是操作系统的核心:它对于程序员和系统管理员都很关键.在接下来的几篇文章里面我将对内存的关键技术做谈论,但是不会远离其本质.然而概念很普通,例子多半来自32位X86系统的LINUX和Window操作系统.这第一篇文章谈论程序在内存中如何存放. 在多任务操作系统中的每一个进程运行在他自己的内存地址空间中.这个地址空间就是虚拟地址空间,虚拟地址空间在32位模式下

C++程序中不同变量、函数在内存中内存中的分布情况

一.一个C++编译的程序占用的内存分为以下几个部分 1.栈区:由编译器自动分配 存放函数的参数值,局部变量的值等,操作方式类似于数据结构中的栈. 2.堆区:一般由程序员分配释放,若程序员不释放,程序结束时 可能 有系统收回.它与数据结构中的堆是两回事.分配方式类似于链表. 3.全局区(静态区):全局变量和静态变量是存储放在一块的,初始化的全局变量和静态变量在一个区域,未初始化的在相邻的另一个区域. 程序结束后由系统释放. 4.文字常量区:常量字符串就存放在这里.程序结束后有系统自动释放. 5.程

2015年5月1日 转载--各种变量在内存中的分布

一般认为在c中分为这几个存储区 1栈 - 有编译器自动分配释放 2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域. 程序结束释放. 4另外还有一个专门放常量的地方. - 程序结束释放 在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上.在所有函数体外定义

程序在内存中镜像

用户空间的内存模型 Linux操作系统在加载程序时,将程序所使用的内存分为5段:text(程序段).data(数据段).bss(bss数据段).heap(堆).stack(栈). text segment(程序段) text segment用于存放程序指令本身,Linux在执行程序时,要把这个程序的代码加载进内存,放入text segment.程序段内存位于整个程序所占内存的最上方,并且长度固定(因为代码需要多少内存给放进去,操作系统是清楚的). data segment(数据段) data s

一个可执行文件的生成过程到进程在内存中的分布

可执行文件的生成 http://www.cnblogs.com/web21/p/6201735.html 总:一个可执行文件(linux elf格式文件)是通过什么方式从ELF格式文件加装从而成为进程来执行的 在Linux系统中,可以通过fork()函数来创建进程,然而创建的子进程完全复制父进程的资源,但是我们在子进程中可以使用exec函数族系统调用来创建一个自己进程,它可以根据指定的文件名或者路径名找到可执行文件(ELF文件),并用来取代原调用进程的数据段,代码段和堆栈段,在执行完后,原调用的