摘要: 如果内核找到适当的内存域,具有足够的空闲页可供分配,那么还有两件事情需要完成。首先它必须检查这些页是否是连续的(到目前为止,只知道有许多空闲页)。其次,必须按伙伴系统的方式从free_lists移除这些页,这可能需要分解并重排内存区。内核将该工作委托给前一节提到的buffered_rmqueue。图 阅读全文
posted @ 2022-03-20 21:58 while(true);; 阅读(66) 评论(0) 推荐(0) 编辑
摘要: 如前所述,__alloc_pages是伙伴系统的主函数。我们已经处理了所有的准备工作并描述了所有可能的标志,现在我们把注意力转向相对复杂的部分:该函数的实现,这也是内核中比较冗长的部分之一。特别是在可用内存太少或逐渐用完时,函数就会比较复杂。如果可用内存足够,则必要的工作会很快完成,就像下述代码。 阅读全文
posted @ 2022-03-20 20:04 while(true);; 阅读(525) 评论(0) 推荐(0) 编辑
摘要: 所有API函数都追溯到alloc_pages_node,从某种意义上说,该函数是伙伴系统主要实现的“发射台”。 <gfp.h> static inline struct page *alloc_pages_node(int nid, gfp_t gfp_mask,unsigned int order 阅读全文
posted @ 2022-03-20 18:01 while(true);; 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 内存域数据结构的初始化工作涉及颇广。幸运的是,该任务在所有体系结构上都是相同的。虽然在2.6.19之前的内核版本必须根据不同的体系结构来建立所需的数据结构,但具体的方法随时间的推移已经越来越模块化。各个体系结构只须注册所有活动内存区的一个简单表,通用代码则据此生成主数据结构。 任何一个体系结构,如果 阅读全文
posted @ 2022-03-20 16:43 while(true);; 阅读(47) 评论(0) 推荐(0) 编辑
摘要: 直到现在,我们只在特定于体系结构的代码中看到了内核如何检测系统中的可用内存。与高层数据结构(如内存域和结点)的关联,则需要根据该信息构建。我们知道,体系结构相关代码需要在启动期间建立以下信息:  系统中各个内存域的页帧边界,保存在max_zone_pfn数组;  各结点页帧的分配情况,保存在全局 阅读全文
posted @ 2022-03-20 00:51 while(true);; 阅读(66) 评论(0) 推荐(0) 编辑