]> Zhao Yanbai Git Server - kernel.git/commitdiff
preempt_cnt从task_union中提出来做为全局变量
authoracevest <zhaoyanbai@126.com>
Mon, 15 Nov 2021 08:36:09 +0000 (16:36 +0800)
committeracevest <zhaoyanbai@126.com>
Mon, 15 Nov 2021 08:36:09 +0000 (16:36 +0800)
13 files changed:
boot/multiboot.S
boot/multiboot2.h
drivers/console.c
include/system.h
include/task.h
kernel/clock.c
kernel/i8259.c
kernel/interrupts.S
kernel/irq.c
kernel/sched.c
kernel/system.c
kernel/task_disk.c
kernel/task_root.c

index 09747695f7e8a16394601ceaf2580140bad0110a..b4313f3e419de12183f61811baabb7a119338613 100644 (file)
@@ -13,7 +13,6 @@
  * 
  *--------------------------------------------------------------------------
  */
-#define ASM_FILE
 #define ASM
 #include "boot.h"
 #include "system.h"
@@ -183,4 +182,4 @@ multiboot2_header_bgn:
     .short MULTIBOOT_HEADER_TAG_END
     .short 0
     .long  8
-multiboot2_header_end:
\ No newline at end of file
+multiboot2_header_end:
index d0f36d3792800d16953ac8bf27287461431f44cc..94e16b8bdd8dee27f14a488820092f7542c10609 100644 (file)
@@ -87,7 +87,7 @@
 #define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1
 #define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2
 
-#ifndef ASM_FILE
+#ifndef ASM
 
 typedef unsigned char multiboot_uint8_t;
 typedef unsigned short multiboot_uint16_t;
@@ -375,6 +375,6 @@ struct multiboot_tag_load_base_addr {
     multiboot_uint32_t load_base_addr;
 };
 
-#endif /*  ! ASM_FILE */
+#endif /*  ! ASM */
 
-#endif /*  ! MULTIBOOT_HEADER */
\ No newline at end of file
+#endif /*  ! MULTIBOOT_HEADER */
index 15854fbbf9b10e372128156b6bd4b00d7da4fc19..59b2f7b3abe1e02cb4b5270d60c6a2a9265b57be 100644 (file)
@@ -85,6 +85,7 @@ int cnsl_kbd_write(char ch) {
 
     if (ch == '\n') {
         clear(&cnsl.wr_q);
+       return 0; // TODO FIX
         while (get(&cnsl.sc_q, &ch)) put(&cnsl.rd_q, ch);
         wake_up(&rdwq);
     }
index 6746bcf744b942563ee43bde14c16f70f4e8dc25..a301f3b8b4683c0c1967d22eb32d4e0a1ecd64c2 100644 (file)
@@ -255,4 +255,14 @@ void system_delay();
 
 #define KRNL_INIT_STACK_SIZE 4096
 
+#ifndef ASM
+// 内核进程
+void root_task_entry();
+void init_task_entry();
+void disk_task_entry();
+void user_task_entry();
+
+extern uint32_t preempt_count;
+#endif
+
 #endif  //_SYSTEM_H
index 2e698dda7aa00e6cbde28b08c543f30d11824820..add360271b7fa4b3cb77ca8b215ab49135c50941 100644 (file)
@@ -15,8 +15,6 @@
 
 #define TASK_SIZE 4096
 
-#define TI_preempt_cnt 0
-
 #ifndef ASM
 #include <fs.h>
 #include <list.h>
@@ -42,8 +40,6 @@ typedef struct wait_queue_head {
 
 typedef union task_union {
     struct {
-        unsigned long preempt_cnt;
-
         unsigned long esp0; /* kernel stack */
 
         /* for context switch */
index a6822142abf1b5c9cfcc8ce710b1e880db5bc479..8e8be8f22d88a6e8e73b778a1511e43008d4ff53 100644 (file)
@@ -25,8 +25,8 @@ void clk_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) {
         printl(MPL_CLOCK, "clock irq: %d", jiffies);
     }
 
-    unsigned long iflags;
-    irq_save(iflags);
+    // unsigned long iflags;
+    // irq_save(iflags);
 
     task_union *p = 0;
     task_union *t = 0;
@@ -39,5 +39,5 @@ void clk_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) {
         }
     }
 
-    irq_restore(iflags);
+    // irq_restore(iflags);
 }
index 69c4e370aa5e6aba3ef510272c0e6f019450a755..1c01157a25b2d006a6d71fe9d57c89f722ae5088 100644 (file)
@@ -106,11 +106,35 @@ void mask_ack_i8259_irq(unsigned int irq) {
     }
 }
 
