• 进程映像学习


    转自:https://www.yiibai.com/ipc/ipc_process_image.html

    https://blog.csdn.net/u010191034/article/details/39108635

    1.介绍

    进程映像是执行程序时所需的可执行文件。(它和PCB有所区分,PCB更像是一个数据结构来保存程序的运行时信息。)

    它从低地址到高地址包含以下:

    • 代码段或文本段
    • 数据段
    • 堆段
    • 栈段

     进程地址空间,即进程映像,或者进程的内存映像

    2.展开

    2.1 文本段或代码段TEXT

    固定长度,保存程序,由可执行指令组成的目标文件程序虚拟地址空间的一部分。通常属于只读。

    2.2 数据段DATA

    用来存放程序中已初始化全局/静态变量的一块内存区域。数据段属于静态内存分配。

    //但我还有一个问题,就是如果是函数中的static,那应该是等到运行函数时才创建了static,并且生成周期会一直存在,那它会被存储在哪个区域?

    //下面做了一个实验,如果初始化的话会被放在data区,未初始化会被放在bss区,逻辑是一样的。

    2.3 BSS段

    BSS是英文Block Started by Symbol(符号启动的块)的简称。用来存放程序中未初始化的全局变量的一块内存区域。

    2.4 堆HEAP

    用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。由低地址向高地址增长。

    通过malloc或free来申请或释放。

    2.5 栈段STACK

     是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量。由高地址向低地址增长。

    在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。

    3.例子

    //segment_size1.c
    //无其他变量
    #include<stdio.h> 
    int main() 
    { printf("Hello World
    "); 
        return 0; 
    }
    
    //segment_size2.c
    //包含一个未初始化的静态变量
    #include<stdio.h> 
    int main() 
    {      static int a;
        printf("Hello World
    "); 
        return 0; }
    
    //segment_size3.c
    //包含一个未初始化的和一个初始化的静态变量
    #include<stdio.h> 
    int main() 
    {     static int a;
        static int b=5;
        printf("Hello World
    "); 
        return 0; }
    
    //segment_size4.c
    //包含一个未初始化的、一个初始化的静态变量,一个初始化的全局变量
    #include<stdio.h> 
    int c=100;
    int main() 
    {    static int a;
        static int b=5;
        printf("Hello World
    "); 
            return 0; }
    
    //funcs.c
    //在4的基础上又添加了一个函数内部的局部静态变量
    #include<stdio.h> 
    int c=100;
    void fun(){//没有调用到这个函数
        static int d=100;
    }
    int main() 
    { 
        static int a;
        static int b=5;
        printf("Hello World
    "); 
        return 0; }

    结果:

    size segment_size1 segment_size2 segment_size3 segment_size4 funcs
    
       text       data        bss        dec        hex    filename
       1514        600          8       2122        84a    segment_size1 //不包含变量
       1514        600          8       2122        84a    segment_size2 //一个未初始化的静态变量(应该是bss+4的)
       1514        604         12       2130        852    segment_size3 //一个初始化、一个未初始化(data和bss分别+4)
       1514        608          8       2130        852    segment_size4 //多加一个初始化全局(data+4)
       1554        612         12       2178        882    funcs   //放在了初始化的data区!
  • 相关阅读:
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/14360396.html
Copyright © 2020-2023  润新知