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):在程序运行初已经对变量进行初 ...
随机推荐
- 命令注入工具Commix
命令注入工具Commix 命令注入(Command Injection)攻击是针对Web应用的一种攻击方式.很多Web应用会读取用户提交的数据,然后传递到系统Shell,执行特定的操作,如为用户创 ...
- Spark-submit脚本解读
#!/usr/bin/env bash # # Licensed to the Apache Software Foundation (ASF) under one or more # contrib ...
- POJ 1511 Invitation Cards(单源最短路,优先队列优化的Dijkstra)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 16178 Accepted: 526 ...
- 内存或磁盘空间不足,Microsoft Office Excel 无法再次打开或保存任何文档。 [问题点数:20分,结帖人wenyang2004]
在环境里是没有问题的 就是发布网站后,会出现“/”应用程序中的服务器错误.--------------------------------------------------------------- ...
- C# html的Table导出到Excel中
C#中导出Excel分为两大类.一类是Winform的,一类是Web.今天说的这一种是Web中的一种,把页面上的Table部分导出到Excel中. Table导出Excel,简单点说,分为以下几步: ...
- SQL Server大量数据秒级插入/新增/删除
原文:SQL Server大量数据秒级插入/新增/删除 1.快速保存,该方法有四个参数,第一个参数为数据库连接,第二个参数为需要保存的DataTable,该参数的TableName属性需要设置为数据库 ...
- pr_debug、dev_dbg等动态调试一
内核版本:Linux-3.14 作者:彭东林 邮箱:pengdonglin137@163.com pr_debug: #if defined(CONFIG_DYNAMIC_DEBUG) /* dyna ...
- 【spring Boot】Spring中@Controller和@RestController之间的区别
spring Boot入手的第一天,看到例子中的@RestController ............. 相同点:都是用来表示Spring某个类的是否可以接收HTTP请求 不同点:@Controll ...
- word如何修改尾注
两篇处理利用尾注处理参考文献的方式,值得注意. 实用技巧:Word 2003中修改尾注位置http://www.kuqin.com/shuoit/20090422/47316.html Word尾注格 ...
- 常用函数 __MySQL必知必会
----------------------使用数据处理函数 ---------------------- 常见的文本处理函数 Left() 返回串左边的字符Length() 返回串的长度Locate ...