+void ack_i8259_irq(unsigned int irq) {
+    unsigned char mask = 0;
+
+    if (irq & 8)  // Slave
+    {
+#if PIC_AEOI
+        // ...
+#else
+        // Specific EOI to slave
+        outb(0x60 + (irq & 0x07), PIC_SLAVE_CMD);
+        // Specific EOI to master
+        outb(0x60 + (PIC_CASCADE_IR & 0x07), PIC_MASTER_CMD);
+#endif
+    } else  // Master
+    {
+#if PIC_AEOI
+        // ...
+#else
+        // Specific EOI to master
+        outb(0x60 + irq, PIC_MASTER_CMD);
+#endif
+    }
+}
+
 irq_chip_t i8259_chip = {
     .name = "XT-PIC",
     .enable = enable_i8259_irq,
     .disable = disable_i8259_irq,
-    .ack = mask_ack_i8259_irq,
+    .ack = ack_i8259_irq,
 };
 
 void do_i8259_IRQ(pt_regs_t *regs, unsigned int irq) {}
index 4a2030898f2ade9b8442d3b7da935fe26bb87632..2281a232e0ab2c5523caee79d6879dc02cf76634 100644 (file)
@@ -53,6 +53,7 @@ DEF_IRQ(0,F)
 .global _irq_handler
 .extern irq_handler
 .extern schedule
+.extern preempt_count
 _irq_handler:
     SAVE_REGS
 
@@ -69,7 +70,7 @@ _irq_handler:
     movl    %esp, %eax
     call    irq_handler
 
-    cmpl    $0, TI_preempt_cnt(%ebp)
+    cmpl    $0, (preempt_count)
     jnz     restore_regs
 
     call    schedule
index b9477050ca01a7b7263f9bfdea86a6d22551c6ca..54beee6415429c4d348f69de20ba19fa0abc3270 100644 (file)
@@ -18,6 +18,7 @@
 #include <atomic.h>
 #include <errno.h>
 #include <irq.h>
+#include <system.h>
 #include <task.h>
 
 irq_desc_t irq_desc[NR_IRQS];
@@ -41,27 +42,28 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
 
     irq_action_t *action = p->action;
 
-    atomic_inc(&(current->preempt_cnt));
+    atomic_inc(&preempt_count);
 
     unsigned long esp;
     asm("movl %%esp, %%eax" : "=a"(esp));
-    printl(MPL_PREEMPT, "current %08x cr3 %08x preempt %d esp %08x", current, current->cr3, current->preempt_cnt, esp);
+    printl(MPL_PREEMPT, "current %08x cr3 %08x preempt %d esp %08x", current, current->cr3, preempt_count, esp);
 
     p->chip->ack(irq);
-    sti();
 
     while (action && action->handler) {
         action->handler(irq, regs, action->dev_id);
         action = action->next;
     }
 
-    cli();
-    p->chip->enable(irq);
+    // sti();
+    // ....
+    // cli();
 
-    atomic_dec(&(current->preempt_cnt));
+    atomic_dec(&preempt_count);
 }
 
-int request_irq(unsigned int irq, void (*handler)(unsigned int, pt_regs_t *, void *), const char *devname, void *dev_id) {
+int request_irq(unsigned int irq, void (*handler)(unsigned int, pt_regs_t *, void *), const char *devname,
+                void *dev_id) {
     irq_action_t *p;
 
     if (irq >= NR_IRQS) return -EINVAL;
index fd5a8c7d4f78292e3ea5aa2977d8e09e4cb5aacf..8b445b1a6138ee6917f526084c98ac9a8b613692 100644 (file)
@@ -52,7 +52,6 @@ LIST_HEAD(delay_tasks);
 void init_root_task() {
     int i;
 
-    root_task.preempt_cnt = 0;
     root_task.pid = get_next_pid();
     root_task.ppid = 0;
     root_task.state = TASK_RUNNING;
index 2cba45389ea55e1da5269d2ee69d2458faeb3a65..0b90a7e728c89d8fff02258f62801396cf107ab8 100644 (file)
@@ -190,4 +190,6 @@ TSS tss;
 Desc idt[NIDT] __attribute__((__aligned__(8)));
 Desc gdt[NGDT] __attribute__((__aligned__(8)));
 char gdtr[6] __attribute__((__aligned__(4)));
-char idtr[6] __attribute__((__aligned__(4)));
\ No newline at end of file
+char idtr[6] __attribute__((__aligned__(4)));
+
+uint32_t preempt_count = 0x00;
\ No newline at end of file
index 6be1a2fd66819dfa634ce8c754b252ad25e0d5fa..5ba8cbba661d802032642935f43e9cd260e17c74 100644 (file)
@@ -11,6 +11,8 @@
 
 void disk_task_entry() {
     while (1) {
-        schedule();
+       // TODO
+       asm("hlt;");
+        //schedule();
     }
-}
\ No newline at end of file
+}
index 8a974141e7d680d8850aa361f40d9d6178f7ca49..77ac5df37d86325ca584696bfaee24e13c4ceed1 100644 (file)
@@ -19,9 +19,6 @@
 #include <system.h>
 #include <types.h>
 
-void disk_task_entry();
-void init_task_entry();
-void user_task_entry();
 int do_fork(pt_regs_t *regs, unsigned long flags);
 
 void kernel_task(char *name, void *entry) {