从内核空间访问用户空间 - get_user_pages
我想将指针从用户空间内存传递到内核模块中的函数中。我不想使用 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
转换并传递到我的内核模块函数中?或者也许我必须以某种方式使用这些结构页面
? - 为什么我必须使用向下/向上读取?
- 毕竟我必须使用
SetPageDirty()
和page_cache_release()
函数吗?
I'd like pass a pointer from a user space memory into a function in my kernel module. I don't want to use copy_from_user
. I've read that I should use get_user_pages
function.
For example one page.
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
is an address in User Space.
- After doing this, am I allowed to cast and pass
uaddr
into my kernel module function? Or maybe I have to use thesestruct pages
in some way? - Why do I have to use down/up read?
- After everything do I have to use
SetPageDirty()
andpage_cache_release()
functions ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这不是
get_user_pages
的用途(而且不 - 你不能直接将uaddr
强制转换并传递到内核模块函数中)。如果您不想在调用函数中调用
copy_from_user
,则只需将void __user *
传递给您的模块函数并让它执行此操作copy_from_user
。This is not what
get_user_pages
is for (and no - you can't then just cast and passuaddr
into your kernel module function).If you don't want to call
copy_from_user
in the calling function, then just pass avoid __user *
to your module function and have it do thecopy_from_user
.您只能将用户页面用于页面类型活动,例如将 Scatter/Gather DMA 设置到用户空间内存中。您不能使用它从内核模式代码直接访问用户空间。因此,copy_to/from 函数就是出于这个原因而存在的。除非您要移动大量数据,否则为什么不使用这些功能呢?
You can only use the user pages for page type activity, for example setting up Scatter/Gather DMA into userspace memory. You cannot use it to directly access user space from kernel mode code. Hence the copy_to/from functions that are there for that reason. Unless your moving large amounts of data why not use these functions?
获得有效的用户空间地址后,使用 get_user_pages 来获取 struct page 指针。一旦收到结构页指针,要在内核模式下访问它,您必须使用 kmap 将其映射到内核虚拟地址。希望有帮助
Once you get the valid user space address, use get_user_pages to get the struct page pointer. once struct page pointer received , to access it in the kernel mode you have to map it to kernel virtual address by using kmap. hope that helps