程序链接与装载
来源:互联网 发布:小斯在以色列的数据 编辑:程序博客网 时间:2024/05/17 01:24
程序的运行需要运行环境支撑,其运行环境一般由内存、运行库和系统调用构成。其中系统调用部分程度上充当的是程序与内核进行交互的中介。其中首先需明白,程序与内存关系。内存是承载程序运行的介质,也是程序进行各种运算和表达的场所。
window在默认情况下会将高地址的(2g)空间分配给内核(4g内存情况下),而Linux默认情况下将高地址的1g空间分配给内核。用户则只能使用剩下的2g或者3g内存空间。在用户空间中,存在以下“默认”的“区域
*栈--用于维护函数调用的上下文,其通常在用户空间的最高地址处分配,通常具有数兆字节大小
*堆--堆是用来容纳应用程序动态分配的内存区域,,当程序使用malloc或new分配内存时,其得到内存则由堆分配。堆一般位于栈的下方(低地址方向),在某些时候,堆也可能没有固定统一的存储区域。堆一般比栈大很多,可以有几十到数百兆的容量。
*可执行文件映像--存储着可执行文件在内存的映像。由装载器在装载时将可执行文件的内存读取或者映射到此处
*保留区--并不是一个单一的内存区域,而是在内存中受到保护而禁止访问的区域的总称。比如,在大多数的操作系统中,极小的地址是不允许访问的如NULL,一般的C语言无效指针赋值为0也是出于这个原因,因为在正常情况下0地址上不可能保存有效的可访问数据。
给出一个Linux典型的内存布局
图中的“动态链接库映射区”用于映射装载的动态链接库。在Linux系统下,如果可执行文件依赖其他共享库,那么系统就会认为它在从0x40000000开始的地址分配相应的空间,并将共享库载入到该空间。
图中的箭头表明了其中大小可变区的尺寸增长方向,由图可知,栈向低地址增长,堆向高地址增长。当堆或栈现有的大小不够用时,会按照图中增长方向扩大自己大小,直到预留空间被用完
本博文参考:程序员的自我修养--链接-装载与库。欢迎大家批评交流
- 程序链接与装载
- 程序的装载与链接
- 程序的编译、链接与装载
- 程序的编译、链接与装载
- 程序的编译、链接与装载
- 程序的编译、链接与装载
- 链接、装载与库
- 装载、链接与库
- 装载、链接与库
- 装载、链接与库
- 装载、链接与库
- 链接、装载与库
- 程序的自我修养-链接、装载与库
- 链接、装载与库:可执行文件的装载
- 程序的装载和链接
- 程序的 编译 && 链接 && 装载
- 装载、链接与库总结
- 【链接,装载与库】理解链接
- CentOS 7 下安装音频编辑器Audacity
- LeetCode--Insert Interval
- 什么是GC?GC的工作原理如何?
- BJFU 1005——Factorial of large numbers
- 为什么 Android 截屏需要 root 权限
- 程序链接与装载
- 机器视觉学习笔记(一)
- CentOS 7 最小化安装后 没有安装ifconfig命令的解决方法
- 安装配置cuda6.5以及vs2012的环境
- boost.any实现任意类型存储
- Android开发之详解五大布局
- 传真服务器系统的架设方案
- 模拟频率、数字频率、模拟角频率
- Xcode6之后如何创建空工程