【发布时间】:2012-12-28 11:30:45
【问题描述】:
我有一个用户模式进程和内核模块。现在我想从内核读取用户模式进程的某些区域,但有一个问题:没有用户模式内存的复制和 VA 的简单访问。 所以我们有:目标进程的task_struct、其他相关结构(如mm_struct、vma_struct)和我想读取的虚拟地址(如0x0070abcd),或者更确切地说以某种方式映射到我的内核模块。
我可以使用 get_user_pages 获取所需内存区域的页面列表,但接下来呢?我应该以某种方式将页面映射到内核中,然后尝试将它们作为连续内存区域读取还是有更好的解决方案?
【问题讨论】:
-
不是一个答案,因为我目前无法验证细节,但我建议你看看
mm/memory.c,access_process_vm的实现。 -
看起来 access_process_vm 调用了 copy_from_user_page。我不想复制用户空间页面,除非它是唯一可用的解决方案。
-
copy_from_user_page在大多数情况下似乎是一个简单的memcpy(),一些架构/平台实现似乎首先处理 D/I 缓存。除非您知道自己在 x86 或类似设备上运行,否则我建议您谨慎行事。 -
这是
Robert Love的类似问题的回答,Linux Kernel Development的作者:quora.com/Linux-Kernel-How-does-copy_to_user-work
标签: linux memory memory-management kernel