我正在尝试在 __do_page_fault
异常处理程序的主体内创建一个 Kthread。该线程将做一些工作(打印导致异常的用户进程的 pc,并使用 ptrace 对其进行跟踪)。
目前我只是在一个不返回的循环中打印 pc,但是系统在一段时间后挂起,好像 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 ;
}
最佳答案
不应在中断上下文中创建线程(如在异常处理程序中)。
对于异常处理程序的延迟工作,您可以使用预创建线程或工作队列。
关于c - 在异常处理程序中创建的 Linux 内核线程停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42494821/