简单介绍一下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)
//用于获取一个单独
一、算法简介
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)
//用于获取一个单独