2012-03-25 3 views
3

누구든지이 코드를 설명 할 수 있습니까?리눅스 : 버디 시스템 무료 메모리

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

1

이 page_idx 특정 값 (^ MAX_ORDER 2)을 초과하지 않는 것을 보장하는 비트 마스크이다. 버디 시스템은 주위를 묶는 필요한 이유

# 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

+0

비트 마스크가 적용되고 그 이상의 모든 비트가 지워지기 때문에 2^MAX_ORDER를 초과 할 수 없습니다. – knittl

+0

친구 시스템이 2^MAX_ORDER에서 page_idx를 제한해야하는 이유입니다. – tolearn