Предполагая, что PAGESIZE
является степенью 2 (требование), целое значение x может быть округлено до кратного PAGESIZE
с (x & ~(PAGESIZE-1))
. Аналогично, ((x + PAGESIZE-1) & ~(PAGESIZE-1))
приведет к x , округленному до кратного PAGESIZE
.
Например, если PAGESIZE
равно 16, то в двоичном виде с 32-разрядным словом:
00000000000000000000000000010000
PAGESIZE
00000000000000000000000000001111
PAGESIZE-1
11111111111111111111111111110000
~(PAGESIZE-1)
Побитовое и (&) с вышеуказанным значением очистит младшие 4 бита значения, делая его кратным 16.
Тем не менее, код, приведенный в описании, взят из старой версии страницы руководства, и он не очень хорош, потому что он тратит память и не работает на 64-битных системах. Лучше использовать posix_memalign()
или memalign()
для получения памяти, которая уже правильно выровнена. В примере текущей версии справочной страницы mprotect()
используется memalign()
. Преимущество posix_memalign()
заключается в том, что он является частью стандарта POSIX и не ведет себя по-разному в разных системах, например, в более старых нестандартных memalign()
.
.