Linux系统应用编程 --- Linux下C进程内存布局

简介: Linux系统应用编程 --- Linux下C进程内存布局

1. C进程下,内存是怎么布局的?

C进程内存布局如下图

按照从低地址到高地址的顺序介绍:

text: 代码段。存放程序的全部代码(指令),来源于二进制可执行文件中的代码部分,在编译时候就已经放置到二进制文件中。

initialized data(简称data 段)和uninitialized data(简称bss断)组成了数据段

data段存放的是已经初始化的全局变量和已经初始化的static局部变量,来源于二进制可执行文件中的数据部分,这部分在编译的时候就已经放到二进制文件中。

bss段存放的是未初始化的全局变量和未初始化的static局部变量,内容不来源于二进制可执行文件中的数据部分(也就是说:二进制可执行文件中的数据部分不包含没有初始化的局部变量和没有初始化的static局部变量)

bss的初始值必须为0,因此bss段存放的全部是0。将bss段清零的工作是由系统加载二进制文件后,开始执行程序前完成的,洗头工执行这个清零操作是由内核的一段代码完成。

malloc是从heap(堆)中分配空间的

stack(栈)存放的是动态局部变量

内存的最高段存放的是命令行参数和环境变量,将命令行参数和环境变量存放到指定位置这个操作是由OS的一段代码在加载二进制文件到内存后,开始运行程序前完成的。

2. 用code验证C进程的内存布局

1. #include <stdio.h>
2. #include <stdlib.h>
3. 
4. int global_init_val = 100;
5. int global_noinit_val;
6. extern char * * environ;
7. 
8. int main(int argc, char * argv[], char * envp[])
9. {
10.   static int local_static_val = 10;
11.   char * local_val;
12.   local_val = malloc(10);
13. 
14.   printf("address of text is : %p\n", main);
15.   printf("address of data is : %p, %p \n", & global_init_val, & local_static_val);
16.   printf("address of bss is  : %p\n", & global_noinit_val);
17.   printf("address of heap is %p \n", local_val);
18.   printf("address of stack is %p \n", &local_val);
19.   free(local_val);
20. 
21.   printf("&environ = %p, environ = %p \n", &envp, envp);
22.   printf("&argv = %p, argv = %p\n", &argv, argv);
23. 
24.   return 0;
25. 
26. }

运行结果如下:

3. 环境变量的设置和获取

 

.....打个桩,后面再更

相关文章
|
1月前
|
存储 缓存 监控
|
1月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第7天】麒麟系统mate-indicators进程占用内存过高问题解决
175 2
|
30天前
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
|
1月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第5天】麒麟系统mate-indicators进程占用内存过高问题解决
132 0
|
6月前
|
Linux Shell 调度
【Linux】7. 进程概念
【Linux】7. 进程概念
67 3
|
6月前
|
存储 缓存 Linux
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
|
3月前
|
Linux Shell 调度
【在Linux世界中追寻伟大的One Piece】Linux进程概念
【在Linux世界中追寻伟大的One Piece】Linux进程概念
40 1
|
5月前
|
存储 Linux Shell
Linux进程概念(上)
冯·诺依曼体系结构概述,包括存储程序概念,程序控制及五大组件(运算器、控制器、存储器、输入设备、输出设备)。程序和数据混合存储,通过内存执行指令。现代计算机以此为基础,但面临速度瓶颈问题,如缓存层次结构解决内存访问速度问题。操作系统作为核心管理软件,负责资源分配,包括进程、内存、文件和驱动管理。进程是程序执行实例,拥有进程控制块(PCB),如Linux中的task_struct。创建和管理进程涉及系统调用,如fork()用于创建新进程。
65 3
Linux进程概念(上)
|
5月前
|
存储 Shell Linux
Linux进程概念(下)
本文详细的介绍了环境变量和进程空间的概念及其相关的知识。
37 0
Linux进程概念(下)
|
5月前
|
Linux Shell 调度
Linux进程概念(中)
本文详细解析了Linux进程的不同状态,包括运行、阻塞、挂起,以及僵尸和孤儿进程的概念。讨论了进程优先级的重要性,以及操作系统如何通过活动队列、过期队列和优先级管理进程调度。
49 0