2.4、进程映像

作者: 奥斯特洛司机 | 来源:发表于2019-03-22 14:14 被阅读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、进程映像

    相关文章

      网友评论

        本文标题:2.4、进程映像

        本文链接:https://www.haomeiwen.com/subject/uwwlvqtx.html