【问题标题】:Direct access user memory from kernel on Linux在 Linux 上从内核直接访问用户内存
【发布时间】:2012-12-28 11:30:45
【问题描述】:

我有一个用户模式进程和内核模块。现在我想从内核读取用户模式进程的某些区域,但有一个问题:没有用户模式内存的复制和 VA 的简单访问。 所以我们有:目标进程的task_struct、其他相关结构(如mm_struct、vma_struct)和我想读取的虚拟地址(如0x0070abcd),或者更确切地说以某种方式映射到我的内核模块。

我可以使用 get_user_pages 获取所需内存区域的页面列表,但接下来呢?我应该以某种方式将页面映射到内核中,然后尝试将它们作为连续内存区域读取还是有更好的解决方案?

【问题讨论】:

  • 不是一个答案,因为我目前无法验证细节,但我建议你看看mm/memory.caccess_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


【解决方案1】:

问题是“查看”用户空间需要锁定大量内容。因此,最好做一个简短的副本,而不是将所有内容锁定任意时间。您的用户空间进程可能没有被 VM 映射到当前 CPU。事实上,它可能会被完全换出到磁盘,在另一个 CPU 上运行,在它自己的内核调用中,等等。

Linux Kernel: copy_from_user - struct with pointers

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 2011-12-15
    • 2010-10-13
    • 1970-01-01
    • 2018-06-30
    • 2015-07-08
    • 1970-01-01
    • 2018-05-22
    相关资源
    最近更新 更多