摘要: 如前所述,__alloc_pages是伙伴系统的主函数。我们已经处理了所有的准备工作并描述了所有可能的标志,现在我们把注意力转向相对复杂的部分:该函数的实现,这也是内核中比较冗长的部分之一。特别是在可用内存太少或逐渐用完时,函数就会比较复杂。如果可用内存足够,则必要的工作会很快完成,就像下述代码。 阅读全文
posted @ 2022-03-20 20:04 while(true);; 阅读(738) 评论(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);; 阅读(358) 评论(0) 推荐(0)
摘要: 内存域数据结构的初始化工作涉及颇广。幸运的是,该任务在所有体系结构上都是相同的。虽然在2.6.19之前的内核版本必须根据不同的体系结构来建立所需的数据结构,但具体的方法随时间的推移已经越来越模块化。各个体系结构只须注册所有活动内存区的一个简单表,通用代码则据此生成主数据结构。 任何一个体系结构,如果 阅读全文
posted @ 2022-03-20 16:43 while(true);; 阅读(83) 评论(0) 推荐(0)
摘要: 直到现在,我们只在特定于体系结构的代码中看到了内核如何检测系统中的可用内存。与高层数据结构(如内存域和结点)的关联,则需要根据该信息构建。我们知道,体系结构相关代码需要在启动期间建立以下信息:  系统中各个内存域的页帧边界,保存在max_zone_pfn数组;  各结点页帧的分配情况,保存在全局 阅读全文
posted @ 2022-03-20 00:51 while(true);; 阅读(147) 评论(0) 推荐(0)
摘要: 反碎片的工作原理如何?为理解该方法,我们必须知道内核将已分配页划分为下面3种不同类型。  不可移动页:在内存中有固定位置,不能移动到其他地方。核心内核分配的大多数内存属于该类别。  可回收页:不能直接移动,但可以删除,其内容可以从某些源重新生成。例如,映射自文件 的数据属于该类别。kswapd守 阅读全文
posted @ 2022-03-19 23:40 while(true);; 阅读(195) 评论(0) 推荐(0)
摘要: struct zone { ... /* * 不同长度的空闲区域 */ struct free_area free_area[MAX_ORDER]; ... }; free_area是一个辅助数据结构,我们此前尚未遇见。其定义如下: <mmzone.h> struct free_area { str 阅读全文
posted @ 2022-03-19 22:47 while(true);; 阅读(91) 评论(0) 推荐(0)
摘要: 在启动过程期间,尽管内存管理尚未初始化,但内核仍然需要分配内存以创建各种数据结构。bootmem分配器用于在启动阶段早期分配内存。 1. 数据结构 即使最先适配分配器也必须管理一些数据。内核(为系统中的每个结点都)提供了一个bootmem_data结构的实例,用于该用途。当然,该结构所需的内存无法动 阅读全文
posted @ 2022-03-19 19:54 while(true);; 阅读(137) 评论(0) 推荐(0)
摘要: zone_pcp_init负责初始化该缓存。该函数由free_area_init_nodes调用。free_area_init_nodes位置参见setup_arch大概步骤 在用zone_batchsize算出批量大小(用于计算最小和最大填充水平的基础)后,(大约相当于内存域中页数的0.25‰。) 阅读全文
posted @ 2022-03-18 01:51 while(true);; 阅读(100) 评论(0) 推荐(0)
摘要: paging_init负责建立只能用于内核的页表,用户空间无法访问。 在IA-32系统上内核通常将总的4 GiB可用虚拟地址空间按3 : 1的比例划分。低端3 GiB用于用户状态应用程序,而高端的1GiB则专用于内核。  地址空间的划分 地址空间的第一段用于将系统的所有物理内存页映射到内核的虚拟地 阅读全文
posted @ 2022-03-18 01:11 while(true);; 阅读(99) 评论(0) 推荐(0)
摘要: 对应高端内存的3部分,高端内存映射有三种方式:映射到”内核动态映射空间”(noncontiguous memory allocation)这种方式很简单,因为通过 vmalloc() ,在”内核动态映射空间”申请内存的时候,就可能从高端内存获得页面(参看 vmalloc 的实现),因此说高端内存有可 阅读全文
posted @ 2022-03-18 01:10 while(true);; 阅读(61) 评论(0) 推荐(0)