有人可以解释一下这段代码是做什么的吗?
pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);
/* offset for mmap() must be page aligned */
Run Code Online (Sandbox Code Playgroud)
我知道这里sysconf
返回页面大小,假设它是4096,但之后我无法理解逻辑.提前致谢.
如果sysconf
返回页面大小(2的幂或00..00100..00
二进制),- 1
则生成该数字的掩码(即,它生成一个表单的数字00..0011..11
,然后~
计算此掩码的反转(11..1100..00
).最后,按位和&
操作新创建的面具之间offset
回合offset
下来到页面大小的最接近倍数.
假设页面大小是 2 的幂,则表达式将返回offset % _SC_PAGE_SIZE
; 因此,如果偏移量为 5000 并且页面大小为 4096,它将返回 4。
更新:我错了,请参阅下面的评论。OP 所请求的上下文也是操作系统中虚拟地址到物理地址的转换。上面的表达式给出了虚拟页地址,该地址被转换为物理页地址。转换后,正在寻址的字节位于 page_address + (offset % _SC_PAGE_SIZE)。