“进程上下文(process context)”的确切含义是什么,它与“中断上下文(interrupt context)”有何关系?

3
以下短语的含义是什么:“内核在进程上下文中执行”?
这是否意味着如果CPU正在执行某个进程,然后发生某个中断(系统调用,按键等),CPU将保持当前运行进程的页表加载,然后它将执行位于进程内核空间中的中断处理程序?
如果是这样的话,那么中断处理程序似乎是在进程上下文中执行的,那么中断上下文是什么意思?
3个回答

8

进程上下文是指其当前状态。 我们需要保存当前正在运行的进程的上下文,以便在处理中断后可以恢复它的运行。

进程上下文基本上是指其当前状态(即其寄存器中的内容)。

esp
ss
eip
cs
and more.

我们需要保存指令指针(EIP)代码段(CS),以便在处理中断后,我们可以从停止的地方继续运行。


中断处理程序代码位于内核内存中。一旦发生中断,我们立即从用户模式切换到内核模式。当前正在运行进程的状态被保存,一部分保存在用户堆栈上,另一部分保存在内核堆栈上(取决于架构)。假设它是x86,则通过从TSS中断描述符表加载适当的sscsespeip来运行中断处理程序。


1

进程上下文中断上下文都指的是你的内核代码运行的上下文。

  • 当内核代表特定进程执行时,例如在各种系统调用(如openclose)期间,这被称为进程上下文。在进程上下文中执行睡眠操作,例如msleepmutex,被认为是安全的。 K线程在进程的上下文中运行,并作为从kthreadd派生的分支创建:
# ps axf | grep kthread
      2 ?        S      0:00 [kthreadd]
     12 ?        I      0:00  \_ [rcu_tasks_kthread]
     13 ?        I      0:00  \_ [rcu_tasks_rude_kthread]
     14 ?        I      0:00  \_ [rcu_tasks_trace_kthread]
 170952 pts/14   S+     0:00          \_ grep --color=auto kthread
  • 当涉及到与特定用户空间进程无关且已禁用中断的内核代码时,我们使用术语 中断上下文。在 中断上下文 下休眠是不安全的。通常 顶半部分 中断处理程序运行在中断上下文中,像 softirq 这样的 底半部分 函数也会禁用中断并运行在中断上下文中。但并非所有 IRQ 处理程序都在 中断上下文 中运行。在 PREEMPT_RT 内核中,所有顶半部分都在 kthread 内部运行(有关详细信息,请参见 irq_work),因此它们在进程中断下运行而不是在中断上下文下(尽管仍处于非常低的级别和在 中断上下文 下)。此外,在这个内核中,softirq 变得可抢占,因此不再在中断上下文下运行。

0

进程上下文是在内核中代表用户进程(系统调用或异常)或内核线程运行的代码。

中断上下文是由于硬件中断而在内核中运行的代码;它正在运行由硬件IRQ触发的中断服务例程。

区分这两者的必要性对我来说并不完全清楚。我相信其重要性在于优先级。进程上下文中的某些内容可以被抢占,以便快速服务IRQ。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接