我想将指针从用户空间内存传递到我的内核模块中的函数。我不想使用copy_from_user
。我已经读过我应该使用get_user_pages
函数。
例如一页。
struct page **pages;
pages = kmalloc(1 * sizeof(*pages), GFP_KERNEL);
down_read(¤t->mm->mmap_sem);
get_user_pages(current,current->mm,uaddr, 1, 1, 0,pages,NULL);
up_read(¤t->mm->mmap_sem);
uaddr
是用户空间中的地址。
uaddr
转换为内核模块函数?或者我可能必须以某种方式使用这些struct pages
?SetPageDirty()
和page_cache_release()
函数?答案 0 :(得分:2)
这不是get_user_pages
的用途(并且没有 - 你不能只是将uaddr
转换并传递给你的内核模块函数。)
如果您不想在调用函数中调用copy_from_user
,那么只需将void __user *
传递给您的模块函数并让它执行copy_from_user
}。
答案 1 :(得分:2)
您只能将用户页面用于页面类型活动,例如将Scatter / Gather DMA设置为用户空间内存。您无法使用它直接从内核模式代码访问用户空间。因此,copy_to / from出于那个原因的函数。除非你移动大量数据为什么不使用这些功能?
答案 2 :(得分:2)
答案 3 :(得分:0)
获得有效的用户空间地址后,使用get_user_pages获取struct page指针。一旦接收到struct page指针,要在内核模式下访问它,您必须使用kmap将其映射到内核虚拟地址。希望有所帮助