Операция драйвера mmap Создание таблицы страниц

Я пытаюсь понять операцию Mmap в драйвере. Я знаю, почему мы делаем mmap. Меня смущают следующие 2 реализации mmap:

int my_mmap(struct file *filp, struct vm_area_struct *vma)
{
    vma->vm_ops = &mmap_vm_ops;
    vma->vm_flags |= VM_RESERVED;
    /* assign the file private data to the vm private data */
    vma->vm_private_data = filp->private_data;
    mmap_open(vma);
    return 0;
}

а также

static int simple_remap_mmap(struct file *filp, struct vm_area_struct *vma)
{
    if (remap_pfn_range(vma, vma->vm_start, vm->vm_pgoff,
                vma->vm_end - vma->vm_start,
                vma->vm_page_prot))
        return -EAGAIN;

    vma->vm_ops = &simple_remap_vm_ops;
    simple_vma_open(vma);
    return 0;
}

Первый пример представляет собой простую реализацию, которая не изменяет таблицы страниц, а 2-й делает.

Так в чем же обоснованность второго подхода. 1-й пример также работает правильно.

1 ответ

Решение

Второй пример просто отображает все запрошенные страницы.

Первые примеры не сразу отображают любую страницу. Когда приложение пользовательского пространства пытается получить доступ к одной из этих страниц, происходит сбой страницы, и обработчик ошибок страницы (.fault) в mmap_vm_ops Затем необходимо на самом деле отобразить эту страницу. Это имеет смысл, если вы подсчитаете, что к большинству страниц фактически не будет доступа, и если фактическое отображение занимает слишком много времени или памяти.

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