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))
他们是做什么的?
PGROUNDUP
和PGROUNDDOWN
是将地址舍入为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)) 就可以了
- 四舍五入
在xv6 mmu.h
文件中,有这两行代码
#define PGROUNDUP(sz) (((sz)+PGSIZE-1) & ~(PGSIZE-1))
#define PGROUNDDOWN(a) (((a)) & ~(PGSIZE-1))
他们是做什么的?
PGROUNDUP
和PGROUNDDOWN
是将地址舍入为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)) 就可以了
- 四舍五入