xv6 中的 PGROUNDUP 和 PGROUNDDOWN 是什么意思?

What do PGROUNDUP and PGROUNDDOWN in xv6 mean?

在xv6 mmu.h文件中,有这两行代码

    #define PGROUNDUP(sz)  (((sz)+PGSIZE-1) & ~(PGSIZE-1))
    #define PGROUNDDOWN(a) (((a)) & ~(PGSIZE-1))

他们是做什么的?

PGROUNDUPPGROUNDDOWN 是将地址舍入为PGSIZE 的倍数的宏。这些一般用于获取页对齐地址。 PGROUNDUP 会将地址四舍五入为 PGSIZE 的较高倍数,而 PGROUNDDOWN 会将其四舍五入为 PGSIZE.

的较低倍数

让我们举个例子,如果 PGROUNDUP 在具有 PGSIZE 1KB 地址 620 的系统上调用:

  • PGROUNDUP(620) ==> ((620 + (1024 -1)) & ~(1023)) ==> 1024
  • 地址 620 已四舍五入为 1024。

PGROUNDDOWN 类似,请考虑:

  • PGROUNDDOWN(2400) ==> (2400 & ~(1023)) ==> 2048
  • 地址 2400 向下舍入为 2048。

首先你应该知道(PGSIZE-1))是最大余数(addr/page_size)

  • 四舍五入

本质上我们只需要舍弃余数部分,& ~(PGSIZE-1)) 就可以了

  • 四舍五入