Questions tagged «context-switch»


3
上下文切换内部
我想借助这个问题来学习并弥补我的知识空白。 因此,用户正在运行一个线程(内核级),并且现在正在调用yield(我认为是系统调用)。现在,调度程序必须将当前线程的上下文保存在TCB中(该线程存储在内核中的某个位置),并选择另一个线程来运行并加载其上下文并跳转至CS:EIP。为了缩小范围,我正在研究在x86体系结构上运行的Linux。现在,我想详细介绍一下: 因此,首先我们有一个系统调用: 1)的wrapper函数yield会将系统调用参数推入堆栈。推送返回地址,并通过将系统调用号推送到某个寄存器(例如EAX)引发中断。 2)中断将CPU模式从用户更改为内核,并跳转到中断向量表,并从那里跳转到内核中的实际系统调用。 3)我猜想调度程序现在被调用,现在它必须将当前状态保存在TCB中。这是我的困境。因为,调度器将使用内核堆栈,而不是用于执行其操作(这意味着该用户堆栈SS和SP已被改变),它是如何存储的用户的状态,而不会在该过程修改任何寄存器。我在论坛上已经读到有一些用于保存状态的特殊硬件说明,但是调度程序如何访问它们,谁来运行这些说明以及何时运行? 4)现在,调度程序将状态存储到TCB中并加载另一个TCB。 5)当调度程序运行原始线程时,控件返回到包装器函数,该函数清除堆栈并恢复线程。 附带问题:调度程序是否以仅内核线程(即只能运行内核代码的线程)运行?每个内核线程或每个进程是否有单独的内核堆栈?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.