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方法,我会感到惊讶。这就是我提到内核新手的原因。一些内核人员挂在那里,他们比在一个完整的内核列表上询问更温和。他们的一些回答很简短,但这通常是你需要进一步调查的关键。为了完整性,请参阅内核新手邮件列表。