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