]> Zhao Yanbai Git Server - kernel.git/commitdiff
add lock into memory system
authorAceVest <zhaoyanbai@126.com>
Wed, 4 Jun 2014 16:14:53 +0000 (00:14 +0800)
committerAceVest <zhaoyanbai@126.com>
Wed, 4 Jun 2014 16:14:53 +0000 (00:14 +0800)
12 files changed:
drivers/ide.c
include/irq.h
include/system.h
include/task.h
kernel/fork.c
kernel/init.c
kernel/irq.c
kernel/sched.c
mm/buddy.c
mm/slub.c
setup/setup.c
setup/system.c

index edaa0bc006fe773ff39f0df32fb8c18d3537d99d..2d3bca39c8f4f280498981e6410a59ea48fc8ebc 100644 (file)
@@ -146,7 +146,7 @@ void ide_irq()
 
     insl(REG_DATA(0), buf, 512>>2);
     u16_t *s = (u16_t *) (buf+510);
-    printk("insw %04x\n", *s);
+    printk("hard disk data %04x\n", *s);
 }
 
 
@@ -218,7 +218,7 @@ void ide_read_identify()
 
 void ide_init()
 {
-    ide_read_identify();
+    //ide_read_identify();
     init_pci_controller(PCI_VENDORID_INTEL, 0x2829);
     init_pci_controller(PCI_VENDORID_INTEL, 0x7010);
 }
index 48573e97f95db29375221f7f3d224e9d3c8781fb..d13568493eb41221560423c872cd9d4f7d232a4c 100644 (file)
@@ -56,12 +56,19 @@ int    request_irq(unsigned int irq,
     const char *devname,
     void    *dev_id);
 
-static inline int enable_irq(unsigned int irq)
-{
-    return irq_desc[irq].chip->enable(irq);
-}
-static inline int disable_irq(unsigned int irq)
-{
-    return irq_desc[irq].chip->disable(irq);
-}
+int open_irq(unsigned int irq);
+int close_irq(unsigned int irq);
+
+#define enable_irq() asm("sti")
+#define disable_irq() asm("cli")
+
+#define irq_save(x) __asm__ __volatile__("pushfl; popl %0; cli":"=g"(x)::"memory")
+
+#define irq_restore(x) do { \
+    typecheck(unsigned long, x);    \
+    __asm__ __volatile__("pushl %0; popfl"::"g"(x):"memory", "cc"); \
+} while(0)
+
+
+
 #endif //_IRQ_H
index b595f55c13309d56ac22ad42fde52e04b8a46bca..aa90148dac2d15d9631a84f5b59bd2488c620b3d 100644 (file)
 #define PT_REGS_ESP     60
 #define PT_REGS_SS      64
 
-#ifndef    ASM
+#ifndef ASM
 #include "types.h"
 #include "printk.h"
 
 #define likely(x)       __builtin_expect(!!(x), 1)
 #define unlikely(x)     __builtin_expect(!!(x), 0)
 
+#define typecheck(type, x)          \
+({  type __dummy;                   \
+    typeof(x) __dummy2;             \
+    (void)(&__dummy == &__dummy2);  \
+    1;                              \
+})
+
 void    *kmalloc(size_t size, gfp_t gfpflags);
 void    kfree(void *addr);
 
index 6a20e8f856a5ab36e16b190d4a5c78b13b368da6..a59e4bd0ccb729692f6465e984c4bdd2524d3a87 100644 (file)
@@ -48,6 +48,8 @@ typedef union task_union
         unsigned long    esp;
         unsigned long    eip;
 
+        unsigned long   weight;
+
         pid_t        pid;
         pid_t        ppid;
         unsigned int state;
@@ -79,7 +81,9 @@ static inline task_union *get_current()
 
 #define current get_current()
 
-#define ROOT_TSK_PID    (0)
+#define ROOT_TSK_PID    (7)
+
+#define TASK_INIT_WEIGHT 10
 
 extern    ListHead    tsk_list;
 
index 61bc2927f3a08656227b0f3bf07b415a0b00d247..d593a60836f3b673e20247fbe3f69f158bbdcc13 100644 (file)
@@ -88,7 +88,7 @@ int do_fork(pt_regs_t *regs, unsigned long flags)
     printk("tsk %08x child_regs esp %08x esp0 %08x\n", tsk, tsk->esp, tsk->esp0);
 
     tsk->state = TASK_RUNNING;
-
+    tsk->weight= TASK_INIT_WEIGHT;
 
     INIT_LIST_HEAD(&tsk->list);
     // TODO Lock
