使用LKM实现Linux系统调用

abh*_*bhi 5 system-calls kernel-module linux-kernel

我试图向Linux内核3.2.x添加新的系统调用。在Internet上搜索有用的参考资料时,我有一个印象,就是无法像将SO那样实现将系统调用作为可加载模块来实现吗?是否可以通过LKM添加系统调用?

我找到了另一个链接,上面写着“有一种添加系统调用而无需使用模块作为包装器重新编译内核的方法,但这超出了本文档的范围”。来源http://hekimian-williams.com/?p=20

我知道静态实现系统调用将要求我每次进行任何更改时都编译内核代码。有没有上述博客中指定的一种方法,我可以将其实现为模块。

对该方向的任何建议或指示,我们将不胜感激。

Ily*_*kov 5

  1. 定位 sys_call_table/ia32_sys_call_table
  2. 制作副本并根据需要修改它(让它成为my_sys_call_table
  3. 找到system_call条目(这个和其他的)
  4. 表大小改变时修改NR_syscalls比较指令
  5. system_call处的sys_call_table引用修改为指向:my_sys_call_table

    500        call *sys_call_table(,%eax,4)
          ->
    500        call *my_sys_call_table(,%eax,4)
    
    Run Code Online (Sandbox Code Playgroud)
  6. 利润?

玩得开心 :)

  • @abhi:注意`system_call` 在`.text` 段中并且是RO。您需要找到一种写入只读内核内存的方法。另外,请注意,在 SMP 系统的情况下,写入必须是原子操作。`Profit?` 表示从第 6 步开始,您将获得利润 :) (2认同)