]> Zhao Yanbai Git Server - kernel.git/commitdiff
add kmalloc/kfree
authorAceVest <zhaoyanbai@126.com>
Sat, 26 Apr 2014 03:44:17 +0000 (11:44 +0800)
committerAceVest <zhaoyanbai@126.com>
Sat, 26 Apr 2014 03:44:17 +0000 (11:44 +0800)
14 files changed:
Makefile
fs/ext2.c
include/mm.h
include/page.h
include/system.h
kernel/exec.c
kernel/innerint.c
kernel/irq.c
kernel/sched.c
kernel/test_task.c
mm/kmalloc.c
mm/page.c
mm/slub.c
setup/system.c

index 0822f74fc7bf70519e236b9420c0f384be218f09..b68a63c1764a430037dd5c2cbab2013cccefb2f9 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -10,15 +10,17 @@ INC_DIRS = include drivers
 CFLAGS += ${INC_DIRS:%=-I%}
 
 SOURCE_FILES := $(foreach DIR, $(SRC_DIRS), $(wildcard $(DIR)/*.[cS]))
+HEADER_FILES := $(foreach DIR, $(INC_DIRS), $(wildcard $(DIR)/*.h))
+
 OBJS := $(patsubst %,%.o,$(SOURCE_FILES))
 
 ${KERNELBIN}: ${OBJS}
        ld -M -T$(LINKSCRIPT) $(OBJS) -o $@ > $(SYSTEMMAP)
 
-%.S.o: %.S
+%.S.o: %.S ${HEADER_FILES}
        ${CC} ${CFLAGS} $< -o $@
 
-%.c.o: %.c
+%.c.o: %.c ${HEADER_FILES}
        ${CC} ${CFLAGS} $< -o $@
 
 c:
index da1ca6d6e08f4aa3dfa08a2523bd056ce0d5c9de..862b7c7ea72f91c347f6ce5012734f3387a8b8bd 100644 (file)
--- a/fs/ext2.c
+++ b/fs/ext2.c
@@ -53,7 +53,7 @@ void    setup_ext2()
         panic("Only Support Ext2 File System...");
 
     /* 分配group descriptor table 的内存 */
-    gdesc = (pGroupDesc) kmalloc(EXT2_BLOCK_SIZE);
+    gdesc = (pGroupDesc) kmalloc_old(EXT2_BLOCK_SIZE);
     if(gdesc == NULL)
         panic("out of memory for ext2 group descritpor table");
     /* 初始化ext2 group descriptor table */
@@ -89,7 +89,7 @@ void    setup_ext2()
         printk("%c", buf[i]);
 #endif
 #if 0
-    unsigned char *p = (char *)kmalloc(EXT2_BLOCK_SIZE);
+    unsigned char *p = (char *)kmalloc_old(EXT2_BLOCK_SIZE);
     ext2_read_block(0, p);
 
     for(i=0; i<512; i++)
@@ -138,14 +138,14 @@ int    ext2_read_inode(unsigned int n, pInode ino)
     gidx   %= EXT2_INODES_PER_BLOCK;
 
 
-    char *buf = kmalloc(EXT2_BLOCK_SIZE);
+    char *buf = kmalloc_old(EXT2_BLOCK_SIZE);
     if(buf == NULL)
         panic("faild read inode. out of memory");
     ext2_read_block(inotbl, buf);
 
     memcpy((void *)ino,(void*)(((pInode)buf)+gidx), EXT2_INODE_SIZE);
 
-    kfree(buf);
+    kfree_old(buf);
 
     return n;
 }
@@ -160,7 +160,7 @@ int ext2_read_file(const pInode ino, void *buf, size_t count)
     if(blks > EXT2_NDIR_BLOCKS)
         panic("file too large to read");
 
-    p = kmalloc(blks*EXT2_BLOCK_SIZE);
+    p = kmalloc_old(blks*EXT2_BLOCK_SIZE);
 
     if(p == NULL)
         panic("out of memory when search inode in directory");
@@ -173,7 +173,7 @@ int ext2_read_file(const pInode ino, void *buf, size_t count)
 
     memcpy(buf, p, count);
 
-    kfree(p);
+    kfree_old(p);
 
     return count;
 }
