- 1、本文档共28页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章 内存管理(lab2)
槛附名笋个巢改沟赢倚买姬禾哆叭健琉舔卵耻脂愧萍揍钵销牟墒拳堡息殃第四章 内存管理(lab2)第四章 内存管理(lab2)
提纲
页面管理
页表管理
屁湍誓温捕帕录您檬萨善霉负壕楼漾慧峦瀑侧既蛹式准嫂帕丽当峭杜此印第四章 内存管理(lab2)第四章 内存管理(lab2)
页面管理
页面管理链表的结构
现在我们来讨论用于页面管理的双向链表结构。首先,我们来看一下构成这个链表的结点的情况。该结点的结构是在memlayout.h中规定的:
typedef LIST_ENTRY(Page) Page_LIST_entry_t;
struct Page {
Page_LIST_entry_t pp_link; /* free list link */
// pp_ref is the count of pointers (usually in page table entries)
// to this page, for pages allocated using page_alloc.
// Pages allocated at boot time using pmap.cs
// boot_alloc do not have valid reference count fields.
uint16_t pp_ref;
};
而LIST_ENTRY的定义则在queue.h中:
#define LIST_ENTRY(type)
struct {
struct type *le_next; /* next element */ \
struct type **le_prev; /* ptr to ptr to this element */ \
}
捐粟谎石锚孙农匙任腐破储俊惨絮疗阜骋抚趁蛆兽堰绝砷诌臣饵枢讣炉截第四章 内存管理(lab2)第四章 内存管理(lab2)
页面管理(续)
通过分析,我们可以写出Page结构:
struct Page {
struct {
struct Page *le_next;
struct Page **le_prev;
} pp_link;
uint16_t pp_ref;
};
驶燃滓居筐欺趟峰森婴砧击超矣异运签籽抱乍狼桓陀捍梦煽壕肾走蛤祟素第四章 内存管理(lab2)第四章 内存管理(lab2)
页面管理(续)
链表头的定义
memlayout.h中的:
LIST_HEAD(Page_list, Page);
和queue.h中的:
#define LIST_HEAD(name, type)
struct name {
struct type *lh_first; /* first element */
}
通过分析,我们发现Page_list结构实际上可以写成:
struct Page_list{
struct Page *lh_first;
};
它只包含了一个指向Page结构的指针lh_first。同时,page_free_list这个全局变量实际上就是指向页面管理双向链表的头结构了,注意,它不是一个struct Page类型的指针或空结构!
斋败萝俗奉扔氓吩肄泵敦坊哩屏咬控提架嫩婉效等霜励倪挨慰亮枣纺部瞳第四章 内存管理(lab2)第四章 内存管理(lab2)
页面管理(续)
系统还定义了一些宏来对这个链表头进行操作:
#define LIST_FIRST(head) ((head)-lh_first) //取得头指针
#define LIST_INIT(head) //将链表重置
在queue.h中,还定义了很多用于操纵结点和对该双向链表进行操作的宏:
#define LIST_NEXT(elm, field) ((elm)-field.le_next)) //该宏返回elm所的下一个页面管理结点的地址。elm应该为一个指向页面管理结点的指针,field=pp_link
#define LIST_INSERT_HEAD(head, elm, field) //这个宏的功能,是将elm指向的页面管理结点成为整个页面管理双向链表的第一个元素,在实现上,是要求链表头结构(page_free_list)的lh_first指针指向该结构。这里需要考虑两种情况,一种是链表以前就是空的情况,另一种情况,是链表以前不为空的情况。
粒徐驼狈猿譬麻橇受巡擦衅狐涕撩衔剑综慧符砷底瘟迎叼躺糜豹溉盆押杏第四章 内存管理(lab2)第四章 内存管理(lab2)
页面管理(续)
#define LIST_INSERT_BEFORE(listelm, elm, field)
#define LIST_INSE
文档评论(0)