3

在我的内核配置中未设置 CONFIG_PREEMPT。由于中断处理程序中不允许 schedule() ,如何在 linux 内核中实现循环类型的调度。即谁如此频繁地调用调度程序。在 entry_32.S 中,它仅在设置了 CONFIG_PREEMPT 时才调用 preempt_schedule_irq。

4

1 回答 1

2

发生的事情是 CPU 上的计时器被设置为每隔一段时间中断内核。但是我们不能只从中断上下文中调用调度,对吗?所以内核所做的是一个巧妙的技巧。它在执行处理程序时更改当前正在执行的任务,然后返回。这有效地做的是从处理程序下面切换上下文,以便处理程序完成,但同时下一个要运行的上下文现在是下一个将执行的任务。继续阅读do_context_switch(IIRC,我认为这就是它的名称),您会看到它从当前执行下方切换它的堆栈和上下文,并在另一个上下文中恢复相同的功能。

并且CONFIG_PREEMPT仅适用于内核上下文中的内核代码抢占。用户空间任务将始终抢占。这意味着任何开始执行的内核代码都会运行到完成(除非您自己调用 schedule() 或阻塞等待 I/O 等....)。通常,只要内核不持有任何锁,内核就可以抢占,除非在某些情况下获取锁可以使线程进入睡眠状态。

于 2013-01-10T07:04:52.037 回答