Хорошо, так что вам действительно не нужен «индекс», а просто какой-то уникальный идентификатор для различения guish разных страниц в виртуальном адресе процесса.
В таком случае, тогда вы можете просто сделать address >> PAGE_SHIFT
. В x86 со страницами 4 КБ PAGE_SHIFT
равно 12
, поэтому вы можете сделать:
page_id = address >> 12
Тогда, если address1
и address2
соответствуют одной и той же странице, page_id
будет одинаковым для обоих адресов.
В качестве альтернативы, для достижения того же результата вы можете ввести address & PAGE_MASK
, где PAGE_MASK
- это просто 0xfffffffffffff000
(то есть ~((1UL << PAGE_SHIFT) - 1)
).