#define disableIRQ() cli()
#define enableIRQ() sti()
-#define ALIGN(x, a) (((x) + (a)-1) & ~((a)-1))
+#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
// 定义最大显存为 16MB
#define VRAM_VADDR_SIZE (16 << 20)
void disk_task_entry();
void user_task_entry();
-extern volatile int reenter;
-
#define DEFAULT_BOOT_DELAY_TICKS 30
void boot_delay(int ticks);
// 打断后该时钟中断不应该继续减少该进程的时间片,因为这会造成该进程在后续的调底中少了实际的运行时间
if (1 == current->need_resched) {
// 这种情况必然已经发生了该时钟中断打断了下半部处理程序
+ // 反之时钟中断打断了下半部处理程序不一定need_resched就为1
return;
}
assert(current->ticks >= 0); // 防止ticks被减到0后再减溢出
- add_irq_bh_handler(clk_bh_handler, NULL);
+ if (!in_bh()) {
+ add_irq_bh_handler(clk_bh_handler, NULL);
+ }
}
// 开中断执行这个函数
void irq_bh_handler();
void schedule();
+volatile bool in_bh_logic = false;
+
+volatile uint32_t reenter_count = 0;
+
+bool in_bh() { return in_bh_logic; }
+
__attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
unsigned int irq = regs->irq;
if (irq >= NR_IRQS) {
irq_action_t *action = p->action;
assert(irq_disabled());
- reenter++;
// 屏蔽当前中断
p->chip->disable(irq);
#if 1
unsigned long esp;
asm("movl %%esp, %%eax" : "=a"(esp));
- printl(MPL_CURRENT, "current %08x %-6s cr3 %08x reenter %d esp %08x ticks %u", current, current->name, current->cr3,
- reenter, esp, current->ticks);
+ printl(MPL_CURRENT, "current %08x %-6s cr3 %08x esp %08x reenter %u ticks %u", current, current->name, current->cr3,
+ esp, reenter_count, current->ticks);
#endif
while (action && action->handler) {
// 代表当前中断程序打断了前一个中断程序的“开中断处理的底半部分逻辑”
// 即前一个中断处理尚未完全完成
assert(irq_disabled());
- if (reenter != 0) {
- reenter--;
+ if (in_bh_logic) {
+ reenter_count++;
return;
}
// --以上逻辑CPU处于中断禁止状态--------------------------
// 此处执行中断函数的下半部分逻辑,开中断执行
{
+ in_bh_logic = true;
enable_irq();
irq_bh_handler();
disable_irq();
+ in_bh_logic = false;
}
// --以下逻辑CPU处于中断禁止状态--------------------------
assert(irq_disabled());
- assert(reenter == 0);
- reenter--;
// 考察如果不需要调度程序,直接退出
if (current->need_resched == 0) {