代码之家  ›  专栏  ›  技术社区  ›  Georg Schölly Crazy Developer

如何在linux内核中映射文件?

  •  0
  • Georg Schölly Crazy Developer  · 技术社区  · 7 年前

    我在linux内核中使用kprobes挂接一些系统调用。在此期间,我希望使用 mmap .

    不可能在内核中使用系统调用,但通常还有其他方法。(例如。 sys_open vs。 vfs_read ).

    这可能吗?如果可能,怎么可能?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Tsyvarev    7 年前

    据我所知 mmap() 无法从内核空间使用。

    当一个人可以成功呼叫 do_mmap() 或类似情况下,函数返回 用户空间地址 哪一个 内核不能直接使用 . 从内核访问用户空间内存的唯一正确方法是 copy_to_user / copy_from_user . 但使用这些函数意味着 复制 ,所以 mmap() (与相比 read() )已丢失。


    用于的功能 读取() 在内核中, set_fs(KERNEL_DS) 该技术可用于掩码指针 内核空间 ,作为指向 用户空间 所以 将\u复制到\u用户 工作正常。

    但是有 mmap() 一个已经扭转了问题:他需要与 用户空间 指针,从函数返回,如指向 内核空间 . 这不能用正常的方法来实现。

    尝试取消引用指向尚未映射的用户空间区域的指针可能会导致内核崩溃。以及大多数 mmap() 实现实际上返回未映射的内存,该内存打算映射到第一页错误上。