@@ -189,7 +189,7 @@ char *load_inode_content(const pInode ino)
         panic("unsupport file large than 12KB");
 
 
-    buf = kmalloc(blks*EXT2_BLOCK_SIZE);
+    buf = kmalloc_old(blks*EXT2_BLOCK_SIZE);
     if(buf == NULL)
         panic("out of memory when search inode in directory");
     for(i=0; i<blks; i++)
@@ -216,7 +216,7 @@ int ext2_search_file(const char *file, const pInode in, pInode out)
 #if 0
     buf = load_inode_content(in);
 #else
-    buf = kmalloc(in->i_size);
+    buf = kmalloc_old(in->i_size);
     ext2_read_file(in, buf, in->i_size);
 #endif
 
@@ -240,7 +240,7 @@ int ext2_search_file(const char *file, const pInode in, pInode out)
 
         ent = (pDirEnt)(ent->rec_len + (unsigned long)ent);
     }
-    kfree(buf);
+    kfree_old(buf);
 
     ext2_read_inode(inode_n, out);
 
index 8991274ba580d85f0e79bc80138d23338957ccff..2f6a75b2178ccf0187f0da3659a92162746c919e 100644 (file)
@@ -19,3 +19,4 @@ unsigned long bootmem_total_pages();
 unsigned long bootmem_page_state(unsigned long pfn);
 
 #define bootmem_alloc_pages(n) alloc_bootmem((n)*PAGE_SIZE, PAGE_SIZE)
+
index 57798cf65d2fdd1c67ee63ee61c5a4f015ba435a..7fc67f179211887bd2fb021e59bc915ad71fbef8 100644 (file)
@@ -69,10 +69,15 @@ typedef unsigned long pte_t;
 
 #define LOAD_CR3(pde)   asm("movl %%edx, %%cr3"::"d"(va2pa(pde)))
 
+
+typedef unsigned int gfp_t;
+
 enum page_flags {
     PG_Private,
 };
-
+struct kmem_cache;
+typedef struct kmem_cache kmem_cache_t;
 
 typedef struct page
 {
@@ -85,6 +90,8 @@ typedef struct page
     unsigned int order;
 
     void **freelist;    // for slub
+    kmem_cache_t *cache;
+
     unsigned long inuse;
 } page_t;
 
@@ -121,6 +128,26 @@ typedef struct free_area
 unsigned long alloc_pages(unsigned int gfp_mask, unsigned int order);
 void free_pages(unsigned long addr);
 
+
+struct kmem_cache
+{
+    const char *name;
+
+    unsigned long objsize;
+    unsigned long size;
+    unsigned long align;
+    unsigned long order;
+    unsigned long objects;
+
+    unsigned int partial_cnt;
+    list_head_t partial;
+
+    page_t *page;
+
+    list_head_t list;
+};
+
+
 // TODO Remove
 typedef struct page_
 {
index bdd5906fc7813b8bb4d7a09cb5f875bce1fedf69..7a071dc4f5f4ed508ce1bc9ee2bebafe599305bf 100644 (file)
 #define likely(x)       __builtin_expect(!!(x), 1)
 #define unlikely(x)     __builtin_expect(!!(x), 0)
 
-void    *kmalloc(size_t size);
-void    kfree(void *p);
+void    *kmalloc(size_t size, gfp_t gfpflags);
+void    kfree(void *addr);
 
+void    *kmalloc_old(size_t size);
+void    kfree_old(void *p);
 
 static inline void *get_virt_pages(unsigned int n)
 {
     assert(n>0);
     size_t    size = n << PAGE_SHIFT;
-    return (void*) kmalloc(size);
+    return (void*) kmalloc_old(size);
 }
 static inline void free_virt_pages(void *p)
 {
-    kfree((void *)p);
+    kfree_old((void *)p);
 }
 static inline void *get_phys_pages(unsigned int n)
 {
 /*
     assert(n>0);
     size_t    size = n << PAGE_SHIFT;
-    return (void*) va2pa(kmalloc(size));
+    return (void*) va2pa(kmalloc_old(size));
 */
     return (void *)va2pa(get_virt_pages(n));
 }
index f8d3557f0a5d3bc41facd86da7983b596af1d277..a3390bad33a12fe9246f66edf276ad1383589af0 100644 (file)
@@ -43,7 +43,7 @@ int sysc_exec(const char *path, char *const argv[])
         printk("file %s is not exist\n", path);
         return -ENOENT;
     }
