linux下的内存分布

周日讲了32位linux下的内存分布

还有关于C语言中的extern和static的用法

内存的最高1G是用作系统保留,接下来是占空间,在靠近3G的那一块

再下来是堆空间,之后是bss区,未初始化的静态变量区

然后是Rw data区

Ro data区,主要用作存储字符串类型

接下来是代码段,又名txt正文段


0xffffffff

内核


0xbfff ffff



bss区

rw data
ro data

代码段

0x00000000

接下来就是验证

 1 #include <stdio.h>
 2
 3 static int sg_init = 10;
 4 static int sg_uninit ;
 5
 6
 7 int main()
 8 {
 9
10     int l_init = 10;
11     static int init_stack = 10;
12     static int uninit_stack;
13     static int uninit_xxx = 0;
14
15     printf("sg_init            %p\n",&sg_init);
16     printf("sg_uninit          %p\n",&sg_uninit);
17     printf("l_init             %p\n",&l_init);
18     printf("init_stack         %p\n",&init_stack);
19     printf("uninit_stack       %p\n",&uninit_stack);
20     printf("string,ro data     %p\n","hello");
21     printf("function           %p\n",main);
22
23 }

运行结果如下

sg_init                 0x804a014
sg_uninit             0x804a024
l_init                   0xbfa0718c
init_stack            0x804a018
uninit_stack        0x804a028
string,ro data      0x80485da
function              0x80483e4

可见局部变量是存放在栈空间的,因为比较靠近堆空间0xbf

未初始化的静态全局变量和静态局部变量是紧挨着的,而且比初始化的位置要高一些,所以验证了上述模型

rodata段爷比rwdata段要低一些,说明静态区的模型也是正确的

同理代码段的地址也是符合上述模型。

有个不太严谨的证明是局部变量栈空间,如何排除它不是在堆空间?栈空间有多大?

我这里还没搞明白。

时间: 2024-08-05 16:18:10

linux下的内存分布的相关文章

Linux 下释放内存,swap交换区缓存

关于内存耗尽的总结: 1)在进程收到OOM之前,内核将刷新文件系统的cache来释放空间. 2)将交换区的页面移到磁盘上. 3)当内存变少时,虚拟性使每个进程通过交换区来做简单的上下文环境切换. 4)当进程消耗尽交换内存后,才会引发out-of-memory(OOM)来kill那些进程. 所以,我们还是有必要来手动进行Linux下释放内存的操作,其实也就是释放缓存的操作了. 要达到释放缓存的目的,我们首先需要了解下关键的配置文件/proc/sys/vm/drop_caches.这个文件中记录了缓

【调试】Linux下超强内存检测工具Valgrind

[调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Linux下,开放源代码(GPLV2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成. 内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务.

Linux下清理内存和Cache方法

Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches 频繁的文件访问会导致系统的Cache使用量大增 $ free -m total used free shared buffers cached Mem: 3955 3926 28 0 55 3459 -/+ buffers/cache: 411 3544 Swap: 5726 0 5726 free内存减少到几十兆,系统运行缓慢 运行sync将dirty的内容写回硬盘 $sync 通过修改proc系统的dro

Linux下C++内存泄露检测工具

下载安装:http://blog.csdn.net/wanglin754/article/details/7194145 下载地址:http://www.valgrind.org/downloads/current.html#current 安装valgrind tar jxvf valgrind-3.7.0.tar.bz2             注意这里的参数里加了j,表示有bz2属性 cd valgrind-3.7.0 ./configure make make install make

linux下查看内存使用情况

http://www.cnblogs.com/skyme/archive/2011/01/04/1925227.html linux下查看内存使用情况

linux下常见内存异常查证工具和方法介绍

linux下常见内存异常查证工具和方法介绍 内存异常导致的异常往往很难查证,本文介绍在linux下的各种常见内存异常的查证工具和方法. 1.访问空指针/未初始化指针 这个是最简单的内存异常了,只要能够生成coredump文件,可以快速定位问题代码. 开启coredump 部分环境下默认不会生成coredump,需要运行如下命令:ulimit -c unlimited //unlimited表示不限制coredump文件大小,也可以指定一个最大文件大小. 定制core文件名 默认的coredump

linux下查看内存的命令

top能显示系统内存.我们常用的Linux下查看内容的专用工具是free命令. 下面是对内存查看free命令输出内容的解释: total:总计物理内存的大小. used:已使用多大. free:可用有多少. Shared:多个进程共享的内存总额. Buffers/cached:磁盘缓存的大小. free -m ,加上 -m 参数,以M为单位显示 查看内存:less /proc/meminfo cat /proc/meminfo 查看cpu:less /proc/cpuinfo

如何在linux下检测内存泄漏(转)

本文转自:http://www.ibm.com/developerworks/cn/linux/l-mleak/ 本文针对 linux 下的 C++ 程序的内存泄漏的检测方法及其实现进行探讨.其中包括 C++ 中的 new 和 delete 的基本原理,内存检测子系统的实现原理和具体方法,以及内存泄漏检测的高级话题.作为内存检测子系统实现的一部分,提供了一个具有更好的使用特性的互斥体(Mutex)类. 1.开发背景 在 windows 下使用 VC 编程时,我们通常需要 DEBUG 模式下运行程

Linux下查看内存使用情况方法总结

Linux查看CPU和内存使用情况:http://www.cnblogs.com/xd502djj/archive/2011/03/01/1968041.html 在做Linux系统优化的时候,物理内存是其中最重要的一方面.自然的,Linux也提供了非常多的方法来监控宝贵的内存资源的使用情况.下面的清单详细的列出了Linux系统下通过视图工具或命令行来查看内存使用情况的各种方法. 1. /proc/meminfo 查看RAM使用情况最简单的方法是通过/proc/meminfo.这个动态更新的虚拟