任何人都可以解释此代码?
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