【MIT 6.S081】2020, 实验记录(3),Lab: page tables

发布时间:2024年01月13日

Task

Task 1: Print a page table

该实验需要增加一个 vmprint 函数,用于打印一个 page table,实现过程可以参考 vm.c 文件中的 freewalk() 函数。

在 defs.h 中增加 vmprint 的定义:

void            vmprint(pagetable_t);

在 vm.c 中代码如下:

// 打印一行 PTE
void print_pte(int index, pte_t pte, uint64 pa, int level) {
  for (int j = level; j > 0; j--) {
    if (j != 1) {
      printf(".. ");
    } else {
        printf("..");
    }
  }
  printf("%d: pte %p pa %p\n", index, pte, pa);
}

// 递归地打印 page table
void display_pt(pagetable_t pagetable, int level) {
  static const int PTE_NUMBERS = 512;  // 每个 page 的 PTE 数量
  for (int i = 0; i < PTE_NUMBERS; i++) {
    pte_t pte = pagetable[i];
    if ((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0) {
      uint64 child = PTE2PA(pte);
      print_pte(i, pte, child, level);
      display_pt((pagetable_t) child, level + 1);
    } else if (pte & PTE_V) {
      print_pte(i, pte, PTE2PA(pte), level);
    }
  }
}

/**
 * display the page table
 */
void
vmprint(pagetable_t pagetable)
{
  printf("page table %p\n", pagetable);
  display_pt(pagetable, 1);
}

在 exec.c 的 exec() 函数中,return argc 之前增加对 vmprint 的调用:

int
exec(char *path, char **argv)
{
  ...
  if (p->pid == 1) {
    vmprint(p->pagetable);
  }
  return argc;
  ...
}

实现结果:输入 make qemu

task-1 测试

文章来源:https://blog.csdn.net/qq_45668004/article/details/135571603
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。