Linux内核 – 通过模块dynamic添加系统调用

有什么办法可以添加一个系统调用dynamic,如通过一个模块? 我已经find了一些地方,我可以通过更改sys_call_table[]数组来取代现有的系统调用模块,以获取我的重写函数,而不是本机安装模块时,您可以使用新的系统调用和一个模块?

不, sys_call_table的大小是固定的:

 const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = { ... 

您可能已经发现的最好的做法是拦截现有的系统调用。

扎克,是的,这是可能的:D

尽管sys_call_table的大小是固定的,但在某些情况下,表中可能有空闲位置

看这个链接:
lxr.free-electrons.com/source/arch/x86/kernel/syscall_32.c
lxr.free-electrons.com/source/arch/x86/kernel/syscall_64.c

  • 首先,内核用指向sys_ni_syscall的指针填充sys_call_table的所有位置

  • 在编译时,根据下表生成asm / syscalls_32.hasm / syscalls_64.h文件:

lxr.free-electrons.com/source/arch/x86/syscalls/syscall_32.tbl
lxr.free-electrons.com/source/arch/x86/syscalls/syscall_64.tbl

简单看一下这些表,你可以看到一些位置将继续指向sys_ni_syscall,例如位置为17,31,32,35,…,在syscall_32.tbl中,因为它们没有被实现。

因此,我们唯一的任务就是确定这些职位并“登记”我们的新系统调用。

我在git上放了类似的东西
https://github.com/MrN0body/rsysadd

拦截现有的系统调用(在内核中执行某些操作)在某些情况下不是正确的方法。 例如,如果您的用户空间驱动程序需要在内核中执行某些操作,请在那里发送内容,或者从内核读取内容?

通常对于驱动程序,正确的方法是使用ioctl()调用,这只是一个系统调用,但它可以调用不同的内核函数或驱动程序模块 – 通过ioctl()传递不同的参数。

以上是用户控制的内核代码执行。

对于数据传递,可以使用procfs或sysfs驱动程序与内核通信。

PS:当你拦截系统调用时,通常会影响到整个操作系统,你不得不担心如何解决安全的问题:如果别人正在中途调用系统调用,然后你修改/拦截代码?