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存在以下问题- 特殊页映射在虚拟地址高位,和普通内存页不连续
- 特殊页申请的地址并没有计入到sz中,所以无法释放
 综上,USYSCALL需要手动释放 
 
- 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号