Linux 多个内核模块拦截相同的系统调用并在卸载期间崩溃

Linux 多个内核模块拦截相同的系统调用并在卸载期间崩溃,linux,linux-kernel,system-calls,kernel-module,panic,Linux,Linux Kernel,System Calls,Kernel Module,Panic,我正在进行系统调用拦截(针对open()system call),我遇到了一个问题:我有两个内核模块(mod1和mod2),它们都试图拦截open()syscall。我先加载了mod1,然后加载了mod2。mod1被以下人员截获open(): original_open1 = sys_call_table[__NR_open]; sys_call_table[__NR_open] = mod1_open; original_open2 = sys_call_table[__NR_open];

我正在进行系统调用拦截(针对
open()
system call),我遇到了一个问题:我有两个内核模块(
mod1
mod2
),它们都试图拦截
open()
syscall。我先加载了
mod1
,然后加载了
mod2
mod1
被以下人员截获
open()

original_open1 = sys_call_table[__NR_open];
sys_call_table[__NR_open] = mod1_open;
original_open2 = sys_call_table[__NR_open];
sys_call_table[__NR_open] = mod2_open;
这里的
original\u open1
将是
sys\u open
。 在此之后,
mod2
被以下人员截获
open()

original_open1 = sys_call_table[__NR_open];
sys_call_table[__NR_open] = mod1_open;
original_open2 = sys_call_table[__NR_open];
sys_call_table[__NR_open] = mod2_open;
在这里,
original\u open2
将是
mod1\u open()
,因为mod1是首先加载的。 现在,问题是:假设我先卸载
mod1
并执行
open()
系统调用,然后调用
mod2\u open()
,最终调用
mod1\u open()

由于
mod1
已卸载,因此调用
mod1\u open()
将导致死机(因为函数指针不再是有效的内存区域)


我需要一些机制来避免这个问题。基本上,我想要一个解决方案,它可以方便地以任意顺序加载/卸载模块(拦截相同的系统调用),而不会造成任何恐慌。

我认为由于模块之间的依赖性,您必须保留卸载模块的顺序。@vtha-是否可以让
mod1
广播一条消息,说“我正在卸载。如果您使用的是
mod1\u open
,那么请改用
original\u open1
”。显然,消息参数是指向函数的指针。也许和。也许这是一个问题。@jww我喜欢你提到的方法,但找不到任何机制将消息从一个模块广播到所有模块。@Ajk-我对内核模块了解不够,无法进一步帮助你。如果内核缺少类似的IPC方法,我会感到惊讶。这就是我提到内核新手的原因。一些内核人员挂在那里,他们比在一个完整的内核列表上询问更温和。他们的一些回答很简短,但这通常是你需要进一步调查的关键。为了完整性,请参阅内核新手邮件列表。