Что делает функция освобождения в функции распределения xv6

в случаях 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;
}
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
747
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

allocuvm — это сокращение от Allocate User Virtual Memory. Эта функция отвечает за увеличение виртуальной памяти пользователя в определенном каталоге страниц. Действительно, есть 2 случая, когда эта функция может дать сбой:

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

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

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

Другие вопросы по теме