*参照元 [#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]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS