内存管理讲义.ppt

  1. 1、本文档共54页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 为什么把进程的用户空间要划分为一个个区间?这是因为每个虚存区可能来源不同,有的可能来自可执行映像,有的可能来自共享库,而有的则可能是动态分配的内存区,对不同的区间可能具有不同的访问权限,也可能有不同的操作。因此Linux 把进程的用户空间分割管理,并利用了虚存区处理函数(vm_ops)来抽象对不同来源虚存区的处理方法。Linux在这里利用了面向对象的思想,即把一个虚存区看成一个对象,用vm_area_structs描述了这个对象的属性,其中的vm_operation结构描述了在这个对象上的操作,其定义如下: struct vm_operations_struct { void (*open)(struct vm_area_struct * area); void (*close)(struct vm_area_struct * area); struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int unused); }; vm_operations结构中包含的是函数指针;其中,open、close分别用于虚存区的打开、关闭,而nopage是当虚存页面不在物理内存而引起的“缺页异常”时所应该调用的函数。 * * 系统以用户虚拟内存地址的降序排列 vm_area_struct。在进程的运行过程中,Linux 要经常为进程分配虚存区,因此,vm_area_struct 结构的访问时间就成了性能的关键因素。为此,除链表结构外,Linux 还利用AVL平衡树树来组织 vm_area_struct。通过这种树结构,Linux 可以快速定位某个虚存区。 * 通常,每个进程都有自己的用户空间,但是调用clone( )函数创建的内核线程时共享父进程的用户空间。 按照第三章讲述的写时复制方法,子进程继承父进程的用户空间:只要页是只读的,就依然共享它们。当其中的一个进程试图写入某一个页时,这个页就被复制一份;一段时间之后,所创建的进程通常获得与父进程不一样的完全属于自己的用户空间。而对于内核线程来说,它使用父进程的用户空间。因此创建内核线程比创建普通进程相应要快得多,而且只要父进程和子进程谨慎地调整它们的访问顺序,就可以认为页的共享是有益的。 由此可以看出,进程用户空间的创建主要依赖于父进程,而且,在创建的过程中所做的工作仅仅是mm_struc结构的建立,vm_area_struct结构的建立以及页目录和页表的建立,并没有真正地复制一个物理页面,这也是为什么Linux内核能迅速地创建进程的原因之一。 * Linux并不将映像装入到物理内存,相反,可执行文件只是被连接到进程的用户空间中。随着进程的运行,被引用的程序部分会由操作系统装入到物理内存,这种将映像链接到进程用户空间的方法被称为“虚存映射”,也就是把文件从磁盘映射到进程的用户空间,这样把对文件的访问转化为对虚存区的访问。有两种类型的虚存映射: (1)??????? 共享的:有几个进程共享这一映射,也就是说,如果一个进程对共享的虚存区进行写,其它进程都能感觉到,而且会修改磁盘上对应的文件。 (2)??????? 私有的:进程创建的这种映射只是为了读文件,而不是写文件,因此,对虚存区的写操作不会修改磁盘上的文件,由此可以看出,私有映射的效率要比共享映射的高。 除了这两种映射外,如果映射与文件无关,就叫匿名映射。 当可执行映像映射到进程的用户空间时,将产生一组 vm_area_struct 结构来描述各个虚拟区间的起始点和终止点,每个 vm_area_struct 结构代表可执行映像的一部分,可能是可执行代码,可能是初始化的变量或未初始化的数据,也可能是刚打开的一个文件,这些映射都是在函数do_mmap()中来实现的。随着 vm_area_struct 结构的生成,这些结构所描述的虚拟内存区间上的标准操作函数也由 Linux 初始化。但要明确,在这一步还没有建立从虚拟内存到物理内存的映射。 * 从0x8048000开始的虚存区是/home/test/exam文件的某一部分的虚存映射,范围从0到0x1000字节。许可权指定这个区域是可执行的(包含目标代码)、只读的(不可写,因为指令执行期间不能改变),并且是私有的,因此我们可以猜出这个区域映射了程序的代码段。 从0x8049000开始的虚存区是/home/test/exam文件的另一部分虚存映射,因为许可权指定这个私有区域可以被写,我们可以推断出它映射了程序的数据段。 类似地,从00始的虚存区分别对应动态链接库/lib/ld-2.3.2.so的

文档评论(0)

benzei244572 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档