C 在跟踪点中使用printk会导致系统冻结

C 在跟踪点中使用printk会导致系统冻结,c,linux-kernel,printk,tracepoint,C,Linux Kernel,Printk,Tracepoint,我正在学习Linux的tracepoint相关知识,并编写了一个模块,如下所示 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #定义MAXNUM 600 模块许可证(“GPL”); 静态int监控_pid=0; 模块参数(受监控的pid,int,0); 模块(监控pid,“监控过程的pid”); void lookup_tps(结构跟踪点*tp,void*priv); 无效系统输入探测(结构pt regs*regs,长id); 静态结构跟踪点*sys\u enter\u tp=NULL

我正在学习Linux的tracepoint相关知识,并编写了一个模块,如下所示

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义MAXNUM 600
模块许可证(“GPL”);
静态int监控_pid=0;
模块参数(受监控的pid,int,0);
模块(监控pid,“监控过程的pid”);
void lookup_tps(结构跟踪点*tp,void*priv);
无效系统输入探测(结构pt regs*regs,长id);
静态结构跟踪点*sys\u enter\u tp=NULL;
静态无符号监视的_系统调用[MAXNUM];
静态整数计数=0;
int\uu初始开始(无效){
int i=0;
//查找系统\输入跟踪点
对于每个内核跟踪点(查找tps,NULL);
如果(sys\u enter\u tp==NULL){
printk(KERN_INFO“找不到系统输入跟踪点。\n”);
//让模块加载失败
返回-1;
}
if(跟踪点探测寄存器(系统输入探测,空)!=0){
printk(KERN_INFO“regist fail.\n”);
返回-1;
}
对于(i=0;在名称中,“系统输入”)==0){
系统输入\u tp=tp;
}
}
无效系统输入探测(结构pt regs*regs,长id){
如果(id>=MAXNUM){
返回;
}
if(受监控的系统调用[id]==0){
返回;
}
如果(当前->pid!=监控的\u pid){
返回;
}
printk(KERN_INFO“1234\n”);
计数++;
}
模块初始化(启动);
模块_出口(结束);
当我在命令行上输入insmod命令并按Enter键时,系统没有响应。经过多次实验,我发现当在探测函数(sys\u enter\u probe)中写入count或使用printk时会出现此问题。我对内核中的各种机制知之甚少,我希望有人能告诉我我的代码违反了哪些规则,以及在哪里可以学习这些规则