我正在阅读 Linux 源代码来了解调度的工作原理。我了解到,在可抢占内核(CONFIG_PREEMPT已设置)中,通过调用从中断处理程序返回内核空间后有机会抢占preempt_schedule_irq。
但是,我还在preempt_schedule_irq中找到了以下代码片段
do {
preempt_disable();
local_irq_enable(); //why enable interrupt here?
__schedule(true); //interrupt would be disabled inside it
local_irq_disable();
sched_preempt_enable_no_resched();
} while (need_resched());
Run Code Online (Sandbox Code Playgroud)
里面有一个local_irq_enable()电话,这让我很困惑。为什么我们需要在这里启用中断,因为在开始时__schedule它会再次禁用?
我的粗略猜测是,这为首先安排优先级较高的进程提供了机会。然而,这是没有意义的,因为抢占已经被禁用preempt_schedule_irq,即使有中断,也不会有抢占重新安排。
那么抢占调度程序到底有什么意义呢?我想我一定错过了什么,但我不明白。
我试图了解PCI段(域)如何与多个主机桥相关联?
有人说多个PCI域对应多个主机桥,但有人说它意味着在一个主机桥下有多个根桥.我很困惑,我在PCI SIG基本规范中找不到太多有用的信息.
我想知道
(1)假设我在MCFG中设置了3个PCI域,我是否有3个主机桥连接3个CPU和总线,或者我有3个根桥支持3倍总线但是在一个CPU中共享一个公共主机桥?
(2)如果我有多个主桥(或根桥),这些桥是否共用一个共同的南桥(例如,ICH9),或者它们是分开的?
我是初学者,谷歌并没有解决我的问题.如果有人能给我一些线索,我将不胜感激.