我遇到了以下算法,它将虚拟地址与紧邻的下一页边界对齐.
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)
我发现很难破译它是如何工作的.有人可以帮助我分解吗?
例如,这些计算假设页面大小是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.
| 归档时间: |
|
| 查看次数: |
4743 次 |
| 最近记录: |