2012-03-25 10 views
3

Kann jemand diesen Code erklären?Linux: Buddy System freier Speicher

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

page_to_pfn() hat bereits die page_idx zurückkehren, so was tut '&' Verwendung für? Oder page_to_pfn() etwas anderes zurückgeben?

Antwort

2

Sie müssen wissen, dass x & ((1 << n) - 1) ist ein Trick Bedeutung x % ((int) pow(2, n)). Oft ist es schneller (aber es ist besser, diese Art von Optimierungen dem Compiler zu überlassen).

Also in diesem Fall, was das tut, tut es ein Modulo von . Dies verursacht einen Umlauf; wenn page_idx größer als pow(2, MAX_ORDER) ist, wird es auf 0 zurück Hier entspricht, aber lesbarer Code:

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

Aber warum das Buddy-System und umlaufendem müssen? Und wie könnte dieser Code die korrekte Seitennummer zurückgeben? Ich meine page_to_pfn() habe den richtigen zurückgegeben und der folgende Wrap-Around wird es falsch machen. – tolearn

1

Es ist eine Bitmaske, die sicherstellt, dass page_idx einen bestimmten Wert nicht überschreitet (2^MAX_ORDER).

# define MAX_ORDER (8) 

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

So haben Sie nur die acht am wenigsten signifikanten Bits

links
1010010101001 
& 0000011111111 
= 0000010101001 
+0

Aber warum page_idx konnte 2^MAX_ORDER nicht überschreiten? Was bedeutet es für Buddy-System? – tolearn

+0

Sie darf 2^MAX_ORDER nicht überschreiten, da die Bitmaske angewendet wird und alle Bits gelöscht werden, die größer sind. – knittl

+0

Ich meine, warum Buddy-System page_idx in 2^MAX_ORDER begrenzen. – tolearn