我对理解Linux内核管理Free块的方式存在概念上的疑问。这是我到目前为止通过阅读解释的内容。
Buddy Allocator实现是分配方案,其结合了正常的2次幂分配。
当我们需要一个不可用的块大小时,它会将大块分成两块。这两个街区都是好友,可能因此被称为Buddy Allocator。
通过源我了解到,为每个订单维护了一个free_area_t
结构数组,指向一个免费页面的链接列表。
这是我在<linux/mm.h>
typedef struct free_area_struct {
struct list_head free_list;
unsigned long *map;
} free_area_t;
free_list
似乎是页面块的链接列表?我的问题是,它是一个免费页面列表还是二手页面?
map
似乎是一个代表一对好友状态的位图。
我的问题是如何保持一对好友的状态位?因为如果,我使用 Buddy-pair 中的一个块来分配,而另一个是空闲的,那么状态是什么,以及如何将其存储在一个位中?它是否代表了2的幂大小的整个块,当我们需要一个不可用的块大小时,它可以分成两部分,所以分配的一半是另一半的 Buddy 一半是免费的?如果是这种情况,一半被分配,一半仍然是免费的,那么map
的状态是什么?如果两者都免费怎么办?如果两者都被分配怎么办?如何能够表示块的3个状态的二进制值?
编辑:进一步阅读后,第一个疑问将被清除。其中说:如果找不到所请求订单的空闲块,则更高的订单块 被分成两个哥们。一个被分配,另一个被放在免费列表中 较低的顺序。所以它是免费页面的链接列表。
答案 0 :(得分:0)
map
表示最低级别的单个内存块的状态。