c++ - 将 mmap 偏移量的最后 12 位归零

标签 c++ mmap

为什么将 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/

相关文章:

c - 如何在不关心 MAC 地址的情况下使用 packet_mmap 发送 SOCK_DGRAM 数据包?

c++ - haar 训练 OpenCV 断言失败

c++ - SFINAE:它如何与派生类一起工作?

c - 使用 mmap 映射的内存,并与 mprotect 一起使用

Linux:如何防止文件支持的内存映射导致访问错误(SIGBUS 等)?

linux - 只写映射一个 O_WRONLY 打开的文件应该工作?

c++ - 如何使用 C++20 istream_view?

c++ - 使用模板重载功能

c++ - std::function 无法推断模板实例中的重载类型

C - 将结构成员的地址传递给函数错误返回