九阳神功爱喝茶 发表于 2015-06-15 12:47

find_buddy函数实现的原理是什么?

我也能理解基本的原理:释放一个页的时候,将这个页与其相邻的空闲页合并成较大的页。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);
}这是别人给的一个示意图:

比如,第一次合并的时候,为什么要用异或算法选择第十一页而不是第九页?

nswcfd 发表于 2015-06-17 20:01

因为要保证,所有order上的页面,都是2^(order-1)对齐的,也就是说,pfn的最后order-1个bit都是0.

10=8+2=0x101,所以它的buddy只能是0x101=8+3=11。

如果选择9合并的话,合并后是由9和10构成的一个2个page,其首地址是9,这不满足2*page对齐的要求(即必须是偶数)

九阳神功爱喝茶 发表于 2015-06-18 10:20

非常感谢回答,helps me a lot 。有个地方我不是很理解想和您探讨下,就是“我的理解是order上的页面满足2^order对齐,也就是首地址order-1位之后都为0;比如比如首地址位10=1010B,order=1,此时是两个页(2^order)对齐,后order-1=0bit位0;满足要求”。是这样的吗?回复 2# nswcfd


   

nswcfd 发表于 2015-06-24 20:47

本帖最后由 nswcfd 于 2015-06-24 20:48 编辑

不好意思,现在才回复。

假设page size=4k=2^12,那么page是4k对齐的,即地址的最后12bit为0,
相应的,2^order个page对齐(其实没这么个叫法),就意味着地址的最后12+order个bit为0。

前面的帖子,不知道为啥说成order-1了,囧。。。

例子中的,当前order=0(即单个页面),pi=10,目标是合并成order=1的双页面,对齐的要求就是,合并之后的首地址,最后12+1个bit为0,所以只能选择11(首地址为10<<12)而不是9(首地址为9<<12)。

九阳神功爱喝茶 发表于 2015-06-24 21:30

非常感谢,回答的很好回复 4# nswcfd


   
页: [1]
查看完整版本: find_buddy函数实现的原理是什么?