中断发生时用户堆栈和内核堆栈的切换
2014-07-18 16:57
169 查看
如果一个中断产生时任务正在用户代码中执行,那么该中断会引起CPU特权级从3到0的变化,此时CPU就会运行用户态堆栈到内核态堆栈的切换操作。CPU会从当前任务的任务状态段TSS中取得新堆栈的段选择符和偏移量。因为中断服务程序在内核中,属于0级特权级代码,所以48位的内核态堆栈指针会从TSS的ss0和esp0字段中获得。在定位了新堆栈(内核态堆栈)之后,CPU就会首先把原用户态堆栈指针ss和esp压入内核态堆栈,随后把标志积存器eflags的内容和返回位置cs,eip压入内核态堆栈。
内核的系统调用是一个软件中断,因此任务调用系统调用时就会进入内核并执行内核中的中断服务代码。此时内核代码就会使用该任务的内核态堆栈进行操作。同样,当进入内核程序时,由于特权级别发生了改变,用户态堆栈的堆栈段和堆栈指针以及eflags会被保存在任务的内核态堆栈中。而在执行iret退出内核程序返回到用户程序时,将恢复用户态的堆栈和eflags。
如果一个任务正在内核态中运行,那么若CPU响应中断就不再需要进行堆栈切换操作。因为此时该任务运行的内核代码已经在使用内核态堆栈,并且不涉及到优先级别的变化,所以CPU仅把eflags和中断返回指针cs,eip压入当前内核态堆栈,然后执行中断服务过程。
内核的系统调用是一个软件中断,因此任务调用系统调用时就会进入内核并执行内核中的中断服务代码。此时内核代码就会使用该任务的内核态堆栈进行操作。同样,当进入内核程序时,由于特权级别发生了改变,用户态堆栈的堆栈段和堆栈指针以及eflags会被保存在任务的内核态堆栈中。而在执行iret退出内核程序返回到用户程序时,将恢复用户态的堆栈和eflags。
如果一个任务正在内核态中运行,那么若CPU响应中断就不再需要进行堆栈切换操作。因为此时该任务运行的内核代码已经在使用内核态堆栈,并且不涉及到优先级别的变化,所以CPU仅把eflags和中断返回指针cs,eip压入当前内核态堆栈,然后执行中断服务过程。
相关文章推荐
- 中断发生时用户堆栈和内核堆栈的切换
- 【操作系统】用户堆栈与内核堆栈的区别切换
- 任务内核态与用户态堆栈之间的切换
- 在用户空间发生中断时,上下文切换的过程
- 内核空间和用户空间,内核态和用户态,进程上下文和中断上下文
- 在用户空间发生中断时,上下文切换的过程
- 用户态到内核态切换之奥秘解析
- linux信号机制 - 用户堆栈和内核堆栈的变化
- ARM 中断状态和SVC状态的堆栈切换 (异常)
- 在用户空间发生中断时,上下文切换的过程
- 内核模式和用户模式的切换
- 用户态到内核态切换分析
- 内核空间和用户空间 进程上下文和中断上下文
- Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
- Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
- 在用户空间发生中断时,上下文切换的过程
- 任务0的内核堆栈,用户堆栈
- 进程上下文 中断上下文 / 用户空间 内核空间
- Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
- linux信号处理流程前篇---内核态与用户态的切换