*参照元 [#f526a3a3] #backlinks *説明 [#ra242583] -パス: [[linux-2.6.33/drivers/uio/uio.c]] -FIXME: これは何? --説明 **引数 [#ye6d66a5] -struct vm_area_struct *vma -- --[[linux-2.6.33/vm_area_struct]] -struct vm_fault *vmf -- --[[linux-2.6.33/vm_fault]] **返り値 [#t282ca0f] -int -- **参考 [#cac85d9a] *実装 [#ydc7695b] static int uio_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf) { struct uio_device *idev = vma->vm_private_data; - -メモリマップに関連付けられている UIO のデバイス情報を取得する。 -参考: uio_mmap() にて vm_private_data への設定を行っている。 --[[linux-2.6.33/uio_device]] --[[linux-2.6.33/uio_mmap()]] struct page *page; - --[[linux-2.6.33/page]] unsigned long offset; int mi = uio_find_mem_index(vma); if (mi < 0) return VM_FAULT_SIGBUS; - --[[linux-2.6.33/uio_find_mem_index()]] /* * We need to subtract mi because userspace uses offset = N*PAGE_SIZE * to use mem[N]. */ offset = (vmf->pgoff - mi) << PAGE_SHIFT; if (idev->info->mem[mi].memtype == UIO_MEM_LOGICAL) page = virt_to_page(idev->info->mem[mi].addr + offset); else page = vmalloc_to_page((void *)idev->info->mem[mi].addr + offset); - --[[linux-2.6.33/virt_to_page()]] - --[[linux-2.6.33/vmalloc_to_page()]] get_page(page); - --[[linux-2.6.33/get_page()]] vmf->page = page; return 0; } *コメント [#bd3c5449]