程序链接与装载

来源:互联网 发布:小斯在以色列的数据 编辑:程序博客网 时间:2024/05/17 01:24

   程序的运行需要运行环境支撑,其运行环境一般由内存、运行库和系统调用构成。其中系统调用部分程度上充当的是程序与内核进行交互的中介。其中首先需明白,程序与内存关系。内存是承载程序运行的介质,也是程序进行各种运算和表达的场所。

   window在默认情况下会将高地址的(2g)空间分配给内核(4g内存情况下),而Linux默认情况下将高地址的1g空间分配给内核。用户则只能使用剩下的2g或者3g内存空间。在用户空间中,存在以下“默认”的“区域

 *栈--用于维护函数调用的上下文,其通常在用户空间的最高地址处分配,通常具有数兆字节大小

*堆--堆是用来容纳应用程序动态分配的内存区域,,当程序使用malloc或new分配内存时,其得到内存则由堆分配。堆一般位于栈的下方(低地址方向),在某些时候,堆也可能没有固定统一的存储区域。堆一般比栈大很多,可以有几十到数百兆的容量。

*可执行文件映像--存储着可执行文件在内存的映像。由装载器在装载时将可执行文件的内存读取或者映射到此处

*保留区--并不是一个单一的内存区域,而是在内存中受到保护而禁止访问的区域的总称。比如,在大多数的操作系统中,极小的地址是不允许访问的如NULL,一般的C语言无效指针赋值为0也是出于这个原因,因为在正常情况下0地址上不可能保存有效的可访问数据。

给出一个Linux典型的内存布局


图中的“动态链接库映射区”用于映射装载的动态链接库。在Linux系统下,如果可执行文件依赖其他共享库,那么系统就会认为它在从0x40000000开始的地址分配相应的空间,并将共享库载入到该空间。

图中的箭头表明了其中大小可变区的尺寸增长方向,由图可知,栈向低地址增长,堆向高地址增长。当堆或栈现有的大小不够用时,会按照图中增长方向扩大自己大小,直到预留空间被用完


本博文参考:程序员的自我修养--链接-装载与库。欢迎大家批评交流


0 0