0

我对理解 Linux Kernel 管理 Free 块的方式存在概念上的疑问。这是我到目前为止通过阅读所解释的内容。Buddy Allocator 实现是结合了正常的 2 次幂分配的分配方案。有时当我们需要一个大小不可用的块时,它会将大块分成两部分。这两个块是 Buddies,可能因此被称为 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 种状态?

编辑:进一步阅读后,第一个疑问被清除。其中说:如果找不到请求顺序的空闲块,则将更高顺序的块分成两个伙伴。一个被分配,另一个被放置在空闲列表中以获得较低的顺序。所以它是免费页面的链表。

4

1 回答 1

0

map表示最低级别的单个内存块的状态。

于 2013-06-28T08:17:39.343 回答