进程映像



现在我们已经了解了如何获取进程及其父进程的基本信息,现在是时候深入了解进程/程序信息的细节了。

什么是进程映像?进程映像是执行程序时所需的可执行文件。此映像通常包含以下部分:

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

以下是进程映像的图形表示。

Process Images

代码段是目标文件或程序虚拟地址空间的一部分,包含可执行指令。这通常是只读数据段,并且大小固定。

数据段分为两种类型。

  • 已初始化
  • 未初始化

已初始化数据段是目标文件或程序虚拟地址空间的一部分,包含已初始化的静态和全局变量。

未初始化数据段是目标文件或程序虚拟地址空间的一部分,包含未初始化的静态和全局变量。未初始化数据段也称为 BSS(以符号开始的块)段。

数据段是读写段,因为变量的值可以在运行时更改。此段的大小也是固定的。

栈段是为自动变量和函数参数分配的内存区域。它还在执行函数调用时存储返回地址。栈使用 LIFO(后进先出)机制来存储局部或自动变量、函数参数以及存储下一个地址或返回地址。返回地址是指函数执行完成后返回的地址。此段的大小根据局部变量、函数参数和函数调用的不同而变化。此段从高地址向低地址增长。

堆段是为动态内存存储分配的内存区域,例如 malloc() 和 calloc() 调用。此段的大小也根据用户分配的不同而变化。此段从低地址向高地址增长。

现在让我们检查一下几个示例程序中段(数据段和 bss 段)的大小是如何变化的。段的大小可以通过执行命令“size”来得知。

初始程序

文件:segment_size1.c

#include<stdio.h>

int main() {
   printf("Hello World\n");
   return 0;
}

在以下程序中,添加了一个未初始化的静态变量。这意味着未初始化段(BSS)的大小将增加 4 字节。注意 - 在 Linux 操作系统中,int 的大小为 4 字节。整数数据类型的 size 取决于编译器和操作系统的支持。

文件:segment_size2.c

#include<stdio.h>

int main() {
   static int mystaticint1;
   printf("Hello World\n");
   return 0;
}

在以下程序中,添加了一个已初始化的静态变量。这意味着已初始化段(DATA)的大小将增加 4 字节。

文件:segment_size3.c

#include<stdio.h>

int main() {
   static int mystaticint1;
   static int mystaticint2 = 100;
   printf("Hello World\n");
   return 0;
}

在以下程序中,添加了一个已初始化的全局变量。这意味着已初始化段(DATA)的大小将增加 4 字节。

文件:segment_size4.c

#include<stdio.h>

int myglobalint1 = 500;
int main() {
   static int mystaticint1;
   static int mystaticint2 = 100;
   printf("Hello World\n");
   return 0;
}

在以下程序中,添加了一个未初始化的全局变量。这意味着未初始化段(BSS)的大小将增加 4 字节。

文件:segment_size5.c

#include<stdio.h>

int myglobalint1 = 500;
int myglobalint2;
int main() {
   static int mystaticint1;
   static int mystaticint2 = 100;
   printf("Hello World\n");
   return 0;
}

执行步骤

编译

babukrishnam $ gcc segment_size1.c -o segment_size1
babukrishnam $ gcc segment_size2.c -o segment_size2
babukrishnam $ gcc segment_size3.c -o segment_size3
babukrishnam $ gcc segment_size4.c -o segment_size4
babukrishnam $ gcc segment_size5.c -o segment_size5

执行/输出

babukrishnam size segment_size1 segment_size2 segment_size3 segment_size4 segment_size5
   text  data  bss  dec  hex  filename
   878   252    8   1138 472  segment_size1 
   878   252   12   1142 476  segment_size2 
   878   256   12   1146 47a  segment_size3 
   878   260   12   1150 47e  segment_size4 
   878   260   16   1154 482  segment_size5
babukrishnam
广告