2017-02-27 4 views
0

Ich versuche, eine Kthread innerhalb des Körpers der __do_page_fault Exception-Handler erstellen. Dieser Thread wird einige Arbeit erledigen (Drucken Sie den PC des Benutzerprozesses, der die Ausnahme verursacht hat, und verfolgen Sie ihn mit ptrace).Linux-Kernel-Thread erstellt in Ausnahmehandler Stall

Derzeit drucke ich nur den PC in einer Schleife, die nicht zurückkehrt, aber das System hängt nach einer Weile, als ob der Kthread zurückkehren sollte, damit der Benutzerprozess die Ausführung fortsetzen kann.

Dies ist der Code des 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); 
     } 
    } 

Und das, wo es erstellt wird:

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 ; 
} 

Antwort

1

Themen sollten nicht im Interrupt-Kontext geschaffen werden (wie in Exception-Handler).

Um Arbeit von einem Ausnahmehandler zu verzögern, können Sie vor-erstellten Thread oder eine Arbeitswarteschlange verwenden.

Verwandte Themen