4

ドライバーでの mmap 操作を理解しようとしています。mmap を行っている理由はわかっています。mmap の次の 2 つの実装と混同しています。

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 番目の例は変更します。

では、2番目のアプローチの根拠は何ですか。最初の例も適切に機能します。

4

1 に答える 1

2

2 番目の例は、要求されたすべてのページを単純にマップします。

最初の例は、どのページもすぐにはマップしません。ユーザー空間アプリケーションがこれらのページの 1 つにアクセスしようとすると、ページ フォールトが発生し、ページ フォールト ハンドラー ( .fault) がmmap_vm_opsそのページを実際にマップする必要があります。ほとんどのページが実際にはアクセスされないと推定される場合、および実際のマッピングに多くの時間またはメモリが必要な場合、これは理にかなっています。

于 2015-05-06T08:32:22.373 に答える