index a9dbbde749ac5a8fc9e5917015c9235ba7afcfee..eca95200f4109a8fecb56297fd037b21b3658262 100644 (file)
@@ -21,12 +21,14 @@ Desc    gdt[NGDT];
 
 char __initdata kernel_init_stack[KRNL_INIT_STACK_SIZE] __attribute__ ((__aligned__(PAGE_SIZE)));
 
+static unsigned int eid = 0;
 void init_task_entry()
 {
     printk("hahahha %s\n", __func__);
+    unsigned int id = eid++;
     while(1)
     {
-        printk("i");
+        printk("%d", id);
         asm("sti;hlt;");
     }
 }
@@ -39,12 +41,24 @@ void root_task_entry()
             asm("sti;hlt;");
     }
 #endif
-    pt_regs_t regs;
-    memset((void*)&regs, 0, sizeof(regs));
-    regs.edx = (unsigned long) init_task_entry;
-    int pid = do_fork(&regs, FORK_KRNL);
+    {
+        pt_regs_t regs;
+        memset((void*)&regs, 0, sizeof(regs));
+        regs.edx = (unsigned long) init_task_entry;
+        int pid = do_fork(&regs, FORK_KRNL);
+        printk("a pid is %d\n", pid);
+    }
+
+
+    {
+        pt_regs_t regs;
+        memset((void*)&regs, 0, sizeof(regs));
+        regs.edx = (unsigned long) init_task_entry;
+        int pid = do_fork(&regs, FORK_KRNL);
+        printk("b pid is %d\n", pid);
+    }
+
 
-    printk("pid is %d\n", pid);
     while(1)
     {
         printk("r");
index 43c63d0913bb14293589af1cc4c7767737fdf7b7..fbee97fc904d172428d264a0599ffd7c0f92c44c 100644 (file)
@@ -110,3 +110,15 @@ int    request_irq(    unsigned int irq,
     //printk("irq: %d action:%x\n", irq, p);
     return 0;
 }
+
+
+
+int open_irq(unsigned int irq)
+{
+    return irq_desc[irq].chip->enable(irq);
+}
+
+int close_irq(unsigned int irq)
+{
+    return irq_desc[irq].chip->disable(irq);
+}
index 0ac9746a60de2642cc4ff263a48ce33c87d28c22..ddf5c40c5365525239da25f99a1c631c2ceb7a10 100644 (file)
@@ -23,9 +23,9 @@ task_union root_task __attribute__((__aligned__(PAGE_SIZE)));
 
 pid_t get_next_pid()
 {
-    static pid_t    g_pid = ROOT_TSK_PID;
+    static pid_t g_pid = ROOT_TSK_PID;
 
-    pid_t pid = g_pid;
+    pid_t pid = g_pid++;
 
     return pid;
 }
@@ -60,6 +60,7 @@ void init_root_tsk()
     root_task.pid    = get_next_pid();
     root_task.ppid   = 0;
     root_task.state  = TASK_RUNNING;
+    root_task.weight = TASK_INIT_WEIGHT;
     INIT_LIST_HEAD(&root_task.list);
 
     for(i=0; i<NR_OPENS; i++)
@@ -143,23 +144,32 @@ inline void context_switch(task_union * prev, task_union * next)
 
 unsigned long schedule()
 {
-    static task_union *last_sel = &root_task;
     task_union *sel = &root_task;
     task_union *p = 0;
     list_head_t *pos = 0;
 
-    list_for_each(pos, &(last_sel->list))
+    unsigned int max_weight = 0;
+
+    list_for_each(pos, &root_task.list)
     {
         p = list_entry(pos, task_union, list);
 
-        if(p->state == TASK_RUNNING)
+        if(p->state != TASK_RUNNING)
+            continue;
+
+        if(p->weight > max_weight)
         {
+            max_weight = p->weight;
             sel = p;
-            last_sel = sel;
-            break;
+        }
+        else if(p->weight == 0)
+        {
+            p->weight = TASK_INIT_WEIGHT;
         }
     }
 
+    sel->weight--;
+
     task_union *prev = current;
     task_union *next = sel;
 
@@ -168,7 +178,7 @@ unsigned long schedule()
 
 void debug_sched()
 {
-    task_union *p = list_entry(root_task.list.next, task_union, list);
+    task_union *p = list_entry(current->list.next, task_union, list);
     p->state = (p->state == TASK_RUNNING) ? TASK_INTERRUPTIBLE : TASK_RUNNING;
 }
 
index 8567ba80de04933e6691d34814607f441f2029cf..53b1b1cb556a35d746023524f2f132ca80437098 100644 (file)
@@ -7,6 +7,7 @@
  * ------------------------------------------------------------------------
  */
 #include <mm.h>
+#include <irq.h>
 #include <sysctl.h>
 
 struct buddy_system
@@ -93,7 +94,10 @@ unsigned long alloc_pages(unsigned int gfp_mask, unsigned int order)
     // gfp_mask
     // ...
 
+    unsigned long flags;
+    irq_save(flags);
     page_t *page = __alloc_pages(order);
+    irq_restore(flags);
 
     return (unsigned long) page2va(page);
 }
@@ -143,7 +147,10 @@ void free_pages(unsigned long addr)
 
     page_t *page = va2page(addr);
 
+    unsigned long flags;
+    irq_save(flags);
     __free_pages(page, page->order);
+    irq_restore(flags);
 }
 
 void dump_buddy_system()
