linux进程exit系统调用

本文解析了用户态进程通过exit系统调用如何进入内核,详细跟踪了从用户态到内核态的流程,并介绍了关键内核函数如do_exit和do_task_dead的作用。涉及的内核源码提供了深入理解进程退出过程的线索。
摘要由CSDN通过智能技术生成

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结构
    ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值