【问题标题】:Adding a system call with a kernel module(LKM) [duplicate]使用内核模块(LKM)添加系统调用 [重复]
【发布时间】:2016-07-20 17:30:16
【问题描述】:

所以我看到了一堆关于添加系统调用的问题,但我找不到任何使用 LKM 的示例。我找到了这样的资源:@​​987654321@ 这在理论上可行,但无法编译。谁能指出一个简单的例子来添加一个hello world系统调用或其他东西。像这样的东西:https://tssurya.wordpress.com/2014/08/19/adding-a-hello-world-system-call-to-linux-kernel-3-16-0/ 不需要我重新编译我的内核?

【问题讨论】:

    标签: c linux kernel system-calls kernel-module


    【解决方案1】:

    一般来说,强烈建议不要实现一个全新的系统调用。

    相反,只实现一个新的ioctl 和可能一些新的块或字符设备。

    对于如何做到,看来已经有另一个问题/答案了:How do I use ioctl() to manipulate my kernel module?

    【讨论】:

    • 我不认为你对如何使用这些东西有一些直觉?我找到了一个示例:tldp.org/LDP/lkmpg/2.6/html/x892.html,但我不确定您将如何使用 ioctl。因此,您可以 mknod 设备驱动程序,然后通过 category 读取它。你用 ioctl 做什么?
    • 我想我应该重新定义我的问题。假设我想添加一个系统调用,它将返回有关当前正在运行的进程的数据。所以我会给它传递一个 pid,它会返回父 pid、开始时间等内容。ioctl 会调用一个读取,它会找到该信息吗?要不然是啥?我很难理解这种设置是如何工作的。
    【解决方案2】:

    我认为你不能用一个模块来做到这一点。系统调用的定义进入两个在运行时无法真正更改的地方(据我所知):系统调用表(为每个架构分配编号)和系统调用包含文件(与内核本身一起安装,而不是模块)。 (或者至少不会在运行时重写代码。)

    在这种情况下,您总是需要重新编译内核。但是如果你想有一个快速的更新/尝试周期,你可以实现一个只是一个存根的系统调用,如果它被加载,则将一条消息传递给正确的模块。它允许您更改实现,但不能更改签名。

    【讨论】:

      猜你喜欢
      • 2013-09-25
      • 2011-01-24
      • 2016-08-26
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 2013-04-25
      相关资源
      最近更新 更多