Linux内核内存管理之BUDDY页面管理(二)

本文深入介绍了Linux内核中的BUDDY内存管理算法,包括算法原理、数据结构free_area、物理页的分配与释放过程,以及free_area数组在查找页描述符中的作用。BUDDY算法通过将空闲页组织成多个链表,根据需求分配连续的物理内存,并在释放时进行合并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单介绍一下BUDDY的作用,它是内存管理的一种经典的算法,无论后面那个地方需要用到物理内存,都会使用到此算法进行内存分配。
一、算法简介
1、linux中将所有的空闲页分为MAX_ORDER(X86系统上为11)个链表,对应到zone数据结构中的struct free_area free_area[MAX_ORDER];
2、每个链表(大小基于free_area下标)分别包含大小为1,2,4,8,16,32,64,128,256,512,1024个连续的物理页所组成的内存块,当然每个块链表上的内存块个数是不确定的,用双向链表链接;
3、按照此算法分配物理块其物理地址是连续的,过程:假如要请求一个256个页大小的物理块,现在下标为8(2^8=256)对应的链表上找,如果为空,向上找下标为9的链表,如果还为空继续找,直到不为空。假如1024个页大小的物理块链表不为空,将其中的256分配出去,剩余的768个页拿512放到下标为9的链表中,256放在下标为8的链表中;
4、上述的逆过程就是释放过程,合并的要求:
① 两个块大小相同,记做b;
② 它们的物理块是连续的;
③ 第一块的页框的物理地址是2×b×(2^12)的倍数。
二、数据结构(free_area) 看->五
1、其中主要的是free_area数组的操作,上面也有介绍,数组中第k个元素,它所标识的大小为2^k的空间块;
2、其中free_list是双向链表的表头,这个双向链表包含了对应大小空间块的起始页的页描述符,链表中内容是这些页描述符的lru字段;
3、还有一个变量nr_free表示指定大小的内存块的个数,为零表示链表为空。
三、如何物理页
1、先看几个函数:
  ① alloc_pages(gfp_mask, order) 
          //用这个函数请求(2^order)个连续的物理页
  ② alloc_page(gfp_mask) 
     //用于获取一个单独
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值