基于Linux-5.10
一、do_exit()简要流程
1. 执行路径
各驱动和内核机制中直接调用 SYSCALL_DEFINE1(exit, int, error_code) //exit.c 将 (error_code&0xff)<<8 传给参数 code do_exit(code); if (unlikely(in_interrupt())) //当前进程关中断后退出了,panic。 panic("Aiee, killing interrupt handler!"); if (unlikely(!tsk->pid)) //当前进程关抢占后退出了,panic。 panic("Attempted to kill the idle task!"); exit_signals(tsk); tsk->flags |= PF_EXITING; //标记进程正在退出 if (unlikely(is_global_init(tsk))) //init进程退出了,panic。 panic("Attempted to kill init! exitcode=0x%08x\n", tsk->signal->group_exit_code ?: (int)code); tsk->exit_code = code; //更新退出码 exit_notify(tsk, group_dead); tsk->exit_state = EXIT_ZOMBIE; exit_rcu(); //通知RCU进程退出了 do_task_dead tsk->state |= TASK_DEAD; tsk->flags |= PF_NOFREEZE; /* Tell freezer to ignore us: */ __schedule(false);
可以看到:
(1) 调用exit()的执行流程最终只是将进程状态设置为 TASK_DEAD,然后切走了,在这个流程中并没有释放 task_struct 结构。
(2) 关中断和原子上下文执行exit流程会报panic。
标签:code,tsk,44,调度,exit,进程,panic,流程 From: https://www.cnblogs.com/hellokitty2/p/17128535.html