系统调用和进程切换时的寄存器信息保存在哪里?

本文探讨了Linux系统调用的工作原理,从unistd.h中的函数映射到系统调用号,再到通过eax寄存器传递给内核。在系统调用过程中,用户态的寄存器信息被压入内核栈,以便于模式切换后的现场恢复。在进程切换时,这些信息保存在task_struct的thread结构中。文章还讨论了为何在系统调用返回前保存用户栈信息在内核栈,而不是直接在thread中,以避免资源浪费。最后,介绍了中断处理中的SAVE_ALL和RESTORE_ALL宏用于保存和恢复寄存器状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统调用是什么???
系统调用是操作系统为用户提供的一系列API;系统调用将用户的请求发给内核,内核执行完以后,将结果返回给用户;
以open为例,进行系统调用:
分析Linux2.6.11版本
<1>通过在unistd.h中的函数名的拼接;
这里写图片描述

<2>找到对应的系统调用号
这里写图片描述
<3>然后将此系统调用号通过eax寄存器告知内核,在执行0x80号中断的时候,eax寄存器中放的是5;
<4>将用户空间的esp等信息压入内核栈,在内核栈上执行系统调用;
<5>系统调用执行完毕,将结果写入eax寄存器中,将用户空间的信息弹出内核栈,执行用户空间的代码;

系统调用时的当前进程要进行模式的切换,要从用户态切换到内核态,那么用户态的一些寄存器信息,就要进行压栈的操作,压入内核栈,以免下次进行现场恢复(恢复到用户空间)的时候,直接从内核栈弹出寄存器的信息,并让eax寄存器带上内核完成系统调用时的结果;

进程切换来了。。。
当我们进程进行切换的时候,用户态的寄存器信息,是保存在哪里的呢?用户态的信息是保存在task_struct里面的成员变量thread里面;

struct task_struct {
    /**
     * 进程状态。
     */
    volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */
    /**
     * 进程的基本信息。
     */
    struct thread_info *thread_info;
    atomic_t usage;
    unsigned long flags;    
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值