Пожалуйста, объясните, что делает этот фрагмент кода C - PullRequest
4 голосов
/ 22 февраля 2011

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

pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);

/* offset for mmap() must be page aligned */

Я понимаю, что здесь sysconf возвращает размер страницы, что позволяет предположить, что это 4096, но после этого я не могу понять логику. Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 22 февраля 2011

Если sysconf возвращает размер страницы, который является степенью двойки или 00..00100..00 в двоичном виде, - 1 создает маску этого числа (то есть, он делает число в форме 00..0011..11, тогда~ вычисляет обратное значение этой маски (11..1100..00). Наконец, побитовая операция и & операция между вновь созданной маской и offset округляет offset до ближайшего кратного размера страницы.

4 голосов
/ 22 февраля 2011

при условии, что размер страницы равен степени 2, выражение вернет offset % _SC_PAGE_SIZE;поэтому, если смещение равно 5000, а размер страницы равен 4096, он вернет 4.

update: Я ошибся, см. комментарии ниже.также контекст, запрошенный OP, относится к преобразованию виртуального адреса в физический адрес в операционной системе.Выражение выше дает адрес виртуальной страницы, который переводится в физический адрес страницы.после преобразования адресуемый байт находится по адресу page_address + (смещение% _SC_PAGE_SIZE).

3 голосов
/ 22 февраля 2011

4096 равно 2 12 , поэтому sysconf(_SC_PAGE_SIZE) - 1 равно 12 1 в двоичном виде.Дополнение (~) представляет собой серию ведущих 1, за которыми следуют 12 0.Поэтому offset & 1111...0000 0000 0000 будет извлекать биты, используемые для представления номера страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...