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结构
????...
}
|