【问题标题】:copying data from user app to kernel driver via memcpy通过 memcpy 将数据从用户应用程序复制到内核驱动程序
【发布时间】:2019-03-08 19:56:43
【问题描述】:

好的,我会让事情变得简单,我如何使用共享内存将数据从我的用户模式应用程序发送和接收到我的内核驱动程序。用一个实际的互斥体来指示我的请求是否完成。以及我如何调用读取内存函数而不将其添加到 Major_irp 函数,因为我不想添加任何 IOCTL 代码

【问题讨论】:

    标签: c kernel memcpy irp


    【解决方案1】:

    以下假设是 *nix 风格的内核,但同样的概念也适用于 Windows。不过,其他操作系统内核可能采用不同的概念:

    在您的代码中实现mmap 系统调用以将内核端分配的内存映射到用户空间。或者只是实现readwrite 系统调用直接从用户空间内存读/写。

    特别是 Linux:如果您想异步访问用户空间内存,请使用 vmsplice 和标志 SPLICE_F_GIFT。像互斥锁或信号量这样的同步原语通常不会跨越用户空间/内核空间边界,如果你想异步操作,你必须实现poll文件操作,当“文件”操作完成时向用户空间发出信号.

    【讨论】:

    • 我正在尝试用 windows 来做。我也看到我可以用 writefile , readfile 做所有事情,但我真的很想看一个关于如何与共享内存一起工作的例子,但我找不到,也用 memcpy 复制东西
    • @Frankoo:每当您跨越用户空间/内核空间边界时,都必须采取一些预防措施以确保安全。本质上,当在内核空间中时,您仍然处于所处上下文的进程的地址空间中,此外,您还可以合法地访问内核空间地址。所以“共享内存”的整个概念有点不必要。您只需“访问”它,尽管通过特定访问是安全的辅助函数/宏(即进入映射区域,设置读/写页面标志,并且遵守内存域围栏(NUMA))。
    • 我想要做的基本上是从内核驱动程序读取/写入内存并将数据发送回我的用户模式应用程序所以这就是我想要做的 1-从我的使用 memcpy 的用户模式到我的共享部分,从那里我可以使用我的 readsharedmemory 函数从内核读取它,但问题是我想不出没有 IOCTL 代码的实现方法。我会给你一个例子,如果你能告诉我如何在不需要 IOCTL 代码github.com/Zer0Mem0ry/KernelBhop这个驱动程序的情况下实现它
    • 任何提示?忘记在上面标记你了^^
    • @Frankoo:我不想在这里偏离轨道,但我想知道它到底是什么,你首先想做什么。现在我们正在讨论数据传输(即解决问题 X),但很可能您希望进行数据传输以解决另一个问题 Y。那个问题“Y”到底是什么?因为可能有一种更优雅的方式来解决它。
    猜你喜欢
    • 2019-10-12
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2016-04-25
    相关资源
    最近更新 更多