C Linux:伙伴系统可用内存

C Linux:伙伴系统可用内存,c,linux,memory-management,kernel,C,Linux,Memory Management,Kernel,有人能解释一下这个代码吗 page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1); page_idx=page_to_pfn(page)&(1您需要知道x&(1这是一个位掩码,确保page_idx不超过某个值(2^MAX_顺序) 但是为什么buddy系统需要一个环绕呢?更重要的是,这个代码怎么能返回正确的页面帧号呢?我的意思是page_to_pfn()返回正确的一个,下面的换行将使其出错。但是为什么page_idx不能超过

有人能解释一下这个代码吗

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

page_idx=page_to_pfn(page)&(1您需要知道
x&(1这是一个位掩码,确保page_idx不超过某个值(2^MAX_顺序)


但是为什么buddy系统需要一个环绕呢?更重要的是,这个代码怎么能返回正确的页面帧号呢?我的意思是page_to_pfn()返回正确的一个,下面的换行将使其出错。但是为什么page_idx不能超过2^ MAX_顺序?这对buddy system意味着什么?它不能超过2^ MAX_顺序,因为位掩码已应用并清除所有大于该顺序的位。我的意思是为什么buddy system必须将page_idx限制为2^ MAX_顺序。因为它限制了页面到2^最大顺序?换句话说:最大页数定义为2^最大顺序。
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;
}
# define MAX_ORDER (8)

(1 << MAX_ORDER) /* 100000000 */
- 1 /* flip bits, same as ~(…) due to two-complement: 11111111 */
  1010010101001
& 0000011111111
= 0000010101001