2017-02-27 35 views
0

我试图在__do_page_fault异常处理程序的主体内创建一个Kthread。此线程将执行一些工作(打印导致异常的用户进程的pc,并使用ptrace跟踪它)。在异常处理程序内部创建的Linux内核线程停止

目前我只是在一个不返回的循环中打印电脑,但系统会在一段时间后挂起,就像Kthread应该返回以便用户进程继续执行一样。

这是KTHREAD的代码:

int th1(void * data){ 
     struct task_struct * tsk= (struct task_struct*) data; 
     int pid = tsk->pid; 
     int id= current->pid; 
     printk("thread %d is tracking %d ",id, tsk->pid); 
     while(true){ 
       mdelay(100000); 
       printk("%d, %ud\n",id,task_pt_regs(tsk)->ARM_pc); 
     } 
    } 

这在那里创建:

if (likely(!(fault & (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS)))){ 
    printk("the page fault was made by the procces id %d\n",tsk->pid); 
    if(tsk->is_tracked == 0) { 
     tsk->is_tracked=1 ; 
     struct task_struct * child_debugger; 
     void * data = (void *) tsk; 
     child_debugger = kthread_create(th1,data, "os2"); 
     if(child_debugger) { 
      wake_up_process(child_debugger); 
     }else{ 
       printk("error\n"); 
     } 
     printk("thread went out \n"); 
    } 
    return 0 ; 
} 

回答

1

线程不应该建立在中断上下文(如在异常处理程序)。

对于从异常处理程序推迟工作,您可以使用预先创建的线程或工作队列。

相关问题