index 5221ad7bffedc1dfa1103b4f5696d836f08af69c..ddd0c0604a1e54200e1b63163fc8a610c0799b6c 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -9,6 +9,7 @@
 
 #include <mm.h>
 #include <system.h>
+#include <irq.h>
 
 list_head_t slub_caches = LIST_HEAD_INIT(slub_caches);
 
@@ -174,6 +175,9 @@ static void *slub_alloc(kmem_cache_t *cache, gfp_t gfpflags)
     if(cache == 0)
         return 0;
 
+    unsigned long flags;
+    irq_save(flags);
+
     if(cache->page == 0 || cache->page->freelist == 0)
     {
         cache->page = 0;
@@ -186,6 +190,8 @@ static void *slub_alloc(kmem_cache_t *cache, gfp_t gfpflags)
         cache->page->inuse++;
     }
 
+    irq_restore(flags);
+
     return object;
 }
 
@@ -211,6 +217,9 @@ static void __slub_free(kmem_cache_t *cache, page_t *page, void *addr)
 
 static void slub_free(kmem_cache_t *cache, page_t *page, void *addr)
 {
+    unsigned long flags;
+    irq_save(flags);
+
     void **object = addr;
 
     page->inuse--;
@@ -224,6 +233,8 @@ static void slub_free(kmem_cache_t *cache, page_t *page, void *addr)
     {
         __slub_free(cache, page, addr);
     }
+
+    irq_restore(flags);
 }
 
 void *kmem_cache_alloc(kmem_cache_t *cache, gfp_t gfpflags)
@@ -245,6 +256,9 @@ void *kmalloc(size_t size, gfp_t gfpflags)
     unsigned int i;
     kmem_cache_t *cache = 0;
 
+    unsigned long flags;
+    irq_save(flags);
+
     for(i=0; i<SLUB_INIT_CACHE_SIZE; ++i)
     {
         kmem_cache_t *p = kmalloc_caches + i;
@@ -255,27 +269,42 @@ void *kmalloc(size_t size, gfp_t gfpflags)
         }
     }
 
-    return kmem_cache_alloc(cache, gfpflags);
+    void *addr = kmem_cache_alloc(cache, gfpflags);
+
+    irq_restore(flags);
+
+    return addr;
 }
 
 void kfree(void *addr)
 {
+    unsigned long flags;
+    irq_save(flags);
+
     page_t *page = get_head_page(va2page((unsigned long)addr));
     kmem_cache_t *cache = page->cache;
 
     slub_free(cache, page, addr);
+
+    irq_restore(flags);
 }
 
 kmem_cache_t *kmem_cache_create(const char *name, size_t size, size_t align)
 {
+
     kmem_cache_t *cache = kmalloc(sizeof(kmem_cache_t), 0);
     if(cache == 0)
         return 0;
 
+    unsigned long flags;
+    irq_save(flags);
+
     kmem_cache_init(cache, name, size, align);
 
     list_add(&(cache->list), &slub_caches);
 
+    irq_restore(flags);
+
     return cache;
 }
 
index 4fff3bdedb2ded261ce76367cd7e5934f64e3459..a8a27e10851679bec702ac67a1d8887039c5d93c 100644 (file)
@@ -34,7 +34,7 @@ extern void setup_ext2();
 
 extern void reboot();
 
-#define HZ 100
+#define HZ 10
 #define CLOCK_TICK_RATE 1193180
 #define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ)
 
index 77540f3ca98526b3cf8469fc1d5842591f6fef23..6b27976358f5e8ede17f382b60493191106b540f 100644 (file)
@@ -124,8 +124,9 @@ void    setup_irqs()
     }
 
     for(i=0; i<16; i++)
-        enable_irq(i);
-    asm("sti");
+        open_irq(i);
+
+    enable_irq();
 }
 
 void    set_tss()