4

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

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

他们在做什么?

4

2 回答 2

11

PGROUNDUP并且PGROUNDDOWN是用于将发送的地址四舍五入为 . 的倍数的宏PGSIZE。这些一般用于获取页对齐地址。PGROUNDUP将地址四舍五入为较高的倍数,PGSIZEPGROUNDDOWN将其四舍五入为较低的倍数PGSIZE

让我们举个例子,如果在地址为 620 的 1KBPGROUNDUP的系统上调用:PGSIZE

  • PGROUNDUP(620) ==> ((620 + (1024 -1)) & ~(1023)) ==> 1024
  • 地址 620 向上舍入到 1024。

同样PGROUNDDOWN考虑:

  • PGROUNDDOWN(2400) ==> (2400 & ~(1023)) ==> 2048
  • 地址 2400 向下舍入为 2048。
于 2017-06-14T20:48:38.697 回答
0

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

  • 向下舍入

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

  • 围捕
于 2021-07-16T06:48:37.877 回答