将虚拟地址与紧邻的下一页边界对齐

Ste*_*e H 7 c paging

我遇到了以下算法,它将虚拟地址与紧邻的下一页边界对齐.

VirtualAddr = (VirtualAddr & ~(PageSize-1));
Run Code Online (Sandbox Code Playgroud)

此外,给定一个字节长度将长度(将其舍入)对齐在页面边界上

len = ((PageSize-1)&len) ? ((len+PageSize) & ~(PageSize-1)):len;
Run Code Online (Sandbox Code Playgroud)

我发现很难破译它是如何工作的.有人可以帮助我分解吗?

Mar*_*n R 8

例如,这些计算假设页面大小是2(对于我所知道的所有系统都是这种情况)

PageSize = 4096 = 2^12 = 1000000000000 (binary)
Run Code Online (Sandbox Code Playgroud)

然后(写成二进制数)

PageSize-1    = 00...00111111111111
~(PageSize-1) = 11...11000000000000
Run Code Online (Sandbox Code Playgroud)

意思就是

(VirtualAddr & ~(PageSize-1))
Run Code Online (Sandbox Code Playgroud)

VirtualAddr设置为零或,换句话说,低12位 VirtualAddr四舍五入向下到的下一个倍数2^12 = PageSize.

现在你可以(希望)看到它

len = ((PageSize-1)&len) ? ((len+PageSize) & ~(PageSize-1)):len;
Run Code Online (Sandbox Code Playgroud)

第一个表达

 ((PageSize-1)&len)
Run Code Online (Sandbox Code Playgroud)

如果len是倍数,则为零PageSize.在这种情况下,len保持不变.否则(len + PageSize)向下舍入到下一个倍数 PageSize.

所以在任何情况下,len都会向上舍入到下一个倍数PageSize.