为mmap偏移归零最后12位

时间:2014-09-19 12:23:04

标签: c++ mmap

为什么将mmap偏移的最后12位归零以确保它是__SC_PAGE_SIZE的倍数?

例如:

offset = address & ~(PAGE_SIZE - 1);

这里PAGE_SIZE = 4096。

1 个答案:

答案 0 :(得分:0)

4096dec = 00..001000000000000bin

如果您对将1之前的所有位清零感兴趣,可以执行PAGE_SIZE-1

00..000111111111111

NOT运算符确保考虑所有不在这些位置的位:

~00..000111111111111 = 11..11000000000000

你只需将上面的地址位与上面的零部分清零即可。

这是一个常用的位技巧,可以获得一个2的幂数的倍数值。

您应该注意的一件事:您发布的代码可能会减少地址值,以便将偏移量作为2的幂。即如果你输入4500,你将获得4096的偏移(即你下降到该最大二次数的最底部的倍数。

地址对齐版本更常用:

aligned_address = (address + PAGE_SIZE -1) & ~(PAGE_SIZE - 1);