Linux kernel 用LKM实现Linux系统调用

Linux kernel 用LKM实现Linux系统调用,linux-kernel,system-calls,kernel-module,Linux Kernel,System Calls,Kernel Module,我试图向linux内核3.2.x添加一个新的系统调用。 在互联网上搜索有用的参考资料时,我有一个印象,即实现系统调用作为一个可加载的模块是不可能的 我发现了另一个链接,上面写着“有一种方法可以添加系统调用,而无需使用模块作为包装器重新编译内核,但这超出了本文的范围”。 来源 我知道静态实现系统调用需要我在每次进行任何更改时编译内核代码。在上面提到的博客中有没有一种方法可以让我把它作为一个模块来实现 我们非常感谢您在这个方向上的任何建议或指点 找到系统调用表/ia32系统调用表 制作一份副本,并根

我试图向linux内核3.2.x添加一个新的系统调用。 在互联网上搜索有用的参考资料时,我有一个印象,即实现系统调用作为一个可加载的模块是不可能的

我发现了另一个链接,上面写着“有一种方法可以添加系统调用,而无需使用模块作为包装器重新编译内核,但这超出了本文的范围”。 来源

我知道静态实现系统调用需要我在每次进行任何更改时编译内核代码。在上面提到的博客中有没有一种方法可以让我把它作为一个模块来实现

我们非常感谢您在这个方向上的任何建议或指点

  • 找到系统调用表/ia32系统调用表
  • 制作一份副本,并根据需要修改它(让它成为我的系统调用表)
  • 找到条目(此条目和其他条目)
  • 修改
    NR\u syscalls
    compare以防表大小更改
  • 修改
    sys\u call\u table
    参考至
    my\u sys\u call\u table

    500        call *sys_call_table(,%eax,4)
          ->
    500        call *my_sys_call_table(,%eax,4)
    
  • 利润

  • 玩得开心:)

    您能用设备驱动程序模型来解决您的问题吗?使用开放字符设备,您可以使用read()、write()、ioctl()等从用户空间到内核空间进行通信。结果会更便于携带。@Peter是的,这可以通过以下方式完成:我正在寻找这个解决方案,因为我正在努力学习这个。你知道博客里的这个家伙在说什么吗。。thanks@llya谢谢你的答复。。我将努力实施你的建议。但是在第6点中,你所说的利润是什么意思?。。thanks@abhi:请注意,
    system\u call
    位于
    .text
    段中,是RO。您需要找到一种写入只读内核内存的方法。另外,请注意,对于SMP系统,写操作必须是原子操作<代码>利润?表示从第6步开始,您将获得利润:)