Lab 2
Memory Management
Virtual Memory
           When we into protected mode

           Selector

Software              Segmentation            Paging              RAM
            Offset



           Virtual                   Linear            Physical
Virtual Memory
 Hence the “selector” has no effect and
 the linear address always equals the
 offset of the virtual address.
 so, we only care ....

     Virtual
                        Paging              RAM
    address


               Linear            Physical
Virtual Memory
 Linear address                     Physical address
 10    10   12                         20       12
 Dir Table Offset                     PPN     Offset



                             1023      20      12



              20      12              PPN    Offset
    1023

                              0
             PPN    Offset            Page Table


     0
           Page Directory
Virtual Memory
                                  0x0fffffff
                                   256MB
 Linear address
 10    10   12
                     Extended
 Dir Table Offset
                      Memory


                                  0x00100000
                    BIOS ROM

   4GB                 ROM

                    VGA Display
                                  0x000A0000
                       RAM
                                  0x00000000
Virtual Memory
      Linear address
      10    10   12
      Dir Table Offset

                                   pde_t *kern_pgdir;
                                   kern_pgdir = (pde_t *)
PDX(va)                            boot_alloc(PGSIZE);



          1023      20      12



                   PPN    Offset


           0
                 Page Directory
Virtual Memory
                    0x0fffffff
                     256MB




      kern_pgdir    4KB
         Kernel     ?KB
                    0x00100000
      BIOS ROM

         ROM

      VGA Display
                    0x000A0000
         RAM
                    0x00000000
Virtual Memory
      Linear address
      10    10   12
      Dir Table Offset



                                    1023   20       12
PDX(va)          PTX(va)


                    20       12            PPN   Offset
          1023

                                     0
                   PPN     Offset          Page Table


           0
                 Page Directory
Virtual Memory
      Linear address
      10    10   12                 struct Page *pages;
      Dir Table Offset              static struct Page *page_free_list;



                                        1023   20       12
PDX(va)          PTX(va)


                    20       12                PPN   Offset
          1023

                                         0
                   PPN     Offset              Page Table


           0
                 Page Directory
Virtual Memory

                               0x0fffffff
                                256MB
page_init


                     pages
                  kern_pgdir    4KB
                     kernel    ?KB
                               0x00100000
                     BIOS
                               0x000A0000(IOPHYSMEM)

 page_free_list                0x00000000
Virtual Memory
struct Page *pages;
pages = boot_alloc(npages * (sizeof(struct Page)));
                                        0x0fffffff
                                         256MB
page_init


                           pages
                        kern_pgdir      4KB
                           kernel      ?KB
                                       0x00100000
                           BIOS
                                       0x000A0000(IOPHYSMEM)

 page_free_list                        0x00000000
Virtual Memory

 page_alloc :
   get page from page_free_list
 page_free :
   return page to page_free_list
Virtual Memory
Linear address
10    10   12
                                   Physical address
                                      20       12
                                                      目前我們完
Dir Table Offset                     PPN     Offset
                                                      成了page的
                            1023      20      12

                                                      架構,但是
             20      12              PPN    Offset
   1023
                                                      未提供一個
                             0
            PPN    Offset            Page Table
                                                      外部使用的
    0
          Page Directory                                介面
Interface
  pte_t *
  pgdir_walk(pde_t *pgdir, const void *va, int create)
  {
      // Fill this function in
      //return NULL;
      pde_t *dir = &pgdir[PDX(va)];
      if(*dir & PTE_P){
          pte_t *table = (pte_t*) KADDR(PTE_ADDR(*dir));
          return &table[PTX(va)];
      }else{
          if(!create){
              return NULL;
          }
          struct Page *page_tmp = page_alloc(ALLOC_ZERO);
          if(!page_tmp){
              return NULL;
          }else{
              pte_t *table = (pte_t*) page2kva(page_tmp);
              *dir = PADDR(table) | PTE_P | PTE_W | PTE_U;
              page_tmp->pp_ref = 1;
              return &table[PTX(va)];
          }
      }
  }
Interface
 int
 page_insert(pde_t *pgdir, struct Page *pp, void *va, int perm)
 {
     // Fill this function in
     // return 0;
     if(!pp){
         return -E_NO_MEM;
     }
     pte_t *page_entry = pgdir_walk(pgdir, va, 1);
     if(!page_entry){
         return -E_NO_MEM;
     }
     pgdir[PDX(va)] |= perm;
     if(page2pa(pp) != PTE_ADDR(*page_entry)){
         page_remove(pgdir, va);
         pp->pp_ref++;
     }
     *page_entry = page2pa(pp) | perm | PTE_P;
     return 0;
 }
Interface

  struct Page *
  page_lookup(pde_t *pgdir, void *va, pte_t **pte_store)
  {
      // Fill this function in
      // return NULL;
      *pte_store = pgdir_walk(pgdir, va, 0);
      if(!(*pte_store) || !(**pte_store & PTE_P)){
          return NULL;
      }else{
          return pa2page(PTE_ADDR(**pte_store));
      }
  }