-    buf = (void*)kmalloc(filesz);
+    buf = (void*)kmalloc_old(filesz);
     sysc_read(fd, buf, filesz);
 
 #if 0    
@@ -56,7 +56,7 @@ int sysc_exec(const char *path, char *const argv[])
     if(strncmp(ELFMAG, ehdr->e_ident, sizeof(ELFMAG)-1) != 0)
     {
         printk("file %s can not execute\n", path);
-        kfree(buf);
+        kfree_old(buf);
         return -ENOEXEC;
     }
     //printk("Entry: %08x phnum:%d\n", ehdr->e_entry, ehdr->e_phnum);
@@ -76,7 +76,7 @@ int sysc_exec(const char *path, char *const argv[])
         }
     }
 
-    char *exe = (char *) kmalloc(size);
+    char *exe = (char *) kmalloc_old(size);
     for(i=0; i<ehdr->e_phnum; i++)
     {
         pElf32_Phdr phdr;
@@ -190,7 +190,7 @@ int sysc_exec(const char *path, char *const argv[])
     printk("stack pt: %08x pde:%08x %08x %08x\n",
         pt, pde, pd[get_npd(KRNLADDR)-1]);
 #endif
-    kfree(buf);
+    kfree_old(buf);
 
 
     //printk("eip: %08x \n", regs->eip);
index 58fcd91b022838aa29b4fbff33def706335761b2..ec460baaf05f0dbe604228ad21f1f6c600ab6acf 100644 (file)
@@ -97,7 +97,7 @@ void doPageFault(PtRegs regs)
         current, errcode, addr, cr3);
 */
 
