#define PGSIZE 4096 // bytes mapped by a page
#define PGROUNDUP(sz) (((sz)+PGSIZE-1) & ~(PGSIZE-1))
#define PGROUNDDOWN(a) (((a)) & ~(PGSIZE-1))
PGROUNDUP PGROUNDDOWN 宏源代码在 mmu.h文件中。
PGROUNDUP 为往上4k地址对齐,相当于可以把一个地址转换为比此地址高的4k地址。
PGROUNDDOWN 为往下4k地址对齐,相当于可以把一个地址转换为比此地址低的4k地址。
参考下面代码查看地址转换结果
#include<stdio.h>
#define PGSIZE 4096 // bytes mapped by a page
#define PGROUNDDOWN(a) (((a)) & ~(PGSIZE-1)) //往低地址处对齐4k地址
#define PGROUNDUP(sz) (((sz)+PGSIZE-1) & ~(PGSIZE-1)) //往高地址处对齐4k地址
#define KERNBASE 0x100F // First kernel virtual address 可以尝试其它地址值
typedef unsigned int uint;
int main()
{
void *va;
va = (void*)KERNBASE;
char *a, *b;
a = (char*)PGROUNDDOWN((uint)va);
b = (char*)PGROUNDUP((uint)va);
printf("PGROUNDDOWN=%x \nPGROUNDUP=%x\n",a,b);
return 0;
}
可以参考stackoverflow的问答:
https://stackoverflow.com/questions/43289022/what-do-pgroundup-and-pgrounddown-in-xv6-mean
如有错误,欢迎批评指正