Zac*_*ach 16 linux kernel kernel-module linux-kernel
有没有办法添加系统调用动态,比如通过模块?我找到了可以用模块覆盖现有系统调用的地方,只需更改sys_call_table[]数组以获取我的重写函数而不是安装我的模块时的本机,但是你可以用新的系统调用和模块吗?
Nik*_*sov 12
不,sys_call_table是固定大小:
const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = { ... Run Code Online (Sandbox Code Playgroud)
正如您可能已经发现的那样,您可以做的最好的事情是拦截现有的系统调用.
扎克,是的,有可能: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.h和asm/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,例如,syscall_32.tbl中的位置17,13,32,35,...,因为它们未实现.
因此,我们唯一的任务是识别这些位置并"注册"我们的新系统调用.
我在我的git上添加了类似的东西
https://github.com/MrN0body/rsysadd