创建内核线程

本文介绍如何在Linux环境下创建内核线程来响应段错误,通过修改内核源码,在发生段错误时唤醒特定内核线程并在控制台输出提示信息。

在Linux中,有一些进程完全运行在内核空间,比如ksoftirqd等等,这些进程称为内核线程。今天,我们就动手创建一个内核线程。

引言:

如果用户层的进程违规访问内存,内核会发送一个SIGSEGV信号给进程。我们的目标就是,创建一个内核线程,如果发生了段错误,就在控制台打印

"myKthread: Segmentation Fault!!!"

系统环境:

CentOS 5.5 i386 + 2.6.18 源码

设计原理:

(1)使用kthread_create创建线程:

 
 
  1. struct task_struct *kthread_create(int (*threadfn)(void *data),  
  2.  
  3.                                          void *data,  
  4.                                          const char *namefmt, ...);  

这个函数可以像printk一样传入某种格式的线程名 
线程创建后,不会马上运行,而是需要将kthread_create() 返回的task_struct指针传给wake_up_process(),然后通过此函数运行线程。

 在arch/i386/mm/fault.c最前边添加函数
 
 
  1. static int mykthread(void *data)  
  2. {  
  3.         for(;;)  
  4.         {  
  5.                  printk(KERN_ALERT "myKthread: Segmentation Fault!!!\n");  
  6.                  set_current_state(TASK_INTERRUPTIBLE);  
  7.                  schedule();  
  8.         }  
  9. }  
   

(2)不管是谁访问内存,都会调用到函数do_page_fault,如果是用户层程序,地址合法,就会允许访存,如果违法,就发送SIGSEGV。我们在发送发动信号前唤醒mykthread。
mykthread在第一次段错误时被创建。
 
在arch/i386/mm/fault.c的do_page_fault函数内添加一个静态变量
 
 
 
  1. static struct task_struct *kt = NULL; 
在force_sig_info_fault(SIGSEGV, si_code, address, tsk);这个语句之前,添加下面的内容
 
 
  1. if(!kt)  //first time  
  2. {  
  3.      kt = kthread_create(mythread,NULL,"mykthread");  
  4.      if(!kt)  
  5.          printk(KERN_ALERT "create mykthread failed!\n");  
  6.      else 
  7.          wake_up_process(kt);  
  8. }  
  9. else 
  10.      wake_up_process(kt); 

OK.重新编译内核

程序运行结果:

没发生段错误之前

 

运行程序seg_fault

注:

我原先编译的,内容是打印SIGSEGV sent和Segment Fault!

seg_fault代码

 
 
  1. int main()  
  2.  
  3. {  
  4.  
  5.      *(int*)0 = 1;  
  6.  
  7.      return 0;  
  8.  

 

本文转自nxlhero 51CTO博客,原文链接:http://blog.51cto.com/nxlhero/708885,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值