xv6 使用 3 级页表。问题在于pte值! 我正在打印页表。我一直注意到我的输出开头的
page table address
(...87f49000) 与第二行 pte (...21fd1401) 不同。
我以为他们应该是一样的。有人说 pte 值不同是正常的,因为操作系统调度随着时间的变化而不同。
我是否遗漏了一些东西,导致我的页表变得丑陋?我只是希望前两个页表 pte 相同!
我期待这样的输出(pte 值相同):
我的代码(这不重要。):
static int level = 0;
static int print_end = 0;
static uint64 vadd_lv0 = 0;
static uint64 vadd_lv1 = 0;
static uint64 vadd_lv2 = 0;
static pte_t pte = 0;
void vmprint(pagetable_t pagetable) {
if (level == 0){
printf("page table %p\n", pagetable);
print_end = 0;
pte = pagetable;
}
// iterate 512 PTEs
for (uint64 i = 0; i < 512; i++) {
uint64 va = 0;
switch(level){
case 0:
vadd_lv0 = i<<30;
va = vadd_lv0;
break;
case 1:
vadd_lv1 = i<<21;
va = vadd_lv0+vadd_lv1;
break;
case 2:
vadd_lv2 = i<<12;
va = vadd_lv0+vadd_lv1+vadd_lv2;
break;
}
pte_t t = pagetable[i];
if (t & PTE_V) {
uint64 pa = PTE2PA(t);
if (level==0 && i==255)
print_end = 1;
if (level != 0 && !print_end){
printf("|");
}else if (level!=0){
printf(" ");
}
for (int j = 0; j < (level-1)*4+3; j++) printf(" ");
printf("+-- %d: pte=%p va=%p pa=%p",i, t, va, pa);
printf((t&PTE_V)?" V":"");
printf((t&PTE_R)?" R":"");
printf((t&PTE_W)?" W":"");
printf((t&PTE_X)?" X":"");
printf((t&PTE_U)?" U":"");
printf((t&PTE_D)?" D":"");
printf("\n");
// PTE without any WRX bit set points to low-level page table
if ((t & (PTE_W|PTE_R|PTE_X)) == 0){
level++;
vmprint((pagetable_t)pa);
level--;
}
}
}
}
不应该打印pte存储的地址,而是打印出pte的地址。