linux进程exit系统调用
用户态的进程退出时,通过exit系统调用进入到内核,cpu产生系统调用中断,处理该中断时查表sys_call_table找到系统调用号找到sys_exit,sys_exit找到do_exit函数执行。
用户态exit()-->内核态中断处理el0_sync--->内核态el0_svc查找sys_call_table得到sys_execve函数地址执行--->内核态sys_exit--->内核态do_exit。
内核源码如下:
// kernel/exit.c
SYSCALL_DEFINE1(exit, int, error_code) { //宏
do_exit((error_code&0xff)<<8);
}
// kernel/exit.c
void do_exit(long code) {
// ...
exit_signals(tsk); // 通知当前task已经exit
// ...
exit_mm(tsk); // 释放mm_struct结构
exit_sem(tsk); // 释放信号量资源
exit_shm(tsk); //释放共享内存资源
exit_files(tsk); // 释放当前进程打开的文件资源put_files_struct(tsk->files)
// 如果fs->users计数器为0,释放工作目录(root/pwd)对应资源free_fs_struct(tsk->fs)
exit_fs(tsk);
// ...
exit_task_namespaces(tsk); // 释放进程命名空间资源
// ...
do_task_dead();
}
// kernel/sched/core.c
void do_task_dead(void) {
// 给task_structk结构体state字段赋值
set_special_state(TASK_DEAD);
// ...
// __schedule 进程调度处理核心逻辑
__schedule(false); // 主动让出CPU发生系统调度 完成切换后释放task_struct结构
...
}