*参照元 [#d33f59d5] #backlinks *説明 [#c1df3af1] -パス: [[linux-2.6.33/drivers/uio/uio.c]] -FIXME: これは何? --説明 **引数 [#veb35a33] -struct file *filep -- --[[linux-2.6.33/file]] -struct vm_area_struct *vma -- --[[linux-2.6.33/vm_area_struct]] **返り値 [#ded9c0fa] - -- **参考 [#pa122d58] *実装 [#b326cc58] static int uio_mmap(struct file *filep, struct vm_area_struct *vma) { struct uio_listener *listener = filep->private_data; -filep->private_data への設定は uio_open() にて行っている。 -指定されたファイルディスクリプタに記録させておいた、 UIO のリスナ情報(UIO のデバイス情報を含む)得る。 -参考: filep->private_data への UIO デバイス情報の設定は uio_open() にて行っている。 --[[linux-2.6.33/uio_listener]] --[[linux-2.6.33/uio_open()]] struct uio_device *idev = listener->dev; - -UIO のデバイス情報を得る。 --[[linux-2.6.33/uio_device]] int mi; unsigned long requested_pages, actual_pages; int ret = 0; if (vma->vm_end < vma->vm_start) return -EINVAL; vma->vm_private_data = idev; -メモリマップに、メモリマップと関連のある UIO のデバイス情報を記憶させる。 mi = uio_find_mem_index(vma); if (mi < 0) return -EINVAL; - --[[linux-2.6.33/uio_find_mem_index()]] requested_pages = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; actual_pages = ((idev->info->mem[mi].addr & ~PAGE_MASK) + idev->info->mem[mi].size + PAGE_SIZE -1) >> PAGE_SHIFT; if (requested_pages > actual_pages) return -EINVAL; if (idev->info->mmap) { ret = idev->info->mmap(idev->info, vma); return ret; } -ユーザが独自に mmap() を定義していれば、ユーザの mmap() を呼び出す。 switch (idev->info->mem[mi].memtype) { case UIO_MEM_PHYS: return uio_mmap_physical(vma); case UIO_MEM_LOGICAL: case UIO_MEM_VIRTUAL: return uio_mmap_logical(vma); default: return -EINVAL; } - --[[linux-2.6.33/uio_mmap_physical()]] - --[[linux-2.6.33/uio_mmap_logical()]] } *コメント [#q1fbf337]