请解释这段C代码的作用

时间:2011-02-22 06:50:04

标签: c

有人可以解释一下这段代码是做什么的吗?

pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);

/* offset for mmap() must be page aligned */

我理解这里sysconf返回页面大小,假设它是4096,但之后我无法理解逻辑。提前谢谢。

3 个答案:

答案 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将提取用于表示页码的位。