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. 环境变量的设置和获取

 

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

目录
相关文章
|
16天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
20天前
|
算法 程序员
深入理解操作系统内存管理:分页系统的优势与挑战
【4月更文挑战第7天】 在现代操作系统中,内存管理是一项至关重要的任务,它确保了计算机能够高效、安全地运行各种程序。分页系统作为内存管理的一种技术,通过将物理内存分割成固定大小的单元——页面,为每个运行的程序提供了一种独立且连续的内存地址空间。该技术不仅简化了内存分配,还允许更高效的内存使用和保护。本文探讨了分页系统的核心原理,优势以及面临的挑战,旨在为读者揭示其在操作系统设计中的重要性。
|
25天前
|
缓存 算法 Java
Java内存管理与调优:释放应用潜能的关键
【4月更文挑战第2天】Java内存管理关乎性能与稳定性。理解JVM内存结构,如堆和栈,是优化基础。内存泄漏是常见问题,需谨慎管理对象生命周期,并使用工具如VisualVM检测。有效字符串处理、选择合适数据结构和算法能提升效率。垃圾回收自动回收内存,但策略调整影响性能,如选择不同类型的垃圾回收器。其他优化包括调整堆大小、使用对象池和缓存。掌握这些技巧,开发者能优化应用,提升系统性能。
|
存储 安全 算法
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
68 5
|
1月前
|
存储 算法 编译器
【C++ 内存管理 重载new/delete 运算符 新特性】深入探索C++14 新的/删除的省略(new/delete elision)的原理与应用
【C++ 内存管理 重载new/delete 运算符 新特性】深入探索C++14 新的/删除的省略(new/delete elision)的原理与应用
47 0
|
21天前
|
缓存 安全 Java
Java并发编程进阶:深入理解Java内存模型
【4月更文挑战第6天】Java内存模型(JMM)是多线程编程的关键,定义了线程间共享变量读写的规则,确保数据一致性和可见性。主要包括原子性、可见性和有序性三大特性。Happens-Before原则规定操作顺序,内存屏障和锁则保障这些原则的实施。理解JMM和相关机制对于编写线程安全、高性能的Java并发程序至关重要。
|
3天前
|
Java API 调度
[Java并发基础]多进程编程
[Java并发基础]多进程编程
|
4天前
|
定位技术 Python
Pyglet综合应用|推箱子游戏之关卡图片载入内存
Pyglet综合应用|推箱子游戏之关卡图片载入内存
13 0
|
9天前
|
移动开发 Android开发 开发者
构建高效Android应用:采用Kotlin进行内存优化的策略
【4月更文挑战第18天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,由于设备和版本的多样性,确保应用流畅运行且占用资源少是一大挑战。本文将探讨使用Kotlin语言开发Android应用时,如何通过内存优化来提升应用性能。我们将从减少不必要的对象创建、合理使用数据结构、避免内存泄漏等方面入手,提供实用的代码示例和最佳实践,帮助开发者构建更加高效的Android应用。
15 0
|
11天前
|
缓存 移动开发 Java
构建高效的Android应用:内存优化策略
【4月更文挑战第16天】 在移动开发领域,尤其是针对资源有限的Android设备,内存优化是提升应用性能和用户体验的关键因素。本文将深入探讨Android应用的内存管理机制,分析常见的内存泄漏问题,并提出一系列实用的内存优化技巧。通过这些策略的实施,开发者可以显著减少应用的内存占用,避免不必要的后台服务,以及提高垃圾回收效率,从而延长设备的电池寿命并确保应用的流畅运行。