zoniony / zoniony.github.io

blog
1 stars 0 forks source link

6.S081 lab3 Xv6 lazy page allocation #7

Open zoniony opened 4 years ago

zoniony commented 4 years ago

系统学习基础知识的重要性 好的教育资源的重要性

page tables

Lab: xv6 lazy page allocation

xv6 book

xv6 book chinese这是x86下的用不了可以借鉴下的

Page Table

先介绍一些基础知识

建议直接把清华大学公开课虚拟地址转换[二] - 具体实现

这是基本的基本

了解Riscv如何通过虚拟地址寻址到物理地址。中间你得了解PPN,VPN,PTE,PageTable,PA,FLAGS等大量的基础知识

W5Cuv0

还有FLAGS每一位符号的作用,TLB多级页表等加快查找PA等方式

psS6OU

而且这个实验要实现KPTI,要将内核和用户的页表分开,防熔炉漏洞。

以前我尝试利用成功过这个CPU利用cache加快速度而造成安全问题的漏洞,印象更加深刻一点

Xv6 source code

循环遍历每个page table中每个PTE,如果FLAGS标志位中VailRWX为零说明PTE是指向下一个page table

// Recursively free page-table pages.
// All leaf mappings must already have been removed.
static void
freewalk(pagetable_t pagetable)
{
  // there are 2^9 = 512 PTEs in a page table.
  for(int i = 0; i < 512; i++){
    pte_t pte = pagetable[i];
    if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){
      // this PTE points to a lower-level page table.
      uint64 child = PTE2PA(pte);
      freewalk((pagetable_t)child);
      pagetable[i] = 0;
    } else if(pte & PTE_V){
      panic("freewalk: leaf");
    }
  }
  kfree((void*)pagetable);
}

这里卡了一下,PTE的最右边是10bit的FLAGS,先右移10bit得到的PPN,再向左移12位相当于乘以4096,得到下个page table的位置

#define PTE2PA(pte) (((pte) >> 10) << 12)

明天搞完