-    if((errcode & (1UL<<PAGE_P)) == 0)
+    if((errcode & PAGE_P) == 0)
     {
         extern    void    do_no_page(void *);
         do_no_page(addr);
index 8d5891d95002296df419caed4801c6cddd7847b8..8f6943f7ab21c24f372c06e720481fe1fa844a2c 100644 (file)
@@ -79,7 +79,7 @@ int    request_irq(    unsigned int irq,
         p = p->next;
     }
 
-    p = kmalloc(sizeof(IrqAction));
+    p = kmalloc_old(sizeof(IrqAction));
     if(p == NULL)
         return -ENOMEM;
 
index 4172ecc4813191a6eee597b3970b8df04d9d10f4..f60ef1758843ff6ca19f8ef428bbe47e4189f885 100644 (file)
@@ -72,7 +72,7 @@ void    init_root_tsk()
     current = root_task;
 /*
     // 栈
-    void *stack = kmalloc(PAGE_SIZE);
+    void *stack = kmalloc_old(PAGE_SIZE);
     if(stack == NULL)
         panic("stack");
     stack = va2pa(stack);
@@ -80,7 +80,7 @@ void    init_root_tsk()
     printk("Stack : %08x\n", stack);
 
     u32 *pde = pa2va(current->cr3);
-    u32 *pte = (u32 *)kmalloc(PAGE_SIZE);
+    u32 *pte = (u32 *)kmalloc_old(PAGE_SIZE);
     if(pte == NULL)
         panic("root task stack pte");
     pte[1023] = stack + 7;
index 4aab2aab8be90e650196419c910231864c900d45..2dce5811dafbc289fb5f547725a6eb0b5aba84ff 100644 (file)
@@ -37,7 +37,7 @@ void    add_task(void *fun)
 #if 0
     assert(fun != NULL);
     pTask    tsk = NULL;
-    tsk = kmalloc(sizeof(Task));
+    tsk = kmalloc_old(sizeof(Task));
     if(tsk == NULL)
         panic("shit happens");
 
@@ -71,7 +71,7 @@ void    add_task(void *fun)
     {
         if(tTasks[i] == NULL)
         {
-            tsk = kmalloc(sizeof(Task));
+            tsk = kmalloc_old(sizeof(Task));
             if(tsk == NULL)
                 panic("shit happens");
             //tTasks[i] = tsk;
index 443ae8034001877e415a9a4deac6167c492360a2..b6f7b9aef22e836eae5c28c0612c3bd8d34f12b1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *--------------------------------------------------------------------------
- *   File Name: kmalloc.c
+ *   File Name: kmalloc_old.c
  * 
  *      Author: Zhao Yanbai [zhaoyanbai@126.com]
  *              Sat Jan 30 12:15:51 2010
@@ -31,7 +31,7 @@ static    get_order(size_t size)
     //printk("i:%d\n", i);
     return i;
 }
-void    *kmalloc(size_t size)
+void    *kmalloc_old(size_t size)
 {
     assert(0<size && size<=32*PAGE_SIZE);
     int    order = get_order(size);
@@ -41,21 +41,21 @@ void    *kmalloc(size_t size)
     if(page == NULL)
         return NULL;
 
-    //printk("kmalloc:%08x %08x ", page->mapNR, page->mapNR<<PAGE_SHIFT);
+    //printk("kmalloc_old:%08x %08x ", page->mapNR, page->mapNR<<PAGE_SHIFT);
     p = (void*)pa2va(page->mapNR<<PAGE_SHIFT);
     
-    //printk("kmalloc: %08x\n", p);
+    //printk("kmalloc_old: %08x\n", p);
 
     return p;
 }
 
 
-void    kfree(void *p)
+void    kfree_old(void *p)
 {
     assert(p != NULL);
 
     pPage page = system.page_map;
-    //printk("kfree:%08x %08x %08x ", p, va2pa(p));
+    //printk("kfree_old:%08x %08x %08x ", p, va2pa(p));
     page += ((unsigned long)va2pa(p)>>PAGE_SHIFT);
     //printk("%08x\n", page->mapNR);
     old_free_pages(page);
index 5181754ffd697e2d4d24ede873fa54562b263c1a..8b1c6306164595b30c17eaa244fbc5a1b35a2625 100644 (file)
--- a/mm/page.c
+++ b/mm/page.c
@@ -63,7 +63,7 @@ void    do_no_page(void *addr)
 #if 0
     u32    *pde = (u32*)pa2va(current->cr3);
     u32    *pte;
-    void    *page = (void*)va2pa(kmalloc(PAGE_SIZE));
+    void    *page = (void*)va2pa(kmalloc_old(PAGE_SIZE));
     if(page == NULL)
         panic("failed alloc page");
 
@@ -73,7 +73,7 @@ void    do_no_page(void *addr)
     if(pde[npde] == 0)
     {
         printk("*a*");
-        pte = (u32 *) kmalloc(PAGE_SIZE);
+        pte = (u32 *) kmalloc_old(PAGE_SIZE);
         memset((void*)pte, 0, PAGE_SIZE);
         if(pte == NULL)
             panic("failed alloc pte");
index 0ab0a18e044d39465c2a1a11d0eff106fbd1ca1f..2c817b6d7fb4938effeec315eaa37e37f8031faf 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
 
 list_head_t slub_caches = LIST_HEAD_INIT(slub_caches);
 
-typedef struct kmem_cache
-{
-    const char *name;
-
-    unsigned long objsize;
-    unsigned long size;
-    unsigned long align;
-    unsigned long order;
-    unsigned long objects;
-
-    unsigned int partial_cnt;
-    list_head_t partial;
-
-    page_t *page;
-
-//    void **freelist;
-
-    list_head_t list;
-} kmem_cache_t;
-
 
 #define SLUB_MIN_SHIFT          5
 #define SLUB_MAX_SHIFT          12
@@ -41,8 +21,6 @@ typedef struct kmem_cache
 
 static kmem_cache_t kmalloc_caches[SLUB_INIT_CACHE_SIZE];
 
-typedef unsigned int gfp_t;
-
 static bool calculate_params(kmem_cache_t *cache)
 {
     // calculate size
@@ -101,7 +79,6 @@ static bool kmem_cache_init(kmem_cache_t *cache,
     cache->objsize      = size;
     cache->align        = align;
     cache->page         = 0;
-    //cache->freelist     = 0;
     cache->partial_cnt  = 0;
     INIT_LIST_HEAD(&(cache->partial));
 
@@ -140,7 +117,6 @@ static page_t *new_slub(kmem_cache_t *cache, gfp_t gfpflags)
     if(0 == page)
         return 0;
 
-
     end = bgn + cache->objects*cache->size;
 
     unsigned long last = bgn;
@@ -155,6 +131,7 @@ static page_t *new_slub(kmem_cache_t *cache, gfp_t gfpflags)
 
     page->freelist = (void **)bgn;
     page->inuse    = 0;
+    page->cache    = cache;
 
     return page;
 }
@@ -199,6 +176,9 @@ static void *slub_alloc(kmem_cache_t *cache, gfp_t gfpflags)
 {
     void **object = 0;
 
+    if(cache == 0)
+        return 0;
+
     unsigned long objsize = cache->objsize;
 
     if(cache->page == 0 || cache->page->freelist == 0)
@@ -251,6 +231,11 @@ static void slub_free(kmem_cache_t *cache, page_t *page, void *addr)
     }
 }
 
+void *kmem_cache_alloc(kmem_cache_t *cache, gfp_t gfpflags)
+{
+    return slub_alloc(cache, gfpflags);
+}
+
 void kmem_cache_free(kmem_cache_t *cache, void *addr)
 {
     page_t *page = 0;
@@ -260,6 +245,32 @@ void kmem_cache_free(kmem_cache_t *cache, void *addr)
     slub_free(cache, page, addr);
 }
 
+void *kmalloc(size_t size, gfp_t gfpflags)
+{
+    unsigned int i;
+    kmem_cache_t *cache = 0;
+
+    for(i=0; i<SLUB_INIT_CACHE_SIZE; ++i)
+    {
+        kmem_cache_t *p = kmalloc_caches + i;
+        if(p->objsize > size)
+        {
+            cache = p;
+            break;
+        }
+    }
+
+    return kmem_cache_alloc(cache, gfpflags);
+}
+
+void kfree(void *addr)
+{
+    page_t *page = get_head_page(va2page((unsigned long)addr));
+    kmem_cache_t *cache = page->cache;
+
+    slub_free(cache, page, addr);
+}
+
 
 void init_slub_system()
 {
@@ -269,9 +280,7 @@ void init_slub_system()
     for(i=SLUB_MIN_SHIFT; i<SLUB_MAX_SHIFT; ++i)
     {
         cache = kmalloc_caches + i - SLUB_MIN_SHIFT;
-        kmem_cache_init(cache, "kmalloc", 1UL<<i, KMALLOC_MIN_ALIGN);
-
-        //cache->inx = i;
+        kmem_cache_init(cache, "kmalloc_old", 1UL<<i, KMALLOC_MIN_ALIGN);
 
         list_add(&(cache->list), &slub_caches);
     }
index b79581131cecf4d72dce7084d02da1984dfc14fb..c5e6881cfa7216794b69949fae98cddc1265d5f3 100644 (file)
@@ -137,8 +137,8 @@ void    setup_irqs()
     pIRQAction    pKbdAction, pClkAction;
 
 
-    pKbdAction    = (pIRQAction) kmalloc(sizeof(IRQAction));
-    pClkAction    = (pIRQAction) kmalloc(sizeof(IRQAction));
+    pKbdAction    = (pIRQAction) kmalloc_old(sizeof(IRQAction));
+    pClkAction    = (pIRQAction) kmalloc_old(sizeof(IRQAction));
 
 
     assert(pKbdAction != NULL);