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

时间:2017-07-08 06:51:53

标签: linux linux-kernel system-calls kernel-module panic

我正在进行系统调用拦截(用于/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package stack; import java.util.Scanner; import java.util.StringTokenizer; /** * * @author xxz */ public class NAmes { public static void main(String[] args) { Scanner sc = new Scanner(System.in); final String name = sc.nextLine(); System.out.println(formatedString(name)); sc.close(); } private static String formatedString(String name) { if(name!=null && name.length()!=0){ final StringTokenizer tokenizer = new StringTokenizer(name, " "); StringBuilder result = new StringBuilder(""); while(tokenizer.hasMoreTokens()){ StringBuilder currentToken =new StringBuilder(tokenizer.nextToken()); if(!tokenizer.hasMoreTokens()){ result.append(currentToken.toString().toUpperCase()); } else{ result.append(currentToken.toString().toUpperCase().charAt(0)+". "); } } return result.toString(); } return ""; } } 系统调用),我遇到了一个问题:我有两个内核模块(open()mod1)他们试图拦截mod2系统调用。我先加载open(),然后mod1加载mod2mod1拦截了open()

original_open1 = sys_call_table[__NR_open];
sys_call_table[__NR_open] = mod1_open;

此处original_open1sys_open。 在此之后,mod2拦截了open()

original_open2 = sys_call_table[__NR_open];
sys_call_table[__NR_open] = mod2_open;

此处,original_open2将为mod1_open(),因为mod1首先被加载。 现在,问题是:假设我首先卸载mod1并执行open()系统调用,然后调用mod2_open(),最终调用mod1_open()

由于mod1已经卸载,调用mod1_open()会引起恐慌(因为函数指针不再是有效的内存区域)。

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

0 个答案:

没有答案