что делает освобождение функции в функции распределения xv6 - PullRequest
0 голосов
/ 22 мая 2019

в случаях 1 и 2, что делает функция освобождения в функции распределения?

case 1: if(mem == 0) 

// does this condition mean physical memory has not space? 

case 2:  if(mappages(pgdir, (char*)a, PGSIZE, V2P(mem), PTE_W|PTE_U) < 0)

// does this condtion mean pagetable entry has not allocate in physical memory?

Я прикрепил функцию освобождения и функцию распределения.

ссылка: https://github.com/fernandabonetti/xv6/blob/master/vm.c

  int
     allocuvm(pde_t *pgdir, uint oldsz, uint newsz)
    {
      char *mem;
      uint a;

      if(newsz >= KERNBASE)
        return 0;
      if(newsz < oldsz)
        return oldsz;


       a = PGROUNDUP(oldsz);
       for(; a < newsz; a += PGSIZE){
        mem = kalloc();
        if(mem == 0){
      cprintf("allocuvm out of memory\n");
          deallocuvm(pgdir, newsz, oldsz);
      return 0;
    }
    memset(mem, 0, PGSIZE);
    if(mappages(pgdir, (char*)a, PGSIZE, V2P(mem), PTE_W|PTE_U) < 0){
      cprintf("allocuvm out of memory (2)\n");
      deallocuvm(pgdir, newsz, oldsz);
      kfree(mem);
      return 0;
    }
  }
  return newsz;
}


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);
    if(!pte)
      a = PGADDR(PDX(a) + 1, 0, 0) - PGSIZE;
    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 Ответ

1 голос
/ 24 мая 2019

allocuvm не хватает для выделения виртуальной памяти пользователя.Эта функция отвечает за увеличение виртуальной памяти пользователя в определенном каталоге страниц.Действительно, есть 2 случая, когда эта функция может выйти из строя:

Случай 1: сбой функции kalloc.kalloc - это сокращение от выделения ядра.Эта функция отвечает за возврат адреса новой, в настоящее время неиспользуемой страницы в оперативной памяти.Если он возвращает 0, это означает, что в настоящее время нет доступных неиспользуемых страниц.

Случай 2: сбой функции mappages.Эта функция отвечает за то, чтобы новая выделенная страница была доступна для процесса, который использует данный каталог страниц, путем сопоставления этой страницы со следующим виртуальным адресом, доступным в каталоге страниц.Если эта функция дает сбой, это означает, что она потерпела неудачу при этом, возможно, из-за того, что каталог страницы уже заполнен.

В обоих случаях allocuvm не удалось увеличить память пользователя до запрошенного размера, поэтому онаотменяет все выделения до точки сбоя, поэтому виртуальная память остается неизменной и возвращает ошибку самостоятельно.

...