Interface

 void
 page_remove(pde_t *pgdir, void *va)
 {
      // Fill this function in
      pte_t *page_entry;
      struct Page *page = page_lookup(pgdir, va, &page_entry);
      if(page){
          page_decref(page);
      }
      *page_entry = 0;
      tlb_invalidate(pgdir, va);
 }
Thanks a lot.

Lab2

  • 1.
  • 2.
    Virtual Memory When we into protected mode Selector Software Segmentation Paging RAM Offset Virtual Linear Physical
  • 3.
    Virtual Memory Hencethe “selector” has no effect and the linear address always equals the offset of the virtual address. so, we only care .... Virtual Paging RAM address Linear Physical
  • 4.
    Virtual Memory Linearaddress Physical address 10 10 12 20 12 Dir Table Offset PPN Offset 1023 20 12 20 12 PPN Offset 1023 0 PPN Offset Page Table 0 Page Directory
  • 5.
    Virtual Memory 0x0fffffff 256MB Linear address 10 10 12 Extended Dir Table Offset Memory 0x00100000 BIOS ROM 4GB ROM VGA Display 0x000A0000 RAM 0x00000000
  • 6.
    Virtual Memory Linear address 10 10 12 Dir Table Offset pde_t *kern_pgdir; kern_pgdir = (pde_t *) PDX(va) boot_alloc(PGSIZE); 1023 20 12 PPN Offset 0 Page Directory
  • 7.
    Virtual Memory 0x0fffffff 256MB kern_pgdir 4KB Kernel ?KB 0x00100000 BIOS ROM ROM VGA Display 0x000A0000 RAM 0x00000000
  • 8.
    Virtual Memory Linear address 10 10 12 Dir Table Offset 1023 20 12 PDX(va) PTX(va) 20 12 PPN Offset 1023 0 PPN Offset Page Table 0 Page Directory
  • 9.
    Virtual Memory Linear address 10 10 12 struct Page *pages; Dir Table Offset static struct Page *page_free_list; 1023 20 12 PDX(va) PTX(va) 20 12 PPN Offset 1023 0 PPN Offset Page Table 0 Page Directory
  • 10.
    Virtual Memory 0x0fffffff 256MB page_init pages kern_pgdir 4KB kernel ?KB 0x00100000 BIOS 0x000A0000(IOPHYSMEM) page_free_list 0x00000000
  • 11.
    Virtual Memory struct Page*pages; pages = boot_alloc(npages * (sizeof(struct Page))); 0x0fffffff 256MB page_init pages kern_pgdir 4KB kernel ?KB 0x00100000 BIOS 0x000A0000(IOPHYSMEM) page_free_list 0x00000000
  • 12.
    Virtual Memory page_alloc: get page from page_free_list page_free : return page to page_free_list
  • 13.
    Virtual Memory Linear address 10 10 12 Physical address 20 12 目前我們完 Dir Table Offset PPN Offset 成了page的 1023 20 12 架構,但是 20 12 PPN Offset 1023 未提供一個 0 PPN Offset Page Table 外部使用的 0 Page Directory 介面
  • 14.
    Interface pte_t* pgdir_walk(pde_t *pgdir, const void *va, int create) { // Fill this function in //return NULL; pde_t *dir = &pgdir[PDX(va)]; if(*dir & PTE_P){ pte_t *table = (pte_t*) KADDR(PTE_ADDR(*dir)); return &table[PTX(va)]; }else{ if(!create){ return NULL; } struct Page *page_tmp = page_alloc(ALLOC_ZERO); if(!page_tmp){ return NULL; }else{ pte_t *table = (pte_t*) page2kva(page_tmp); *dir = PADDR(table) | PTE_P | PTE_W | PTE_U; page_tmp->pp_ref = 1; return &table[PTX(va)]; } } }
  • 15.
    Interface int page_insert(pde_t*pgdir, struct Page *pp, void *va, int perm) { // Fill this function in // return 0; if(!pp){ return -E_NO_MEM; } pte_t *page_entry = pgdir_walk(pgdir, va, 1); if(!page_entry){ return -E_NO_MEM; } pgdir[PDX(va)] |= perm; if(page2pa(pp) != PTE_ADDR(*page_entry)){ page_remove(pgdir, va); pp->pp_ref++; } *page_entry = page2pa(pp) | perm | PTE_P; return 0; }
  • 16.
    Interface structPage * page_lookup(pde_t *pgdir, void *va, pte_t **pte_store) { // Fill this function in // return NULL; *pte_store = pgdir_walk(pgdir, va, 0); if(!(*pte_store) || !(**pte_store & PTE_P)){ return NULL; }else{ return pa2page(PTE_ADDR(**pte_store)); } }
  • 17.
    Interface void page_remove(pde_t*pgdir, void *va) { // Fill this function in pte_t *page_entry; struct Page *page = page_lookup(pgdir, va, &page_entry); if(page){ page_decref(page); } *page_entry = 0; tlb_invalidate(pgdir, va); }
  • 18.