2012-03-25 62 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