В функции do_mmap поясните мне приз следующее: [code=c] addr = get_unmapped_area(file, addr, len, pgoff, flags); if (addr & ~PAGE_MASK) return addr;/code] нет ведь никакой гарантии что get_unmapped_area вернет адрес выровненный по границе страницы (типа вот она:) [code=c] ... for (vma = find_vma(mm, addr); ; vma = vma->vm_next) {
if (TASK_SIZE - len < addr) { if (start_addr != TASK_UNMAPPED_BASE) { start_addr = addr = TASK_UNMAPPED_BASE; goto full_search; } return -ENOMEM; } if (!vma || addr + len <= vma->vm_start) { mm->free_area_cache = addr + len; return addr; } addr = vma->vm_end; }[/code] и никакой гарантии что этот vma->vm_end выровнен нет.
После вызова get_unmapped_area как понимать следующий код: [code=c] munmap_back: vma = find_vma_prepare(mm, addr, &prev, &rb_link, &rb_parent); if (vma && vma->vm_start < addr + len) { if (do_munmap(mm, addr, len)) return -ENOMEM; goto munmap_back; }[/code] иными словами с чего бы вдруг найденная область начала перекрываться с другими (вроде как get_unmapped_area это исключает).
Заранее спасибо за внимание.