【问题标题】:virtual memory page alignment虚拟内存页面对齐
【发布时间】:2013-11-21 05:51:07
【问题描述】:

遇到这个算法来计算给定地址的页面偏移量。

 //naive solution:
int getAlignedValue(int pageSize, int valueToAlign)
{
    int index = valueToAlign/pageSize;
    return index * pageSize;
}

//faster solution:
int getAlignedValue_Fast(int pageSize, int valueToAlign)
{
    return valueToAlign & (~(pageSize-1));
}

简单的方法简单直观,但更快的解决方案仅适用于页面大小为 2 的幂。例如,

pagesize = 8
address = 30
getAlignedValue(8,30) => 24
getAlignedValue_Fast(8,30) => 24

However, when the pagesize is not a power of 2, such as 10
pagesize = 10
address = 24
getAlignedValue(10,24) => 20
getAlignedValue_Fast(10,24) => 16 //wrong

我的问题是,当页面大小是 2 的幂时,更快的方法使用什么属性,这样valueToAlign & (~(pageSize-1))“碰巧”返回正确的对齐方式,例如24. 换句话说,从一个位的比较中,我只知道它在某种程度上起作用,但不了解它背后的数学。

//leading 0s are ignored
pagesize = 8 => 00001000, address = 30 => 00011110
=>
~(pagesize - 1) = ~(00000111) = > 11111000 
=>
 00011110
&11111000
----------
 00011000 = 24

非常感谢。

【问题讨论】:

    标签: bit-manipulation virtual-memory bitmask


    【解决方案1】:

    如果 pageSize 是 2 的幂(即,它只设置了 1 位),则 ~(pageSize - 1)(在大多数系统上相当于 ~pageSize + 1-pageSize)仍然具有该特定位设置,并且所有更高的位也被设置:

    pageSize     = 00001000  // bit k is set
    // now the -1 will borrow through all rightmost zeroes and finally reset the 1
    pageSize-1   = 00000111  // all bits < k are set
    // inverting restores the original 1 and also sets all higher bits
    ~(pageSize-1)= 11111000  // all bits >= k are set
    

    AND-ing 对齐到pageSize,因为例如对齐到 8 意味着没有设置“价值小于”8 的位。掩码会留下 8(在本例中)和所有 2 的高次幂,但会删除所有 2 的低次幂(1、2 和 4)。

    【讨论】:

    • 谢谢!这是有道理的!
    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 2016-09-26
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2023-03-31
    相关资源
    最近更新 更多