有没有办法从linux内核模块调用用户空间函数?

时间:2017-12-27 15:40:08

标签: linux-kernel operating-system system-calls kernel-module protected-mode

想象一下这样的情况:我将从系统调用中获取位于用户空间中的函数指针,并且内核模块将回调此函数。 (此功能在用户空间中运行非常重要) kenel模块是否会看到与用户空间应用程序相同的内存地址(获取的函数指针)? (我的意思是用户的虚拟地址空间或线路地址空间)

1 个答案:

答案 0 :(得分:2)

首先,你正试图做错事。如果您需要内核中的自定义代码,请将其作为内核模块提供。

链接副本(Executing a user-space function from the kernel space)中的答案很大程度上是废话。只要没有使用系统调用并且没有使用tls /其他任何东西,这将在某些体系结构上“起作用”。事实上,这就是大量漏洞利用的方式。

  

我将从一个位于用户空间的函数指针   一个系统调用,内核模块回调这个函数。

听起来你真的想要做一些倒退的事情。如果您需要一个用户空间组件,那就应该拥有所有逻辑。然后你调用内核告诉它该做什么。

  

(此功能在用户空间中运行很重要吗?)

你问的是谁?我只能声明调用由用户空间种植的函数并不意味着它开始“在用户空间中运行”。切换到用户空间是很多工作,绝对不是通过调用函数来完成的。

  

kenel模块是否会看到与用户空间应用程序相同的内存地址(获取的函数指针)?

取决于架构,通常会。但即使这样,使用这个“功能”的硬件保护也必须明确关闭。

但同样,你不想这样做。我强烈建议你陈述实际问题。