Linux进程的虚拟内存区域划分
Linux进程的虚拟内存区域分为:代码区、只读常量区、全局区、BSS段、堆区、栈区
代码区:存储功能代码,函数名所在的区域
只读常量区:存放字符串常量,以及const修饰的全局变量
全局区/数据区:存放已经初始化的全局变量和已经初始化用static修饰的局部变量
BSS段:存放没有初始化的全局变量和未初始化静态局部变量,该区域会在main函数执行前进行自动清零
堆区:使用malloc/new free/delete函数处理的内存,该区域的内存需要程序员手动申请和释放
栈区:存放局部变量(包括函数的形参),const修饰的局部变量以及块变量,该区域的内存由操作系统负责分配和回收,程序员尽管放心使用
注意:栈区和堆区之间并没有严格分割线,可以进行微调,并且堆区分配一般从低地址到高地址分配,而栈区分配一般从高地址到低地址分配
可以通过以下代码来验证以上Linux进程的虚拟内存区域划分
//进程中内存区域的划分
#include <stdio.h>
#include <stdlib.h>
#include <string.h> int i1 = ; //全局区
int i2 = ; //全局区
int i3; //BSS段
const int i4 = ;//只读常量区 void fn(int i5) //栈区
{
int i6 = ;//栈区
static int i7 = ;//全局区
const int i8 = ; //栈区
int* p1 = (int*)malloc(sizeof(int));//堆区
int* p2 = (int*)malloc(sizeof(int));//堆区
char* str = "good";//只读常量区
char strs[] = "good";//栈区 printf("只读常量区:&i4 = %p\n",&i4);
printf("只读常量去:str = %p\n",str); printf("---------------------\n");
printf("全局区:&i1 = %p\n",&i1);
printf("全局区:&i2 = %p\n",&i2);
printf("全局区:&i7 = %p\n",&i7); printf("---------------------\n");
printf("BSS段:&i3 = %p\n",&i3); printf("---------------------\n");
printf("堆区:p1 = %p\n",p1);
printf("堆区:p2 = %p\n",p2); printf("---------------------\n");
printf("栈区:&i5 = %p\n",&i5);
printf("栈区:&i6 = %p\n",&i6);
printf("栈区:&i8 = %p\n",&i8);
printf("栈区:strs = %p\n",strs);
} int main(void)
{
printf("代码区:fn = %p\n",fn); printf("-----------------------\n");
fn();
return ;
}
执行结果如下:
代码区:fn = 0x40062d
-----------------------
只读常量区:&i4 = 0x400884
只读常量去:str = 0x400888
---------------------
全局区:&i1 = 0x601058
全局区:&i2 = 0x60105c
全局区:&i7 = 0x601060
---------------------
BSS段:&i3 = 0x601068
---------------------
堆区:p1 = 0x1d9b010
堆区:p2 = 0x1d9b030
---------------------
栈区:&i5 = 0x7ffd409525ec
栈区:&i6 = 0x7ffd409525f0
栈区:&i8 = 0x7ffd409525f4
栈区:strs = 0x7ffd40952610
Linux进程的虚拟内存区域划分的更多相关文章
- Linux进程的虚拟内存
简介 用户进程的虚拟地址空间是Linux的一个重要的抽象:它为每个运行进程提供了同样的系统视图,这使得多个进程可以同时运行,而不会干扰到其他进程内存中的内容. 每个应用程序都有自己的线性地址空间,与所 ...
- linux进程虚拟地址空间
转载源 在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中.这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块.在Linux系统中, ...
- linux 进程地址空间的一步步探究
我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间.其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间. 那虚拟内存空间 ...
- UNIX环境高级编程——Linux进程地址空间和虚拟内存
一.虚拟内存 分段机制:即分成代码段,数据段,堆栈段.每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低特权级(用户),每当程序试图访问(权限又分为可读.可写和可执行)一个 ...
- Linux进程地址空间和虚拟内存
一.虚拟内存 先来看一张图(来自<Linux内核完全剖析>),如下: 分段机制:即分成代码段,数据段,堆栈段.每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低 ...
- Linux进程地址空间与虚拟内存
http://blog.csdn.net/xu3737284/article/details/12710217 32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G ...
- linux进程用户内存空间和内核空间
When a process running in user mode requests additional memory, pages are allocated from the list of ...
- Linux进程地址空间 && 进程内存布局[转]
一 进程空间分布概述 对于一个进程,其空间分布如下图所示: 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码. 初始化过的数据(Data):在程序运行初已经对变量进行初始 ...
- 浅析Linux进程空间布局
一.进程空间分布概述 对于一个进程,其空间分布如下图所示: 1.参数说明 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码. 初始化过的数据(Data):在程序运行初已经对变量进行初 ...
随机推荐
- Spfa【P1813】拯救小tim_NOI导刊2011提高(02)
Description 小tim在游乐场,有一天终于逃了出来!但是不小心又被游乐场的工作人员发现了„„所以你的任务是安全地把小tim护送回家.但是,A市复杂的交通状况给你出了一大难题. A市一共有n个 ...
- [TJOI2009] 战争游戏
题目背景 小R正在玩一个战争游戏.游戏地图是一个M行N列的矩阵,每个格子可能是障碍物,也可能是空地,在游戏开始时有若干支敌军分散在不同的空地格子中.每支敌军都可以从当前所在的格子移动到四个相邻的格子之 ...
- 集合框架(高级for的使用)
高级for循环 格式: for(数据类型 变量名 :被遍历的集合(collection)或者数组){} 对集合进行遍历,只能获取元素,但是不能对元素进行过多的操作 迭代器除了遍历,还可以进行remov ...
- iptables 要点总结
http://jiayu0x.com/2014/12/02/iptables-essential-summary/
- CSS3快速浏览器前缀的方法
在做前端开发时,经常要在css3的属性前加上各浏览器厂商的前缀:,如 Chrome(谷歌浏览器) :-webkit- Safari(苹果浏览器) :-webkit- Firefox(火狐浏览器) :- ...
- Javascript Apply和Call的使用
Apply Function.apply(obj,args)方法能接收两个参数obj:这个对象将代替Function类里this对象args:这个是数组,它将作为参数传给Function(args-- ...
- 谈谈 ES7、ES8、ES9 和 Stage 3 的那些事儿
ES6 作为多年来 JavaScript 的重大版本变革,受到 JavaScript 开发者们的普遍欢迎. 也正是从 ES6 (ES2015) 开始,JavaScript 版本发布变为年更,即每年发布 ...
- 编译spark源码及塔建源码阅读环境
编译spark源码及塔建源码阅读环境 (一),编译spark源码 1,更换maven的下载镜像: <mirrors> <!-- 阿里云仓库 --> <mirror> ...
- 【转】javascript 的类,原型,继承的理解
原文: https://www.cnblogs.com/codernie/p/9098184.html ------------------------------------------------ ...
- 安装jenkins插件的两种方法
安装jenkins插件有两种方法,一种是在线安装,一种是离线安装.两种方式介绍如下: 1.如果服务器可以上网,那边选择在线安装最好不过了,安装流程为:系统管理----插件管理---选择需要的插件直接安 ...