标签:伙伴系统 linux kernel linux 物理内存管理 buddy allocator
众所周知,物理内存的管理对于一个操作系统性能的重要性,那么著名的 Linux 是如何有效地管理起物理内存的呢。这里将作一个详尽的分析。前两条规定好理解,也就是两块相同大小,并且连续的内存块才有可能是伙伴,因为这样,两块合起来就可以很顺利地添加到更上一级的空闲链表中。第三条规定了,在满足前两个条件的情况下,还需要,第一块的物理地址的限定,举个例子。
+---------------------------------------+ | a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7 | +---------------------------------------+ | b0 | b1 | b2 | b3 | +---------------------------------------+ | c0 | c1 | +---------------------------------------+
+-------+ +------+ +------+ | 1 |---->| a1 |----->| a2 | +-------+ +------+ +------+ | 2 | +-------+ +------+ | 4 |-----| c1 | +-------+ +------+ | ... |
static inline struct page * __page_find_buddy(struct page *page, unsigned long page_idx, unsigned int order) { unsigned long buddy_idx = page_idx ^ (1 << order); return page + (buddy_idx - page_idx); }page_idx 为页框号,即 a0 之类的序号,order 为级别,即 2 的 order 次方个页框,page_idx 与 (1 << order)做异或,那么如果 page_idx 中相应的位为 1,相当于 page_idx - 2^order,因为互为伙伴的两个块的第一个块,它的地址,肯定为 (2 x b x 页大小),b 为 2 的 order 次方,因为都以页大小为单位,所以相当于 2 x 2^order,为 2 ^ (order + 1),那么它的第 2 ^ order 位肯定为 0,如果为 1 那么说明它是第二块,此时应该找第一块,所以要减去相应级别的大小,同理,如果为 0,说明它是第 1 块,此时应找第二块,所以要加上同级别的大小。
标签:伙伴系统 linux kernel linux 物理内存管理 buddy allocator
原文地址:http://blog.csdn.net/henzox/article/details/42262209