- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
分页式虚拟内存管理及Linux实现
分页式虚拟内存管理及Linux实现摘 要:本文分析了操作系统的页式虚拟存储管理机制,并结合当前支持多平台的Linux操作系统,根据其中虚拟存储的特点,详细分析了在Linux系统下的页式内存虚拟实现,重点指出了Linux所独特的具体实现过程,其中包括请页机制,物理内存分配与回收和交换机制等。
关键词:内存;分页;虚拟;Linux
现代大多数计算机操作系统由于内存空间的限制,都采用了虚拟内存空间管理的方法。虚拟存储管理器通过在辅存中建立一个虚拟地址空间,提供了一个物理存储器的抽象,并且在任意时刻“自动地”确定哪部分地址空间被加载在内存中,系统处理在内存和辅存之间地址空间块的来回传送,而无须人工干预。现在大部分的虚拟内存系统都采用了分页式虚拟内存管理。提高其管理性能可增强计算机的运行速率和工作效率。本文即介绍分页式虚拟内存管理的过程并结合Linux操作系统介绍其实现。
一、实现过程
1、地址转换。在分页式虚拟内存管理系统中,虚拟地址空间划分成许多页,页是一段连续的虚拟地址空间。相应的,物理内存空间也划分成多个页帧。页和页帧的大小是相同的,一个页可以映射到一个页帧。页表项(Page Table Entry,PTE)包含有与主存中的页相对应的帧号,对应的页是否在主存中的存在位(P),页的内容从上次装入至今是否改变的修改位(M)。图示如下:
为了将逻辑地址转换成物理地址,系统中必须设置地址变换机构。但是现在计算机使用的虚拟地址一般是32位的,而且每次访问内存都要进行地址转换,这将严重影响系统效率。现实中使用TLB(Translation Lookaside Buffer)以及三级页表等解决上述问题。
2、请求页面调度。 虚拟内存管理中,进程驻留在次级存储器。当访问到某页中的一个单元时才将该页取入内存。当一个进程第一次启动时,会出现大量的页错误,当越来越多的页被取入内存时,根据局部性原理,在一段时间后错误会逐渐平息下来,页错误的数目会降的很低。
3、页面置换算法。在进程运行过程中,若其所要访问的页面不在内存而需把它们调入内存,但内存无空闲空间时,系统必须从内存中调出一页程序或数据,送磁盘的对换区中。页面置换算法(Replacement Algorithms)确定将哪个页面调出。
二、Linux中的分页虚拟内存管理具体实现
Linux是多用户、多任务的操作系统,存储资源由多个进程有效共享。Linux内存管理的设计充分利用了计算机系统所提供的虚拟存储技术,真正实现了虚拟存储器管理。其虚拟地址空间大小为4GB,内核将这4G的空间分为两部分,高1G为内核空间,低3G为内核空间,即Linux可以拥有4GB的虚拟空间。
1、Linux虚拟寻址
Linux使用三级页表结构,且与平台无关,由页目录,页中间目录和页表构成。Linux中的虚拟地址可由4个域组成,其地址转换与前述类似。
2、Linux请页机制。在Linux中,当一个进程执行时,如果CPU访问到一个有效的虚地址,但是这个地址对应的页不在内存,则CPU产生一个缺页异常,并将这个虚地址存入CR2存储器,然后调用缺页异常处理程序do_page_fault()。
有两种方法装入所缺的页,取决于此页是否与磁盘文件建立了映射关系。可以调用do_no_page()函数检查虚存区描述符的nopage域来确定这一点。若nopage域不为空,说明映射了一个磁盘文件,nopage域指向执行从磁盘读入操作的函数;若nopage域为空,虚存区没有映射磁盘文件。因此,do_no_page()调用do_anonymous_page()函数,获得一个新的页面。
3、物理内存分配与回收。在Linux中,虚存区间的分配在前,物理页面的分配在后。随着用户程序的执行和结束,系统不断地分配和释放物理页面,这导致在已分配的内存块中分散着许多小的空闲页面,即外碎片。外碎片无法满足大块连续页面的分配要求。为此,Linux采用伙伴(buddy)算法来解决外碎片问题。它把所有的空闲页面分为10个块组,每组中块的大小是2n个页面,且把同样大小的块形成一个链表。然后把大小相等且物理地址连续的两个块合并为一个块。
4、交换机制。物理页面的换入换出主要过程如下,其中涉及Linux中的page结构和free_area结构。
释放页面。如果一个页面变为空闲可用,就把该页面的page结构链入某个空闲队列free_area,同时页面的使用计数count减1。
分配页面。调用在__get_free_page()从某个空闲队列分配内存页面,将页面的使用计数count置为1。
活跃状态。已分配的页面处于活跃状态,该页面的数据结构page通过其队列头结构lru链入活
文档评论(0)