下载此文档

程序在内存中运行的奥秘.docx


文档分类:IT计算机 | 页数:约6页 举报非法文档有奖
1/6
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/6 下载此文档
文档列表 文档介绍
内存管理是操作系统的核心功能,无论对于开发者还是系统管理员内存管理的重要性都是不
言而喻的。我会在接下来的几篇文章通过计算机的实际运行过程谈谈内存管理,当然在必要
的时候我也会从底层原理去阐释这个问题。我们提到的概念是不局限于平台特性的于计算机内几乎所有进程都完全一致。而这种机制为远程攻击带来了平安隐患。远程攻击往往需要参
考绝对内存地址:诸如栈地址、库函数地址等等。而远程攻击者们知道了这些地址空间是固定的,他们闭着眼睛都能找到他们需要的位置。倘假设真的如此,那么人们毫无疑问就会被
黑客攻击了。正因为如此,随即地址空间已经成为流行的内存地址管理方式。Linux随机为
栈〔stack〕、内存映射段[memorymappingsegment〕以及堆〔heap〕的起始地址添加偏
移量。不幸的是,32位地址空间非常吃紧,限制了随机分配地址的范围和效率〔hamperingits
effectiveness〕。
进程地址空间的首段地址便是栈,它储存了局部变量以及大多数编程语言的函数参数。当调
用方法或者函数时,会有一个新的元素进栈。一旦函数返回了值,那么该元素就会被销毁。
这种简单的设计,很有可能是考虑到数据操作都符合后进先出〔LIFO〕规那么,这意味着
访问栈的内容并不需要复杂的数据构造,一个简单的栈顶指针就能搞定一切。进栈和出栈的
操作方便快捷,不需要过多判断。另外,栈的反复使用可以使栈主流在CPUS存〔cpucaches〕
中,从而加快数据存取。每个进程中的每个线程都有属于自己的栈。
假设映射的栈地址空间被压入了超过栈容量的数据,那么栈便无法继续工作了。这种情况会
导致一个由expand_stack(),函数处理的页面错误,这个函数会调用
acct_stack_growth()函数去检查是否应该为这个栈增加容量。假设这个栈的容量低于
RLIMIT_STACK(通常为8MBp艮定的值,那么栈的容量会正常增加,程序也会继续正常运
行,并且程序不会知道刚刚发生了什么。当然,这是根据实际需要来调整栈大小的一般机制,
假设栈的容量到达了最大值上限,那么栈就会溢出,程序也会收到一个段出错的信息。虽然
在程序需要的时候映射的栈空间会增加,但是栈使用的空间减少时,栈却不会释放多于的空间。这就好似联邦政府预算,只可能越来越多。
程序存取上图所示的未映射区域,是唯一正常实现动态增加栈空间的情况,程序访问其他未
映射内存访问将会出现页面错误最终导致段错误。有些映射区域是只读的,程序试图写入这些区域同样会导致这种错误。
说到堆,我们就不得不提它的内存使用机制。堆支持运行时内存分配,和栈不同,大多数语
言都允许程序使用堆管理内存。满足内存需求是语言运行时和C语言核心间的联结点,而堆
的内存管理接口是通过malloc()及其友元函数来实现的,在C腿样支持垃圾回收机制的语
言中,其接口是新定义的关键字。
当堆的空间可以满足程序的内存恳求时,那么恳求的处理过程就可以直接由语言运行时来负
责,而不必有系统内核参与。但是假设堆的空间不能满足程序的内存申请,那么brk()函数
会执行系统调用(implementation)来增加堆得内存空间以满足程序的恳求。堆管理的实现过
程非常复杂,,面对程序内存分配变化莫测的情况,堆管理需要成熟的

程序在内存中运行的奥秘 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数6
  • 收藏数0 收藏
  • 顶次数0
  • 上传人cjc201601
  • 文件大小66 KB
  • 时间2022-01-27