在 xv6mmu.h
文件中,有这两行代码
#define PGROUNDUP(sz) (((sz)+PGSIZE-1) & ~(PGSIZE-1))
#define PGROUNDDOWN(a) (((a)) & ~(PGSIZE-1))
他们在做什么?
在 xv6mmu.h
文件中,有这两行代码
#define PGROUNDUP(sz) (((sz)+PGSIZE-1) & ~(PGSIZE-1))
#define PGROUNDDOWN(a) (((a)) & ~(PGSIZE-1))
他们在做什么?
PGROUNDUP
并且PGROUNDDOWN
是用于将发送的地址四舍五入为 . 的倍数的宏PGSIZE
。这些一般用于获取页对齐地址。PGROUNDUP
将地址四舍五入为较高的倍数,PGSIZE
而PGROUNDDOWN
将其四舍五入为较低的倍数PGSIZE
。
让我们举个例子,如果在地址为 620 的 1KBPGROUNDUP
的系统上调用:PGSIZE
同样PGROUNDDOWN
考虑:
首先你应该知道 (PGSIZE-1)) 是最大余数 (addr/page_size)
本质上我们只需要放弃剩余部分, & ~(PGSIZE-1)) 就可以了