有人可以解释一下这段代码是做什么的吗?
pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);
/* offset for mmap() must be page aligned */
我理解这里sysconf
返回页面大小,假设它是4096,但之后我无法理解逻辑。提前谢谢。
答案 0 :(得分:8)
如果sysconf
返回页面大小(2的幂)或二进制00..00100..00
,- 1
会生成该数字的掩码(也就是说,它会生成一个表单00..0011..11
,然后~
计算此掩码的反向(11..1100..00
)。最后,新创建的掩码和&
轮之间的按位和offset
操作offset
缩小到最接近页面大小的倍数。
答案 1 :(得分:4)
假设页面大小是2的幂,表达式将返回offset % _SC_PAGE_SIZE
;因此,如果offset为5000且页面大小为4096,则返回4.
更新:我错了,请参阅下面的评论。 OP所请求的上下文也是操作系统中物理地址转换的虚拟地址。上面的表达式给出了虚拟页面地址,该地址被转换为物理页面地址。转换后,在page_address +(offset%_SC_PAGE_SIZE)找到要寻址的字节。
答案 2 :(得分:3)
4096是2 12 ,因此sysconf(_SC_PAGE_SIZE) - 1
是二进制的12 1。补语(~
)是一系列前导1,后跟12 0。因此,offset & 1111...0000 0000 0000
将提取用于表示页码的位。