任何人都可以解釋這段代碼嗎?Linux:好友系統空閒內存
page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1);
page_to_pfn()已經返回page_idx,那麼什麼是 '&' 使用了?或page_to_pfn()返回其他東西?
任何人都可以解釋這段代碼嗎?Linux:好友系統空閒內存
page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1);
page_to_pfn()已經返回page_idx,那麼什麼是 '&' 使用了?或page_to_pfn()返回其他東西?
您需要知道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;
}
這是一個位掩碼,其確保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
但爲什麼好友系統需要一個環繞?更重要的是,該代碼如何返回正確的頁面幀號?我的意思是page_to_pfn()已經返回了正確的一個,而後續的迴繞將會導致錯誤。 – tolearn 2012-03-25 10:52:19