05 存储管理幻灯片.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* * * * 通常,每个进程都有自己的用户空间,但是调用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的 代码段和数据段。始的虚存区是匿名的,也就是说,它与任何文件都无关,可以推断出它映射了连接程序的bbs段(未初始化的数据段)。紧接着的三个区映射了C库程序/lib/libc-2.3.2.so的代码段、数据段和bss段。最后一个虚拟区是进程的堆栈。 * * * * 当一个进程执行时,如果CPU访问到一个有效的虚地址,但是这个地址对应的页没有在内存,则CPU产生一个缺页异常,同时将这个虚地址存入CR2寄存器(参见第二章),然后调用缺页异常处理程序do_page_fault()。Linux的缺页异常处理程序必须对产生缺页的原因进行区分:是由编程错误所引起的异常,还是由访问进程用户空间的页但还尚未分配物理页面所引起的异常。 * * * * do_page_fault( )函数的首先是读取引起缺页的虚地址。如果没找到,则说明访问了非法虚地址,Linux会发信号终止进程(如果必要)。否则,检查缺页类型,如果是非法类型(越界错误,段权限错误等)同样会发信号终止进程。 缺页异常肯定要发生在内核态,如果发生在用户态,则必定是错误的,于是把相关信息保存在进程的PCB中。 对有效的虚地址,如果是缺页异常,Linux 必须区分页所在的位置,即判断页是在交换文件中,还是在可执行映像中。为此,Linux 通过页表项中的信息区分页所在的位置。如果该页的页表项非空,但对应的页不在内存,则说明该页处于交换文件中,操作系统要从交换文件装入页。 如果错误由写访问引起,该函数检查这个虚存区是否可写。如果不可写,则对这种错误进行相应的处理;如果可写,则采用“写时复制”技术。 如果错误由读或执行访问引起,该函数检查这一页是否已经存在于物理内存中。如果在,错误的发生就是由

文档评论(0)

love1987421 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档