Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Aligning virtual address to immediate next page boundary

Tags:

c

paging

I came across following algorithm that aligns virtual address to immediate next page bounday.

VirtualAddr = (VirtualAddr & ~(PageSize-1));

Also, given a length of bytes aligns length (rounds it) to be on the page boundary

len = ((PageSize-1)&len) ? ((len+PageSize) & ~(PageSize-1)):len;

I am finding it hard to decipher how this works. Can someone help me out to break it down?

like image 461
Steve H Avatar asked Apr 09 '14 18:04

Steve H


2 Answers

Those calculations assume that the page size is a power of 2 (which is the case for all systems that I know of), for example

PageSize = 4096 = 2^12 = 1000000000000 (binary)

Then (written as binary numbers)

PageSize-1    = 00...00111111111111
~(PageSize-1) = 11...11000000000000

which means that

(VirtualAddr & ~(PageSize-1))

is VirtualAddr with the lower 12 bits set to zero or, in other words, VirtualAddr rounded down to the next multiple of 2^12 = PageSize.

Now you can (hopefully) see that in

len = ((PageSize-1)&len) ? ((len+PageSize) & ~(PageSize-1)):len;

the first expression

 ((PageSize-1)&len)

is zero exactly if len is a multiple of PageSize. In that case, len is left unchanged. Otherwise (len + PageSize) is rounded down to the next multiple of PageSize.

So in any case, len is rounded up to the next multiple of PageSize.

like image 101
Martin R Avatar answered Nov 07 '22 12:11

Martin R


I think the first one should be

VirtualAddr = (VirtualAddr & ~(PageSize-1)) + PageSize; 
like image 2
a5hk Avatar answered Nov 07 '22 13:11

a5hk