Linux: система друзей свободной памяти - PullRequest
3 голосов
/ 25 марта 2012

Может ли кто-нибудь объяснить этот код?

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

page_to_pfn () уже вернули page_idx, так что для чего используется '&'?Или page_to_pfn () возвращает что-то еще?

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Вы должны знать, что 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;
}
1 голос
/ 25 марта 2012

Это битовая маска, которая гарантирует, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...