*参照元 [#s349cecf]
#backlinks

*説明 [#y52440fa]
-パス: [[linux-2.6.33/mm/memory.c]]

-FIXME: これは何?
--説明


**引数 [#n1a0f89f]
-struct task_struct *tsk
--
--[[linux-2.6.33/task_struct]]
-struct mm_struct *mm
--
--[[linux-2.6.33/mm_struct]]
-unsigned long start
--
-int nr_pages
--
-int write
--
-int force
--
-struct page **pages
--
--[[linux-2.6.33/page]]
-struct vm_area_struct **vmas
-
--[[linux-2.6.33/vm_area_struct]]


**返り値 [#fc697fcd]
-int
--


**参考 [#w3dda315]


*実装 [#s9e9b0c6]
 /**
  * get_user_pages() - pin user pages in memory
  * @tsk:	task_struct of target task
  * @mm:		mm_struct of target mm
  * @start:	starting user address
  * @nr_pages:	number of pages from start to pin
  * @write:	whether pages will be written to by the caller
  * @force:	whether to force write access even if user mapping is
  *		readonly. This will result in the page being COWed even
  *		in MAP_SHARED mappings. You do not want this.
  * @pages:	array that receives pointers to the pages pinned.
  *		Should be at least nr_pages long. Or NULL, if caller
  *		only intends to ensure the pages are faulted in.
  * @vmas:	array of pointers to vmas corresponding to each page.
  *		Or NULL if the caller does not require them.
  *
  * Returns number of pages pinned. This may be fewer than the number
  * requested. If nr_pages is 0 or negative, returns 0. If no pages
  * were pinned, returns -errno. Each page returned must be released
  * with a put_page() call when it is finished with. vmas will only
  * remain valid while mmap_sem is held.
  *
  * Must be called with mmap_sem held for read or write.
  *
  * get_user_pages walks a process's page tables and takes a reference to
  * each struct page that each user address corresponds to at a given
  * instant. That is, it takes the page that would be accessed if a user
  * thread accesses the given user virtual address at that instant.
  *
  * This does not guarantee that the page exists in the user mappings when
  * get_user_pages returns, and there may even be a completely different
  * page there in some cases (eg. if mmapped pagecache has been invalidated
  * and subsequently re faulted). However it does guarantee that the page
  * won't be freed completely. And mostly callers simply care that the page
  * contains data that was valid *at some point in time*. Typically, an IO
  * or similar operation cannot guarantee anything stronger anyway because
  * locks can't be held over the syscall boundary.
  *
  * If write=0, the page must not be written to. If the page is written to,
  * set_page_dirty (or set_page_dirty_lock, as appropriate) must be called
  * after the page is finished with, and before put_page is called.
  *
  * get_user_pages is typically used for fewer-copy IO operations, to get a
  * handle on the memory by some means other than accesses via the user virtual
  * addresses. The pages may be submitted for DMA to devices or accessed via
  * their kernel linear mapping (via the kmap APIs). Care should be taken to
  * use the correct cache flushing APIs.
  *
  * See also get_user_pages_fast, for performance critical applications.
  */
 int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
 		unsigned long start, int nr_pages, int write, int force,
 		struct page **pages, struct vm_area_struct **vmas)
 {
 	int flags = FOLL_TOUCH;
 
 	if (pages)
 		flags |= FOLL_GET;
 	if (write)
 		flags |= FOLL_WRITE;
 	if (force)
 		flags |= FOLL_FORCE;
 
-
--[[linux-2.6.33/FOLL_TOUCH]]
-
--[[linux-2.6.33/FOLL_GET]]
-
--[[linux-2.6.33/FOLL_WRITE]]
-
--[[linux-2.6.33/FOLL_FORCE]]

 	return __get_user_pages(tsk, mm, start, nr_pages, flags, pages, vmas);
-
--[[linux-2.6.33/__get_user_pages()]]

 }
 EXPORT_SYMBOL(get_user_pages);
-ライセンスに関係なくシンボルを公開する。
--[[linux-2.6.33/EXPORT_SYMBOL()]]


*コメント [#g74a94be]

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