c - 在异常处理程序中创建的 Linux 内核线程停止

标签 c linux kernel

我正在尝试在 __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/

相关文章:

c - 删除评论的字符串函数

mysql - mysql 5.6.14补丁如何更新到mysql 5.6.28以上?

c# - 使用 C# 进行内核级编程

c - 如何在 C 中将 Ulong 转换为 Lptstr

c - 结构帮助。将卡片结构分配给甲板结构中保存的卡片数组

c++ - 来自 WDK 示例的 DbgPrint

linux - 通过 HTTP 协议(protocol)进行身份验证的 Git 克隆

c++ - 从内核模式执行用户模式可执行文件

c - 'sizeof (function name)' 返回什么?

c++ - 为什么 cmake 在 64 位系统上查找 32 位库而不是 64 位库?