为什么将mmap偏移的最后12位归零以确保它是__SC_PAGE_SIZE的倍数?
例如:
offset = address & ~(PAGE_SIZE - 1);
这里PAGE_SIZE = 4096。
答案 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);