6.s081 第四周实验 Lab pgtbl: Page tables

这篇博客详细介绍了在RISC-V操作系统中如何实现页表的打印、每个进程分配独立的内核页表以及简化copyin/copyinstr过程。实验内容包括:实现vmprint()函数遍历并打印页表,为每个进程分配内核页表,并在进程切换时更新页表,以及利用内核页表简化用户数据到内核空间的拷贝。同时,文章提到了在fork(), sbrk(), exec()及userinit()函数中进行的修改,以确保页表的正确同步。" 136217280,594666,内存冷热标记算法实现 - 华为OD C卷真题解析,"['算法', '华为OD', 'C++']
摘要由CSDN通过智能技术生成

1. Print a page table

  • 在vm.c中, 实现一个vmprint()函数来遍历页表并打印,可以仿照freewalk()函数来写。
  • 记得在def.h 添加声明
void printwalk(pagetable_t pagetable, int level) {
   
  char* prefix;
  if (level == 2) prefix = "..";
  else if (level == 1) prefix = ".. ..";
  else prefix = ".. .. ..";

  for(int i = 0; i < 512; i++){
   
    pte_t pte = pagetable[i];
    if(pte & PTE_V){
   
      uint64 pa = PTE2PA(pte);
      printf("%s%d: pte %p pa %p\n", prefix, i, pte, pa);
      if((pte & (PTE_R|PTE_W|PTE_X)) == 0){
   
        printwalk((pagetable_t)pa, level - 1);
      }
    }
  }
}

int
vmprint(pagetable_t pagetable) {
   
  printf("page table %p\n", pagetable);
  printwalk(pagetable, 2); 
  return 0;
}

2. A kernel page table per process

  • 这一题是要为每个进程分配一个内核页表。为第三题做准备
  • 添加一个kernel pagetable项到struct proc结构体中
    struct proc {
    struct spinlock lock;
  
    // p->lock must be held when using these:
    enum procstate state;        // Process state
    struct proc *parent;         // Parent process
    void *chan;                  // If non-zero, sleeping on chan
    int killed;                  // If non-zero, have been killed
    int xstate;                  // Exit status to be returned to parent's wait
    int pid;                     // Process ID
  
    // these are private to the process, so p->lock need not be held.
    uint64 kstack;               // Virtual address of kernel stack
    uint64 sz;                   // Size of process memory (bytes)
    pagetable_t pagetable;       // User page table
    struct trapframe *trapframe; // data page for trampoline.S
    struct context context;      // swtch() here to run process
    struct file *ofile[NOFILE];  // Open files
    struct inode *cwd;           // Current directory
    char name[16];               // Process name (debugging)
    pagetable_t kpagetable;  //每个进程保存一个kernel pagetable
};
  • 创建一个来创建内核页表,初始化 和 内核使用的页表一致。参考kvminit()
pagetable_t proc_kpagetable() {
   
    pagetable_t kpagetable;
    kpagetable = uvmcreate();
    if(kpagetable == 0)
      return 0;
  
    ukvmmap(kpagetable, UART0, UART0, PGSIZE, PTE_R | PTE_W);
    ukvmmap(kpagetable, VIRTIO0, VIRTIO0, PGSIZE, PTE_R | PTE_W);
    ukvmmap(kpagetable, CLINT, CLINT, 0x10000, PTE_R | PTE_W);
    ukvmmap(kpagetable, PLIC, PLIC, 0x400000, PTE_R | PTE_W);
    ukvmmap(kpagetable, KERNBASE, KERNBASE, (uint64)etext-KERNBASE, PTE_R | PTE_X);
    ukvmmap(kpagetable, (uint64)etext, (uint64)etext, PHYSTOP-(uint64)etext, PTE_R | PTE_W);
    ukvmmap(kpagetable, TRAMPOLINE, (
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值