]> Zhao Yanbai Git Server - kernel.git/commitdiff
优化中断处理函数;更改进程调度
authoracevest <zhaoyanbai@126.com>
Mon, 1 Nov 2021 07:41:28 +0000 (15:41 +0800)
committeracevest <zhaoyanbai@126.com>
Wed, 3 Nov 2021 02:45:45 +0000 (10:45 +0800)
include/task.h
kernel/clock.c
kernel/fork.c
kernel/init.c
kernel/interrupts.S
kernel/irq.c
kernel/sched.c
kernel/setup.c
kernel/system.c
mm/mm.c

index a29f682656d783a770a9cec2406d6e7d63744340..aa0128d74b53bc41341603db2c807d552848016c 100644 (file)
@@ -54,6 +54,7 @@ typedef union task_union
         unsigned long eip;
 
         long weight;
+        long priority;
 
         pid_t pid;
         pid_t ppid;
index 8526d1d79158495e86a9b46d8b45284e337dbb7d..61a777242006ffa4cc2193894c4f66d2b1c92a99 100644 (file)
@@ -25,5 +25,5 @@ void clk_handler(unsigned int irq, pt_regs_t *regs, void *dev_id)
     jiffies++;
 
     //printd("^");
-    printl(MPL_CLOCK, "clock irq: %d", jiffies);
+    //printl(MPL_CLOCK, "clock irq: %d", jiffies);
 }
index 041c3a29483bf564553e151dc8bca9f10f531dc2..bb72222fab6780ce9f8d0e9ce199834228e07550 100644 (file)
@@ -21,16 +21,19 @@ int sysc_fork(pt_regs_t regs)
 extern void ret_from_fork_user();
 extern void ret_from_fork_krnl();
 extern pid_t get_next_pid();
