]> Zhao Yanbai Git Server - kernel.git/commitdiff
添加禁止抢占逻辑
authoracevest <zhaoyanbai@126.com>
Mon, 12 Jan 2026 13:24:49 +0000 (21:24 +0800)
committeracevest <zhaoyanbai@126.com>
Mon, 12 Jan 2026 13:25:14 +0000 (21:25 +0800)
fs/file.c
include/irq.h
include/system.h
kernel/irq.c
kernel/printk.c
kernel/system.c

index 2f1dc0adca36d6b56d81347fe9b0ba37f1191cd9..7ce701583dc421a9d52f03f28e8c0b306dff75c9 100644 (file)
--- a/fs/file.c
+++ b/fs/file.c
@@ -62,7 +62,7 @@ page_t* find_hash_page(address_space_t* mapping, uint32_t index) {
         p = p->hash_next;
     }
 
-    EXIT_CRITICAL_ZONE(EFLAGS);
+    LEAVE_CRITICAL_ZONE(EFLAGS);
 
     return page;
 }
@@ -78,7 +78,7 @@ void add_page_to_hash(page_t* page, address_space_t* mapping, uint32_t index) {
     p = page_hash_table[hash];
     page->hash_next = p;
     page_hash_table[hash] = page;
-    EXIT_CRITICAL_ZONE(EFLAGS);
+    LEAVE_CRITICAL_ZONE(EFLAGS);
 }
 
 void add_page_to_inode(address_space_t* mapping, page_t* page) {
@@ -88,7 +88,7 @@ void add_page_to_inode(address_space_t* mapping, page_t* page) {
 
     ENTER_CRITICAL_ZONE(EFLAGS);
     list_add(&page->list, &mapping->pages);
-    EXIT_CRITICAL_ZONE(EFLAGS);
+    LEAVE_CRITICAL_ZONE(EFLAGS);
 }
 
 page_t* get_cached_page(address_space_t* mapping, uint32_t index) {
@@ -106,7 +106,7 @@ page_t* get_cached_page(address_space_t* mapping, uint32_t index) {
 
         ENTER_CRITICAL_ZONE(EFLAGS);
         list_add(&page->list, &mapping->pages);
-        EXIT_CRITICAL_ZONE(EFLAGS);
+        LEAVE_CRITICAL_ZONE(EFLAGS);
     }
 
     return page;
@@ -148,11 +148,11 @@ file_t* get_empty_filp() {
             if (p->f_state == 0) {
                 p->f_state = 1;
                 fp = p;
-                EXIT_CRITICAL_ZONE(EFLAGS);
+                LEAVE_CRITICAL_ZONE(EFLAGS);
                 break;
             }
 
-            EXIT_CRITICAL_ZONE(EFLAGS);
+            LEAVE_CRITICAL_ZONE(EFLAGS);
         }
     }
 
index 299327098dfdb177cb4ffc7a1e02d9d02a230aa5..3d629a962da499ae48f6327835474ad3cc0c394b 100644 (file)
@@ -76,15 +76,6 @@ bool irq_disabled();
         __asm__ __volatile__("pushl %0; popfl" ::"g"(x) : "memory", "cc"); \
     } while (0)
 
-void enter_critical_zone();
-void exit_critical_zone();
-
-#define ENTER_CRITICAL_ZONE(x)                        \
-    volatile uint32_t __critical_zone_eflags_##x = 0; \
-    irq_save(__critical_zone_eflags_##x);
-
-#define EXIT_CRITICAL_ZONE(x) irq_restore(__critical_zone_eflags_##x);
-
 #define IRQ_CLOCK 0x00
 #define IRQ_KEYBOARD 0x01
 #define IRQ_CASCADE 0x02
index b2e9142b57e2a0780f2b60d4c4475d78a717852b..74c4de2560f7f1dc6d181cd40c95dcbf67de01f8 100644 (file)
@@ -259,6 +259,17 @@ void boot_delay(int ticks);
 void io_mfence();
 
 paddr_t get_rcba_paddr();
+
+extern uint32_t preempt_count;
+
+void enter_critical_zone();
+void leave_critical_zone();
+bool in_critical_zone();
+
+#define ENTER_CRITICAL_ZONE(x) enter_critical_zone()
+#define LEAVE_CRITICAL_ZONE(x) leave_critical_zone()
+#define IN_CRITICAL_ZONE() in_critical_zone()
+
 #endif
 
 #define DISABLE_IDE 1
index 95d27f241b965816861be97a8677ba87041b2666..b40d7fb6b2608d6c09b7bfb5954eef80c4ca5767 100644 (file)
@@ -99,7 +99,9 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t* regs) {
     enable_irq();
 
     // 如果需要调度程序
-    schedule();
+    if (!IN_CRITICAL_ZONE()) {
+        schedule();
+    }
 #endif
 }
 
@@ -283,18 +285,6 @@ int disable_no_irq_chip(unsigned int irq) {
 irq_chip_t no_irq_chip = {.name = "none", .enable = enable_no_irq_chip, .disable = disable_no_irq_chip};
 irq_desc_t no_irq_desc = {.chip = &no_irq_chip, .action = NULL, .status = 0, .depth = 0};
 
-// 单CPU
-// 这里的代码有BUG,如果嵌套调用的话
-// __critical_zone_eflags的值会被统一设置为最里层时的eflags
-// 意味着如果IF置位了的话,必定会丢失这个信息
-static volatile uint32_t __critical_zone_eflags;
-void enter_critical_zone() {
-    irq_save(__critical_zone_eflags);
-}
-void exit_critical_zone() {
-    irq_restore(__critical_zone_eflags);
-}
-
 void irq_set_chip(unsigned int irq, irq_chip_t* chip) {
     assert(irq < NR_IRQS);
     assert(chip != NULL);
index 3ea2c80dccdf2542ff6745bcf1df63693f8bee2e..635820d148949c438a376d577742f8e1898da543 100644 (file)
@@ -33,7 +33,7 @@ int printk(const char* fmtstr, ...) {
     tty_write(default_tty, pkbuf, (size_t)size);
     serial_write(pkbuf, (size_t)size);
 
-    EXIT_CRITICAL_ZONE(EFLAGS);
+    LEAVE_CRITICAL_ZONE(EFLAGS);
     return 0;
 }
 
@@ -47,7 +47,7 @@ int printd(const char* fmtstr, ...) {
     tty_write(debug_tty, pdbuf, (size_t)size);
     serial_write(pdbuf, (size_t)size);
 
-    EXIT_CRITICAL_ZONE(EFLAGS);
+    LEAVE_CRITICAL_ZONE(EFLAGS);
     return 0;
 }
 
@@ -60,6 +60,6 @@ int printlo(unsigned int xpos, unsigned int ypos, const char* fmtstr, ...) {
 
     tty_write_at(monitor_tty, xpos, ypos, plobuf, (size_t)size);
 
-    EXIT_CRITICAL_ZONE(EFLAGS);
+    LEAVE_CRITICAL_ZONE(EFLAGS);
     return 0;
 }
index 25aad4c0a57d5ca8f049c6486c63f6476a792779..18f5b2ab41edf3d19364650133c64f08047ef355 100644 (file)
@@ -251,3 +251,18 @@ paddr_t get_rcba_paddr() {
 
     return rcba_paddr;
 }
+
+//
+uint32_t preempt_count = 0;
+
+void enter_critical_zone() {
+    preempt_count++;
+}
+
+void leave_critical_zone() {
+    preempt_count--;
+}
+
+bool in_critical_zone() {
+    return preempt_count > 0;
+}