вопрос про функцию arch_get_unmapped_area в управлении памятью (linux) - PullRequest
3 голосов
/ 13 апреля 2011

в книге http://www.ecsl.cs.sunysb.edu/elibrary/linux/mm/mm.pdf страница 202 ~ 203

if (addr) {
   addr = PAGE_ALIGN(addr);
   vma = find_vma(current->mm, addr);
   if (TASK_SIZE - len >= addr &&
   (!vma || addr + len <= vma->vm_start))
   return addr;
}

Если addr не равен нулю, мы выравниваем его по границе страницы. Мы называем функцию найти vma (), чтобы увидеть, содержится ли данный адрес в существующем VMA. Если он не содержится ни в одном VMA, и конец отображения находится в пределах Обрабатываем адресное пространство, возвращаем адрес.

Мой вопрос:
почему мы проверяем addr + len <= vma-> vm_start?
как это возможно addr + len <= vma-> vm_start? если в vma найден addr, то addr> vm_start, верно? если len положительно (должно быть, верно), как же addr + len <= vma-> vm_start?

1 Ответ

1 голос
/ 13 апреля 2011

Ответ станет понятен, если вы посмотрите на замечание в источнике find_vma:

/ * Найдите первый VMA, который удовлетворяет addr

Итак, find_vma () может вернуть vma, которая на самом деле не отображает адрес, поэтому проверка.

...