是否可以手动更改页表的PTE值? (xv6,risc-v,c)

问题描述 投票:0回答:1

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--;
      }
    }
  }
}
c operating-system riscv xv6
1个回答
0
投票

不应该打印pte存储的地址,而是打印出pte的地址。

© www.soinside.com 2019 - 2024. All rights reserved.