【问题标题】:How to invoke any kernel function?如何调用任何内核函数?
【发布时间】:2016-04-30 20:31:36
【问题描述】:

我知道 Kprobes 可以用来探测任何内核函数。但是翻阅它的文件后,我意识到它主要是一种被动实体。它只是将一个探针放在执行序列的中间。

但是如果我想直接调用任何内核函数而不关心执行顺序怎么办。

我怎样才能做到这一点?

更新

注意:我想在我的内核模块中调用任何内核函数,而不是从任何用户空间应用程序。

【问题讨论】:

  • I want to invoke any kernel function inside my kernel module - 所以,就这么做吧。在内核模块内部调用内核函数有什么问题?
  • 我可以只调用任何内核函数而不在我的模块中包含与该函数相关的任何头文件吗?
  • 是的..但你可能叫错了
  • 这里是帮助:tldp.org/LDP/lkmpg/2.6/html/lkmpg.html 这解释了有关编写 Linux 内核模块的大部分内容并提供了示例。

标签: linux linux-kernel kprobe


【解决方案1】:

不能简单地从用户空间中的应用程序调用内核函数。系统调用是用户空间中唯一可以请求内核服务的函数。

要直接调用内核函数,如果你对内核编程感兴趣,你必须实现一个内核模块。 This 是一个起点。

编辑


由于您已经指定要从模块中调用内核函数,所以完全没有问题。只需按照我在上面发布的链接获取文档即可。

【讨论】:

  • 是的,我只构建一个内核模块。因此,如果我想从我的模块中调用任何其他内核函数,我将如何实现呢?我知道用户空间应用程序不能直接调用内核函数。
  • 我明白了,我猜 Kprobes 已经实现用于内核模块,不是吗?我尝试重新表述我的答案。
【解决方案2】:

如果我想直接调用任何内核函数怎么办

至少不是所有的函数都可以直接使用。

在您的案例中调用内核函数时请考虑以下几点。

  • 不同模块的内核函数只有在使用EXPORT_SYMBOL系列宏导出时才能使用。
  • static 函数不能直接在该文件之外使用。

示例

函数定义(i2c_smbus_read_byte_data)
http://lxr.free-electrons.com/source/drivers/i2c/i2c-core.c#L2689

在这里使用
http://lxr.free-electrons.com/source/drivers/i2c/i2c-core.c#L350

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    相关资源
    最近更新 更多