4.Q&A

文档名:riscv-privileged

XV6使用Riscv SV39

Riscv satp地址翻译在4.3.1 Addressing and Memory Protection章节

SV39指令格式详细说明在4.4 Sv39: Page-Based 39-bit Virtual-Memory System Sv39:章节

Q1、虚拟地址是怎么翻译的?walk和satp的关系

satp是一个硬件寄存器,当把当前进程页表写入satp后,访问虚拟地址时,处理器会自动翻译为物理地址。

satp地址翻译的详细逻辑在4.3.2 Virtual Address Translation Process章节

但是我们还需要操作页表,比如映射tramframe页等,于是写了一个walk函数,模拟页表翻译过程。对页表项进行修改。

Q2、

kernel\proc.c\proc_freepagetable中,为什么需要uvmunmap 某些页,为什么不能在uvmfree中释放

  • 和释放进程内存空间和页表相关的函数是kernel\vm.c\uvmfree函数

    void uvmfree(pagetable_t pagetable, uint64 sz) {
      if(sz > 0)
        uvmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1);
      freewalk(pagetable);
    }
    
    • uvmunmap的函数定义如下

      void uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free)
      

      这个函数的作用是释放pagetable中,从va开始的npages个页,如果do_free=1,那么还会回收va所指向的内存页

    • 所以这里就是先判断当前进程所持有的内存是否为0,如果不是,那就先释放内存,而sz参数是由myproc()->sz指定,存储的是经过sbrk申请的内存大小

    • 查看sbrk代码可以发现,每个进程的虚拟地址都是从0开始递增,而我们的特殊页USYSCALL存在以下问题

      1. 特殊页映射在虚拟地址高位,和普通内存页不连续
      2. 特殊页申请的地址并没有计入到sz中,所以无法释放

      综上,USYSCALL需要手动释放

posted @ 2024-04-21 00:08  INnoVation-V2  阅读(39)  评论(0)    收藏  举报