使用LKM实现Linux系统调用

5
我试图将一个新的系统调用添加到Linux内核3.2.x中。在搜索有用的参考资料时,我有个印象,即使用可加载模块实现系统调用是不可能的,如SO问题Is it possible to add a system call via a LKM?所述。
我找到了另一个链接,上面说:“有一种方法可以在不重新编译内核的情况下使用模块添加系统调用,但这超出了本文档的范围。”来源:http://hekimian-williams.com/?p=20 我知道静态实现系统调用需要每次更改都要编译内核代码。如上述博客所述,是否有一种方式可以将它实现为模块。
非常感谢任何建议或指向的方向。

1
你能否考虑使用设备驱动程序模型来解决问题呢?通过打开字符设备,你可以使用read()、write()、ioctl()等函数,在用户空间与内核空间之间进行通讯。这种方式会使得结果更加便携。 - Peter
@Peter 是的,这是可以做到的。我正在寻找这个解决方案,因为我正试图学习这个。你有没有想法这个博客里的人在说什么..谢谢。 - abhi
1个回答

5
  1. Locate sys_call_table/ia32_sys_call_table
  2. Make a copy and modify it as you wish (let it be my_sys_call_table)
  3. Locate system_call entry (this one and others)
  4. Modify NR_syscalls compare instruction in case of table size has changed
  5. Modify sys_call_table reference at system_call to point to my_sys_call_table:

    500        call *sys_call_table(,%eax,4)
          ->
    500        call *my_sys_call_table(,%eax,4)
    
  6. Profit?

玩得开心 :)


@llya,感谢您的回复。我会尝试实施您的建议。但是在第6点中,您所说的“Profit”是什么意思?谢谢。 - abhi
2
@abhi:请注意,system_call位于.text段中且为只读。您需要找到一种方法来写入只读内核的内存。此外,请注意,在SMP系统的情况下,写操作必须是原子操作。Profit?意味着从第6步开始,您将获得利润 :) - Ilya Matveychikov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接