16

有没有办法添加系统调用动态,例如通过模块?我找到了可以使用模块覆盖现有系统调用的地方,只需更改sys_call_table[]数组即可在安装模块时获取我的覆盖函数而不是本机函数,但是您可以使用新的系统调用和模块来做到这一点吗?

4

2 回答 2

12

不,sys_call_table是固定大小的:

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

正如您可能已经发现的那样,您能做的最好的事情就是拦截现有的系统调用。

于 2010-03-07T04:21:19.607 回答
0

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

通常对于驱动来说,正确的做法是使用ioctl()调用,它只是一种系统调用,但它可以调用不同的内核函数或驱动模块——通过ioctl()传递不同的参数。

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

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

PS:当你拦截系统调用时,一般会影响整个操作系统,你要担心如何安全的解决这个问题:如果有人在中途调用系统调用,然后你修改/拦截代码怎么办?

于 2014-05-26T03:33:59.550 回答