为什么将 mmap 偏移量的最后 12 位归零可确保它是 __SC_PAGE_SIZE 的倍数?
例如:
offset = address & ~(PAGE_SIZE - 1);
此处 PAGE_SIZE = 4096。
最佳答案
4096dec = 00..001000000000000bin
如果您有兴趣将 1 之前的所有位清零,您可以执行 PAGE_SIZE-1
:
00..000111111111111
NOT 运算符确保考虑所有不在这些位置的位:
~00..000111111111111 = 11..11000000000000
您只需将地址位与上述内容进行 AND 操作即可将上面的零部分清零。
这是一种常用的位技巧,用于获取一个值,该值是二次幂数的倍数。
您应该注意一件事:您发布的代码可能会减少地址值以获得作为二次方的偏移量。 IE。如果您输入 4500,您将获得 4096 的偏移量(即您下降到最接近该二次方数的倍数。
地址对齐 版本使用得更多:
aligned_address = (address + PAGE_SIZE -1) & ~(PAGE_SIZE - 1);
关于c++ - 将 mmap 偏移量的最后 12 位归零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25933854/