我正在进行系统调用拦截(用于/*
* 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
加载mod2
。 mod1
拦截了open()
:
original_open1 = sys_call_table[__NR_open];
sys_call_table[__NR_open] = mod1_open;
此处original_open1
为sys_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()
会引起恐慌(因为函数指针不再是有效的内存区域)。
我需要一些机制来避免这个问题。基本上,我想要一个解决方案,便于以任意随机顺序加载/卸载模块(拦截相同的系统调用),而不会引起任何恐慌。