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