2012-03-25 82 views
3

任何人都可以解释这段代码吗?Linux:好友系统空闲内存

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

page_to_pfn()已经返回page_idx,那么什么是 '&' 使用了?或page_to_pfn()返回其他东西?

回答

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; 
} 
+0

但为什么好友系统需要一个环绕?更重要的是,该代码如何返回正确的页面帧号?我的意思是page_to_pfn()已经返回了正确的一个,而后续的回绕将会导致错误。 – tolearn 2012-03-25 10:52:19

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 
+0

但为什么page_idx不能超过2^MAX_ORDER?伙伴系统意味着什么? – tolearn 2012-03-25 10:54:03

+0

它不能超过2^MAX_ORDER,因为应用了位掩码,并且清除了大于该位的所有位。 – knittl 2012-03-25 11:20:08

+0

我的意思是为什么好友系统必须在2^MAX_ORDER中限制page_idx。 – tolearn 2012-03-25 13:00:45