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. 环境变量的设置和获取
.....打个桩,后面再更