linux用户栈和内核栈

        进程是正在执行中的程序,每个进程都有自己的堆栈。在进程初始化申请task_structure的时候也会申请堆栈空间,共有两个堆栈,内核堆栈和用户堆栈。内核堆栈指向内核地址空间,用户堆栈指向用户地址空间。当运行在用户态的时候cpu的栈指针指向的是用户堆栈,而当cpu运行在内核态的时候,cpu的栈指针指向的是内核栈。

       其中用户堆栈就是在进程执行中存放变量和函数参数等的堆栈。当进程由于中断或系统调用从用户态转换到内核态时,进程所使用的栈也要从用户栈切换到内核栈。系统调用实质就是通过指令产生中断,称为软中断。进程因为中断(软中断或硬件产生中断),使得CPU切换到特权工作模式,此时进程陷入内核态,进程进入内核态后,首先把用户态的堆栈地址保存在内核堆栈中,然后设置堆栈指针寄存器的地址为内核栈地址,这样就完成了用户栈向内核栈的切换。

      在进程转入内核态之后,执行的代码是内核代码,但执行路径未必相同,导致数据压栈的顺序和内容不同。另外数据不能保存在用户空间,这样容易被覆盖和修改,这时就需要为每个进程专门准备一套内核栈。

      当中断执行完成时,会将内核态执行的结果返回给用户态(例如系统调用),然后健用户堆栈的地址返回给堆栈指针寄存器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值