]> Zhao Yanbai Git Server - kernel.git/commitdiff
移除reenter的罗辑,用判断是否在底半处理的方式替代 dev/202405/reenter
authoracevest <zhaoyanbai@126.com>
Sat, 11 May 2024 05:39:53 +0000 (13:39 +0800)
committeracevest <zhaoyanbai@126.com>
Sat, 11 May 2024 05:39:53 +0000 (13:39 +0800)
include/irq.h
include/system.h
kernel/clock.c
kernel/irq.c
kernel/syscall.S
kernel/system.c

index bec6002b828f1989569c514e7bba62d515541660..c72dcdca8aef9779fd6032607926962970ab4274 100644 (file)
@@ -81,4 +81,6 @@ bool irq_disabled();
 #define IRQ_CASCADE 0x02
 #define IRQ_DISK 0x0E
 
+bool in_bh();
+
 #endif  //_IRQ_H
index 9189c401654a340305a3161062e8074f9917dba7..b4d3f0171d9d7744a07650ae184d0cc1ea686604 100644 (file)
@@ -77,7 +77,7 @@ extern char etext, edata, end;
 #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)
@@ -264,8 +264,6 @@ void init_task_entry();
 void disk_task_entry();
 void user_task_entry();
 
-extern volatile int reenter;
-
 #define DEFAULT_BOOT_DELAY_TICKS 30
 void boot_delay(int ticks);
 
index e78622f606192fe8746870449f5b7286a354fcfb..b2601f14eba83d1158fc27abab53cdf66f817f36 100644 (file)
@@ -42,6 +42,7 @@ void clk_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) {
     // 打断后该时钟中断不应该继续减少该进程的时间片,因为这会造成该进程在后续的调底中少了实际的运行时间
     if (1 == current->need_resched) {
         // 这种情况必然已经发生了该时钟中断打断了下半部处理程序
+        // 反之时钟中断打断了下半部处理程序不一定need_resched就为1
         return;
     }
 
@@ -55,7 +56,9 @@ void clk_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) {
 
     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);
+    }
 }
 
 // 开中断执行这个函数
index b25f38244628bab97f982524f3b20940eb4edf8e..1c462e3945e1162171ed77486cb88dcf10945098 100644 (file)
@@ -77,6 +77,12 @@ void dump_irq_nr_stack() {
 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) {
@@ -87,7 +93,6 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
     irq_action_t *action = p->action;
 
     assert(irq_disabled());
-    reenter++;
 
     // 屏蔽当前中断
     p->chip->disable(irq);
@@ -100,8 +105,8 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
 #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) {
@@ -115,25 +120,25 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
     // 代表当前中断程序打断了前一个中断程序的“开中断处理的底半部分逻辑”
     // 即前一个中断处理尚未完全完成
     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) {
index 3b9b27ffcf79d0766a07f03a95e69afbbcc3c6bf..9c8f01bd003c60620431f20819efbaa6bf55a6e9 100644 (file)
@@ -26,7 +26,6 @@
 .text
 .global syscall_entry
 .global ret_from_fork_krnl
-.extern reenter
 //.global syscall_exit
 
 syscall_entry:
index 1717762fe849213bbc9a1cfd3befe1b2cb7ffc5b..da116540c0e5277c635c86efe25a8d18604eb740 100644 (file)
@@ -36,8 +36,6 @@ char idtr[6] __attribute__((__aligned__(4)));
 extern char _gdtr[6];
 extern char _idtr[6];
 
-volatile int reenter = -1;
-
 void setup_gdt() {
     pDesc pdesc;
     // change to new gdt.