-
+extern list_head_t all_tasks;
 int do_fork(pt_regs_t *regs, unsigned long flags)
 {
     task_union *tsk;
     tsk = alloc_task_union();
+
     printk("fork task %08x flags %08x\n", tsk, flags);
     if (tsk == NULL)
         panic("can not malloc PCB");
 
     memcpy(tsk, current, sizeof(task_union));
+    strcpy(tsk->name, "init");
+    tsk->priority = 61;
 
     //{
     tsk->cr3 = (unsigned long)alloc_one_page(0);
@@ -118,7 +121,7 @@ int do_fork(pt_regs_t *regs, unsigned long flags)
 
     unsigned long iflags;
     irq_save(iflags);
-    list_add(&tsk->list, &root_task.list);
+    list_add(&tsk->list, &all_tasks);
     irq_restore(iflags);
 
     printk("%s:%d\n", __func__, __LINE__);
index 8a0288c0df21a850c603e61dfc39430254acd396..3f9a0c1b10215fb160e22d30938c0b2622d273a4 100644 (file)
@@ -42,7 +42,8 @@ void init_task_entry()
     while (1)
     {
         sysc_test();
-        //printl(MPL_TASK_1+id-1, "task:%d [%08x] weight %d cnt %d", id, current, current->weight, cnt++);
+        printl(MPL_TASK_1 + id - 1, "task:%d [%08x] weight %d cnt %d", id, current, current->weight, cnt++);
+        //printl(MPL_TASK_1, "task:%d [%08x] weight %d cnt %d", id, current, current->weight, cnt++);
         int v = 0; //debug_wait_queue_get();
         //printk("task:%d wait queue get %d\n", id, v);
     }
@@ -61,15 +62,16 @@ void kernel_task(void *entry)
 void root_task_entry()
 {
 
-    kernel_task(init_task_entry);
-    kernel_task(user_task_entry);
-    kernel_task(init_task_entry);
+    //kernel_task(init_task_entry);
+    //kernel_task(user_task_entry);
+    //kernel_task(init_task_entry);
 
     int cnt = 0;
     while (1)
     {
         sysc_test();
-        //printl(MPL_ROOT, "root:0 [%08x] weight %d cnt %d", current, root_task.weight, cnt++);
+        printl(MPL_ROOT, "root:0 [%08x] weight %d cnt %d", current, root_task.weight, cnt++);
+        //printk("root:0 [%08x] weight %d cnt %d", current, current->weight, cnt++);
         asm("sti;hlt;");
         sysc_test();
         //syscall0(SYSC_TEST);
index e459c7ce9bf3893e903de4308bab26bbe686df14..4a2030898f2ade9b8442d3b7da935fe26bb87632 100644 (file)
@@ -56,6 +56,10 @@ DEF_IRQ(0,F)
 _irq_handler:
     SAVE_REGS
 
+    // ebp指向栈桢
+    movl    $-TASK_SIZE, %ebp
+    andl    %esp, %ebp
+
     movw    %ss, %ax
     movw    %ax, %ds
     movw    %ax, %es
@@ -65,29 +69,12 @@ _irq_handler:
     movl    %esp, %eax
     call    irq_handler
 
-    movl    $-TASK_SIZE, %ebp
-    andl    %esp, %ebp
-
-    movl    PT_REGS_CS(%esp), %eax
-    testl   $0x0003, %eax
-    jz      resume_kernel
-
-return:
     cmpl    $0, TI_preempt_cnt(%ebp)
     jnz     restore_regs
 
-resched:
-
     call    schedule
 
 restore_regs:
-
     RESTORE_REGS
-    
     addl    $4, %esp
-
     iret
-
-resume_kernel:
-    # ... 
-    jmp     return
index 57f2e2f6419d6ba86edef252cf6b4dfe5c798673..c6579b7364628f1427d07975d840496ca6557267 100644 (file)
@@ -61,11 +61,13 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs)
 
     p->chip->ack(irq);
     sti();
+
     while (action && action->handler)
     {
         action->handler(irq, regs, action->dev_id);
         action = action->next;
     }
+
     cli();
     p->chip->enable(irq);
 
index 7080735642bef06ad0204cf37283a02301c18cbc..af94d2e380ab44fb7a0d6ad98f8f97fd4fea0ba4 100644 (file)
@@ -25,7 +25,7 @@ pid_t get_next_pid()
 {
     static pid_t g_pid = ROOT_TSK_PID;
 
-    pid_t pid = g_pid++;
+    pid_t pid = ++g_pid;
 
     return pid;
 }
@@ -36,6 +36,9 @@ void load_cr3(task_union *tsk)
 }
 
 extern pde_t __initdata init_pgd[PDECNT_PER_PAGE] __attribute__((__aligned__(PAGE_SIZE)));
+
+list_head_t all_tasks;
+
 void init_root_tsk()
 {
     int i;
@@ -49,8 +52,11 @@ void init_root_tsk()
     root_task.ppid = 0;
     root_task.state = TASK_RUNNING;
     root_task.weight = TASK_INIT_WEIGHT;
-    strcpy(root_task.name, "root_task");
-    INIT_LIST_HEAD(&root_task.list);
+    root_task.priority = 100;
+    strcpy(root_task.name, "root");
+
+    INIT_LIST_HEAD(&all_tasks);
+    list_add(&root_task.list, &all_tasks);
 
     //  TODO
     //for(i=0; i<NR_OPENS; i++)
@@ -124,7 +130,7 @@ task_union *find_task(pid_t pid)
 
     unsigned long iflags;
     irq_save(iflags);
-    list_for_each_safe(pos, tmp, &root_task.list)
+    list_for_each_safe(pos, tmp, &all_tasks)
     {
         p = list_entry(pos, task_union, list);
         if (p->pid == pid)
@@ -153,14 +159,17 @@ static const char *task_state(unsigned int state)
 unsigned long schedule()
 {
     static turn = 0;
-    task_union *sel = 0;
+    task_union *sel = &root_task;
     task_union *p = 0;
     list_head_t *pos = 0, *t = 0;
 
     unsigned long iflags;
     irq_save(iflags);
     printl(MPL_ROOT, "root:%d [%08x] cnt %u", root_task.pid, &root_task, root_task.cnt);
-    list_for_each_safe(pos, t, &root_task.list)
+
+    unsigned int min_ratio = ~0U;
+
+    list_for_each_safe(pos, t, &all_tasks)
     {
         p = list_entry(pos, task_union, list);
 
@@ -173,19 +182,22 @@ unsigned long schedule()
 
         printd("%08x %s weight %d\n", p, p->name, p->weight);
 
-        if (sel == 0 && p->weight != turn)
+        unsigned int ratio = p->weight / p->priority;
+        if (ratio < min_ratio)
         {
-            p->weight = turn;
             sel = p;
+            min_ratio = ratio;
+        }
+
+        p->weight++;
+        if (p->weight > p->priority)
+        {
+            p->weight = 0;
         }
     }
     irq_restore(iflags);
 
-    if (sel == 0)
-    {
-        sel = &root_task;
-        turn++;
-    }
+    sel = &root_task;
 
     task_union *prev = current;
     task_union *next = sel;
index 04a0bf35e7729ac72ae1c1cdfec09b942534ae5f..562febaf37443c9c4b51bcfc555d05f4e8e312a1 100644 (file)
@@ -34,7 +34,7 @@ extern void reboot();
 extern void cnsl_init();
 extern void vga_init();
 
-#define HZ 10
+#define HZ 100
 #define CLOCK_TICK_RATE 1193180
 #define LATCH ((CLOCK_TICK_RATE + HZ / 2) / HZ)
 
@@ -84,6 +84,8 @@ void setup_kernel()
     setup_tasks();
 
     setup_irqs();
+    return;
+
     //switch_printk_screen();
     setup_pci();
     //switch_printk_screen();
index c9e9b9bb0bd1ccc7f8574a5d6792df81ec96752f..c10c86f3c00ac20c3195fd98913c0af8c2c6aa34 100644 (file)
@@ -71,6 +71,9 @@ void setup_gate()
     set_sys_int(0x0E, TRAP_GATE, PRIVILEGE_KRNL, PageFault);
     set_sys_int(0x10, TRAP_GATE, PRIVILEGE_KRNL, CoprocError);
 
+    for (i = 0x11; i < 0x20; i++)
+        set_sys_int(i, INTR_GATE, PRIVILEGE_KRNL, no_irq_handler);
+
     for (i = 0x20; i < 256; i++)
         set_sys_int(i, INTR_GATE, PRIVILEGE_KRNL, no_irq_handler);
 
diff --git a/mm/mm.c b/mm/mm.c
index 6f0adcf98037ef9a59dc8df0680faad5d783ef04..115f9158926dbf22d69be6f5488ddf5d5804312d 100644 (file)
--- a/mm/mm.c
+++ b/mm/mm.c
@@ -311,6 +311,10 @@ void init_paging()
     unsigned long pfn = 0;
     pte_t *pte = 0;
     unsigned long pgtb_addr = 0;
+
+    // 在multiboot.S是已经初始化了BOOT_INIT_PAGETBL_CNT个页
+    // 这里接着初始化剩余的页
+    // 最大限制内存1G
     for (pfn = pa2pfn(BOOT_INIT_PAGETBL_CNT << 22); pfn < bootmem_data.max_pfn; ++pfn)
     {
         unsigned long ti = pfn % PAGE_PTE_CNT;