- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
采用二级分页时,线性地址由三个部分组成,分别为页目录号、页表号和页内位移。线性地址的划分如图5-17所示。在32位地址中,高10位和中间10位分别是页目录号和页表号,寻址范围为1K;低12位为页内位移,寻址范围为4K。 二级分页的方式是把所有页表项按1K为单位划分为若干个子表(最多1K个),用页目录表来记录每一个子表的位置。页目录表也是1K项长。页目录和页表的大小都是4K(每项4字节,1K项),恰好是一页大小。页目录的每一项记录一个页表的内存块号,通过页目录就可以找到各个页表。 图5-17 二级分页的线性地址划分 图5-18描述了二级地址变换的过程。进程的mm struct结构中记录了它的页目录地址,在进入CPU运行时,页目录地址被置入CPU的寄存器中,通过它即可找到进程的页目录。在地址变换时,首先用页目录号为索引查页目录,得到对应的页表的地址,再用页号为索引查页表,得到对应的内存块号,与页内位移合并即得到实际内存地址。 由于页目录表和页表存放在内存中,因此,要访问内存中的某一单元需要三次访问内存。为了加快访问速度,Linux将常用的页目录和页表的表项放在快表中。地址变换时首先访问快表,如果表项不在快表中,再去内存查找页目录表和页表。 图5?18 二级分页地址变换示意图 5.4.4 空闲内存的管理 Linux系统用位示图和链表相结合的方法记录空闲内存的分布情况。系统定义了一个称为free_area的数组。对于i386平台的Linux系统来说,free_area数组的大小为10项,每项包含空闲链表的2个指针(next和prev)和位示图的1个指针(map)。它连接了10个空闲链表和位示图。通过它内核可以掌握系统中所有尺寸的连续的空闲空间的分布情况,作为分配内存的依据。图5-19所示是free_area数组的结构示意图。 图5?19 空闲内存空洞的描述 若干个连续的页帧称为页块组(page block)。free_area数组用链表和位示图的方式记录了各种尺寸的空闲页块组的分布。 空闲链表是一个双向链表,数组第k项对应的链表记录系统中所有2k大小的空闲页块组的起始页帧号。例如,第0项描述所有单个空闲页帧,第1项描述所有2个页帧大的空闲页块组,第2项描述4个页帧大的空闲页块组。 如果将内存按相同大小的页块组划分并编号,则以偶数号开始的相邻的两个页块组称为伙伴(buddy)。如页块组大小为2帧,则0号页块组(0~1帧)与1号页块组(2~3帧)是伙伴,2号页块组(4~5帧)与3号页块组(6~7帧)是伙伴,但1号页块组与2号页块组不是伙伴。 位示图由若干个字节的二进制位构成,每位对应一对伙伴。数组第k项对应的位示图记录2k大小的一对伙伴的分配使用情况,为1表示对应的伙伴中有一个是空闲的页块,为0表示对应的两个伙伴页块都空闲或都不空闲。 在图5-19中,如果内存中页帧的使用情况如图右侧部分所示,则free_area[0]的空闲链表链接所有1帧长的空闲页块组,它们是第5、7、13等帧。它的位示图描述1帧长的伙伴的使用情况。前16帧的8对伙伴用8位描述,其中,5、7、13帧对应的伙伴位为1,其余为0。同理,free_area[1]的空闲链表链接所有2帧长的空闲页块组,分别是第10~11和14~15帧。它的位示图描述2帧长的伙伴的使用情况。前16帧的4对伙伴用4位描述,其中,10~11和14~15帧对应的伙伴位为1,其余为0。free_area[2]的空闲链表链接所有4帧长的空闲页块组,这里是0~3帧。它的位示图描述4帧长的伙伴的使用情况。前16帧的2对伙伴用2位描述,其中,0~3帧对应的伙伴位为1,其余为0。 5.4.5 内存的分配与回收 1. 伙伴分配算法 Linux采用伙伴(buddy)算法来分配和回收内存,内存的分配和回收的空间大小都是2k大小的页块组。对于i386系统,内存一次分配的最小尺寸是4?KB(20×4?KB),最大为2?MB(29×4?KB)。 当要分配内存时,先根据需要确定要分配的页块组大小。如需要n页,2k-1<n≤2k,则分配一个2k大小的页块组。分配时,在free_area[k]的链表中找一个空闲页块组,将其从链表中删除,返回首地址。若没有2k大小的页块组,就在free_area[k+1]的链表中取下一个,一分为二,分配一个,将另一个链入free_area[k]的链表中。如果没有2k+1大小的页块组就进一步地分裂更大的页块组。回收内存时,将释放的页块组链入适当的链表中。如果该页块组的伙伴为空闲(位示图的对应位为1),则将其与伙伴合并,加入到下一个数组项的链表中。如果还能合并就进一步合并下去。每次分配或回收操作后都要修改free_area数组的相应的链表
您可能关注的文档
最近下载
- 山东省烟台市蓬莱实验初级中学2024-2025学年度第一学期9年级道德与法治素养形成期中测试(图片版,含答案).docx VIP
- 全国2025年10月自考00185《商品流通概论》真题及答案.docx VIP
- 2023年4月 自考 06056 心理学史 试题.pdf VIP
- 涉案财物管理系统V2.0T-用户使用说明书.pdf VIP
- 2025年网络安全等级测评师(中级)考核试题与答案.pdf VIP
- 电梯学徒安全培训记录课件.pptx VIP
- 公务员制度专题二.ppt VIP
- tc官网软件资源中文产品手册voicetone.pdf VIP
- 路灯售后服务方案及措施.docx VIP
- 河北省部分高中2024-2025学年高一上学期11月阶段性测试语文试卷(含答案).docx VIP
原创力文档


文档评论(0)