我想通过LKM添加一个新的系统调用,但我不知道该怎么做。也就是说,我知道如果我想添加一个全新的系统调用,我可以查看sys_call_table并找到sys_ni_syscall
并只是替换它,但我很好奇是否可以实际添加到sys_call_table
。我意识到它可能不可能,因为它是一个固定大小的数组,但我想知道是否有任何其他聪明的方法来添加系统调用而不覆盖未使用的系统调用号。
答案 0 :(得分:4)
这是一个例子 linux system calls
编辑:
上面的示例显示了如何实现系统调用,只要从可加载模块实现一个; AFAIK,这是不可能的,除非你在哪里覆盖现有的,因为数组的大小是#define。
请记住,还需要更改用户空间,至少如果您希望能够实际使用新的系统调用。
答案 1 :(得分:2)
这是一个老问题,但我想提出我的解决方案。实现“类似系统调用”环境的最简单方法是依赖虚假设备。
特别是,您可以创建一个实际上没有驱动任何东西的新设备驱动程序。然而,在其上书写,可能导致已安装的模块执行所需的操作。
此外,如果您想提供多种服务,可以将它们映射到ioctl
操作。
答案 2 :(得分:1)
在Linux Documentation Project网站上查看“Linux内核模块编程指南”(http://www.tldp.org/LDP/lkmpg/2.6/html/index.html)。具体来说,请查看系统调用:http://www.tldp.org/LDP/lkmpg/2.6/html/x978.html。这应该会给你一个开始,至少。