网络通讯编程

2.4、进程映像

2019-03-22  本文已影响0人  奥斯特洛司机

在linux中,进程映像可以在/proc/$pid/map看到代码段、堆、共享库、栈等的地址范围

1、程序时报存在磁盘上的可执行文件。
2、运行程序时,需要将可执行文件加载到内存,形成进程。
3、一个程序(文件)可以同时存在多个进程(内存)。
4、进程在内存空间中的布局就是进程映像。

     基于intel处理器,从低地址到高地址依次为:
     代码区(text):可执行指令(函数)、字面值常量(10,20,3.14)、具有常属性的全局和静态局部变量(带const)。只读。(强行修改会导致段错误)
     数据区(data):初始化的全局和静态局部变量。
     BSS区              :未经初始化的全局和静态局部变量。进程一经加载此区即被清0.
     以上两区统称全局区或静态区。

    堆区(heap):动态分配内存。从低地址向高地址扩展。
    栈区(stack):非静态局部变量(包括带常属性的局部变量),包括函数和参数的返回值,从高地址向低地址扩展。

栈区和堆区之间存在一块间隙,
一方面为堆和栈增长预留空间,同时共享库、共享内存等亦位于此。

命令行参数与环境区:命令行参数和环境变量。
2.4、进程映像
//map.c
#include <stdio.h>
#include <stdlib.h>

const int const_global = 0; //常全局变量   (代码段)
int init_global = 0;            //初始化全局变量  (数据段)
int uninit_global;                 //未初始化的全局变量 (bss段)

int main(int argc ,char* argv[]){                 //mian函数也在代码段
    const static init const_static = 0 ; //常静态变量  (代码段)
    static int  init_static = 0; //初始化静态变量         (数据段)
    static int uninit_static;   //未初始化的静态变量   (bss段)
    const int const_local = 0; //常局部变量     (栈)
    int prec_local; //前局部变量,高到低扩展
    int next_local; //后局部变量
    int* prev_heap = malloc(size_of(int)); //前堆变量,低到高扩展
    int* next_heap = malloc(size_of(int)); //后堆变量
    const char* literal = "literal"; //字面值常量  (代码段)
    extern char ** environ; //环境变量
    printf("地址:%p",&environ);   //依次打印每个变量的地址
    
    return 0;
}

输出结果图如下(2-5):


2.4、进程映像 2.4、进程映像
上一篇 下一篇

猜你喜欢

热点阅读