Linux:伙伴系统免费内存

时间:2012-03-25 09:02:32

标签: c linux memory-management kernel

有人能解释一下这段代码吗?

page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1);

page_to_pfn()已经返回了page_idx,那么'&amp;'是什么用来?或者page_to_pfn()返回其他内容?

2 个答案:

答案 0 :(得分:2)

您需要知道x & ((1 << n) - 1)是一个意味着x % ((int) pow(2, n))的技巧。通常它更快(但最好将这些优化留给编译器)。

所以在这种情况下,它通过pow(2, MAX_ORDER)做了一个模数。这导致环绕;如果page_idx大于pow(2, MAX_ORDER),它将返回0.这是等效的,但更易读的代码:

const int MAX_ORDER_N = (int) pow(2, MAX_ORDER);

page_idx = page_to_pfn(page);

/* wraparound */
while (page_idx > MAX_ORDER_N) {
    page_idx -= MAX_ORDER_N;
}

答案 1 :(得分:1)

这是一个掩码,确保page_idx不超过某个值(2 ^ MAX_ORDER)。

# define MAX_ORDER (8)

(1 << MAX_ORDER) /* 100000000 */
- 1 /* flip bits, same as ~(…) due to two-complement: 11111111 */

所以你只剩下八个最低有效位

  1010010101001
& 0000011111111
= 0000010101001