进程映像
程序与进程:
-
程序是存储在磁盘上的可执行文件,当程序被运行时,系统会把程序从磁盘加载到内存中运行,正在运行中的程序称为进程,一个程序可以同时被加载多次,形成多个进程,每个进程相互独立,由操作系统管理
什么是进程映像:
-
进程在内存空间中的分布使用情况就称为进程映像,从低地址到高地址分别是:
各个内存段的存储什么数据:
-
代码段(text)
-
存储二进制指令、字面值常量、被const修饰过的原data段的数据
-
权限r-- 或者 r-x 权限只读
-
-
数据段(data)
-
存储初始化过的全局变量和静态变量
-
-
静态数据段(BSS)
-
存储未初始化过的全局变量和静态变量
-
进程一旦加载,此内存段会被操作系统自动清零,默认值是0
-
如果初始化的值给0,依然还在BSS
-
-
堆区(heap)
-
要程序员动态分配、动态释放,从低地址向高地址扩招
-
使用malloc系列函数进行内存管理
-
而malloc系列函数底层调用操作系统的API(brk\sbrk\mmap\munmap)
-
-
栈区(stack)
-
存储非静态局部变量、块变量,包括函数的参数(除了main函数的参数)、返回值
-
内存扩展从高地址向低地址扩展
-
栈区与堆区中间有一段预留空间,一个作用为了预留,第二个是让共享库的内存以及共享内存使用此段内存
-
-
命令行参数与环境变量表
-
里面存储环境变量表以及命令行传给main的参数内容
-
// 打印出每个内存段中各种数据的地址
// 通过ps -aux 查看出进程id
// /proc/进程号/maps 该文件能查看该进程的内存分布情况
// 通过打印的内存地址,分析maps文件的内存段分布情况
#include <stdio.h>
#include <stdlib.h>
const int const_global = 10; // 常全局变量
int init_global = 10; // 初始化全局变量
int uninit_global; // 未初始化全局变量
int main(int argc,const char* argv[])
{
const static int const_static = 10; // 常静态局部变量
static int init_static = 10;// 初始化静态局部变量
static int uninit_static; // 未初始化静态局部变量
const int const_local; // 常局部变量
int prev_local; // 前局部变量
int next_local; // 后局部变量
int arr[10];
int* prev_heap = malloc(sizeof(int)); // 前堆变量
int* next_heap = malloc(sizeof(int)); // 后堆变量
const char* literal = "literal"; // 字面值常量
extern char** environ; // 环境变量
printf("-----命令行参数与环境变量-----<高>\n");
printf("环境变量:%p\n",environ);
printf("命令行参数:%p\n",argv);
printf("-------------栈-------------------\n");
printf("常局部变量:%p\n",&const_local);
printf("前局部变量:%p\n",&prev_local);
printf("后局部变量:%p\n",&next_local);
printf("arr[0]:%p arr[1]:%p arr[2]:%p\n",&arr[0],&arr[1],&arr[2]);
printf("-------------堆-------------------\n");
printf("后堆变量:%p\n",next_heap);
printf("前堆变量:%p\n",prev_heap);
printf("-----------BSS--------------------\n");
printf("未初始化全局变量:%p\n",&uninit_global);
printf("未初始化静态变量:%p\n",&uninit_static);
printf("----------data--------------------\n");
printf("初始化全局变量:%p\n",&init_global);
printf("初始化静态变量:%p\n",&init_static);
printf("---------代码段-------------------\n");
printf("常静态局部变量:%p\n",&const_static);
printf("常全局变量:%p\n",&const_global);
printf("字面值常量:%p\n",literal);
printf("二进制指令:%p\n",main);
printf("------------------------------<低>\n");
getchar();
}
402

被折叠的 条评论
为什么被折叠?



