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进程的虚拟内存区域划分的更多相关文章

  1. Linux进程的虚拟内存

    简介 用户进程的虚拟地址空间是Linux的一个重要的抽象:它为每个运行进程提供了同样的系统视图,这使得多个进程可以同时运行,而不会干扰到其他进程内存中的内容. 每个应用程序都有自己的线性地址空间,与所 ...

  2. linux进程虚拟地址空间

    转载源 在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中.这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块.在Linux系统中, ...

  3. linux 进程地址空间的一步步探究

    我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间.其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间. 那虚拟内存空间 ...

  4. UNIX环境高级编程——Linux进程地址空间和虚拟内存

    一.虚拟内存 分段机制:即分成代码段,数据段,堆栈段.每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低特权级(用户),每当程序试图访问(权限又分为可读.可写和可执行)一个 ...

  5. Linux进程地址空间和虚拟内存

    一.虚拟内存 先来看一张图(来自<Linux内核完全剖析>),如下: 分段机制:即分成代码段,数据段,堆栈段.每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低 ...

  6. Linux进程地址空间与虚拟内存

    http://blog.csdn.net/xu3737284/article/details/12710217 32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G ...

  7. linux进程用户内存空间和内核空间

    When a process running in user mode requests additional memory, pages are allocated from the list of ...

  8. Linux进程地址空间 && 进程内存布局[转]

    一 进程空间分布概述       对于一个进程,其空间分布如下图所示: 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码. 初始化过的数据(Data):在程序运行初已经对变量进行初始 ...

  9. 浅析Linux进程空间布局

    一.进程空间分布概述 对于一个进程,其空间分布如下图所示: 1.参数说明 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码. 初始化过的数据(Data):在程序运行初已经对变量进行初 ...

随机推荐

  1. NOIP2016_day1_No1玩具谜题

    #include <iostream> #include <cstdio> using namespace std; int main () { freopen("t ...

  2. Unique Word Abbreviation -- LeetCode

    An abbreviation of a word follows the form <first letter><number><last letter>. Be ...

  3. Java多线程设计模式(1)

    1 线程中的几个方法解释 Thread.sleep(long 毫秒) 在指定的时间内让当前线程休眠,将控制权交给其他线程,休眠的线程依旧拥有它所占用的锁, Thread.yield(); 暂停或者放弃 ...

  4. Linux文本过滤常用命令(转)

    01 cat命令 通常用来显示文本文件的内容 一般用来查看比较短的文本文件,因为其缓冲区有限 -s选项可以用来合并文件中多余的空行,多个空行将被压缩为一个空行; -n选项可以显示行号 -b选项可以跳过 ...

  5. 【教训】null == '',改造ThinkSNS 系统里面的一个缓存管理函数S()后,留下一个大bug

    本来想简化 ThinkSNS 系统里面的一个缓存管理函数: <?php /** * 用来对应用缓存信息的读.写.删除 * $expire = null/0 表示永久缓存,否则为缓存有效期 */ ...

  6. Visio整体移动

    同理选中第一列的两个,按向右箭头,整体友谊.

  7. python核心编程学习记录之数据库编程

  8. spring-hadoop-samples

    官方的spring-hadoop-samples的demo 写的还是挺好的,值得学习. 官网地址: http://projects.spring.io/spring-hadoop/#quick-sta ...

  9. hdu 5012 bfs --- 慎用STL 比方MAP判重

    http://acm.hdu.edu.cn/showproblem.php?pid=5012 发现一个问题 假设Sting s = '1'+'2'+'3'; s!="123"!!! ...

  10. [PWA] Add Push Notifications to a PWA with React in Chrome and on Android

    On Android and in Chrome (but not on iOS), it's possible to send push notifications with a PWA. We'l ...