По комментариям в исходном коде 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;
}