Как работает deallocuvm в Xv6? - PullRequest
0 голосов
/ 27 апреля 2018

По комментариям в исходном коде deallocate освобождает пользовательские страницы, чтобы довести размер процесса от oldsz до newsz

Мой вопрос: когда pte не существует, он должен продолжить поиск записи каталога следующей страницы, но почему PGADDR (PDX (a) + 1, 0, 0) должен быть минус PGSIZE здесь.

 if(!pte)
          a = PGADDR(PDX(a) + 1, 0, 0) - PGSIZE;

Вот исходный код Xv6:

int
deallocuvm(pde_t *pgdir, uint oldsz, uint newsz)
{
  pte_t *pte;
  uint a, pa;

  if(newsz >= oldsz)
    return oldsz;

  a = PGROUNDUP(newsz);
  for(; a  < oldsz; a += PGSIZE){
    pte = walkpgdir(pgdir, (char*)a, 0);
    // pte not exists to next page table dir
    // do not understand why should minus PGSIZE
    if(!pte)
      a = PGADDR(PDX(a) + 1, 0, 0) - PGSIZE;
    // pte exists
    else if((*pte & PTE_P) != 0){
      pa = PTE_ADDR(*pte);
      if(pa == 0)
        panic("kfree");
      char *v = P2V(pa);
      kfree(v);
      *pte = 0;
    }
  }
  return newsz;
}

1 Ответ

0 голосов
/ 27 апреля 2018

Цикл for делает a += PGSIZE. И он делает это каждый раз, когда цикл повторяется.

Если PGSIZE не вычитается при переходе к следующему PDE, то a будет отключено PGSIZE элементами на следующей итерации.

...