]> Zhao Yanbai Git Server - kernel.git/commitdiff
prebuild buddy system from bootmem
authorAceVest <zhaoyanbai@126.com>
Fri, 4 Apr 2014 15:38:54 +0000 (23:38 +0800)
committerAceVest <zhaoyanbai@126.com>
Fri, 4 Apr 2014 15:38:54 +0000 (23:38 +0800)
include/mm.h
include/page.h
mm/buddy.c
mm/kmalloc.c
mm/mm.c
mm/page.c
scripts/link.ld
setup/setup.c

index dbf85967ddb8a4362060f9d06b624a2f69118371..8991274ba580d85f0e79bc80138d23338957ccff 100644 (file)
 
 #include <page.h>
 
+#define BOOTMEM_PAGE_FREE 0
+#define BOOTMEM_PAGE_USED 1
+
 void *alloc_bootmem(unsigned long size, unsigned long align);
+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 61911ebfa85305dab22ce6b807e4876ccc2d0445..d1cdc2d6b4aec4c9f6a53aa4d93dc0441e1cec92 100644 (file)
@@ -63,14 +63,18 @@ typedef unsigned long pte_t;
 
 #define LOAD_CR3(pde) asm("movl %%edx, %%cr3"::"d"(va2pa(pde)))
 
-#define MAX_ORDER    (11)
+#define MAX_OLD_ORDER    (11)
 
 typedef struct page
 {
-    
-
+    unsigned long index;
 } page_t;
 
+typedef struct free_area
+{
+    unsigned long count;
+} free_area_t;
+
 // TODO Remove
 typedef struct page_
 {
index 55fec7ff079cd162519849dab96be467bdcd75cf..eab076c111fa95fe8981f0399fd79d7c81bfc27e 100644 (file)
@@ -8,8 +8,42 @@
  */
 #include <mm.h>
 
+#define MAX_ORDER       4
+struct buddy_system
+{
+    page_t      **page_map;
+    free_area_t free_area[MAX_ORDER + 1];
+};
+
+struct buddy_system buddy_system;
+
 void init_buddy_system()
 {
+    unsigned long pfn_cnt = bootmem_total_pages();
+
+    buddy_system.page_map = alloc_bootmem(pfn_cnt*sizeof(page_t*), sizeof(page_t*));
+    if(0 == buddy_system.page_map) {
+        printk("can not go on playing...\n");
+        while(1);
+    }
 
+    unsigned long i;
+    for(i=0; i<pfn_cnt; ++i)
+    {
+        buddy_system.page_map[i] = alloc_bootmem(sizeof(page_t), sizeof(unsigned long));
+        if(0 == buddy_system.page_map[i]) {
+            printk("can not go on playing...\n");
+            while(1);
+        }
+    }
 
+    for(i=0; i<pfn_cnt; ++i)
+    {
+        if(BOOTMEM_PAGE_FREE == bootmem_page_state(i))
+        {
+            // free to buddy system
+        }
+        
+        buddy_system.page_map[i]->index = i;
+    }
 }
index bd5d996b379713615aaa40c570b747acfa2e9c97..6fdd2f4c57b073a290faff9fc4075fd592e7a0fa 100644 (file)
@@ -22,7 +22,7 @@ static    get_order(size_t size)
     //printk(" %08x\n", size);
     int i;
     int n = size>>PAGE_SHIFT;
-    for(i=0; i<MAX_ORDER; i++)
+    for(i=0; i<MAX_OLD_ORDER; i++)
     {
         if(n<=(1UL<<i))
             break;
diff --git a/mm/mm.c b/mm/mm.c
index b669fabc31d4ff51d20e86861886c6ff21755994..91c8a0876065c3bbf2458e36afff76662a130beb 100644 (file)
--- a/mm/mm.c
+++ b/mm/mm.c
@@ -25,6 +25,7 @@
 
 extern char kernel_begin, kernel_end;
 extern char etext,edata,end;
+extern void init_buddy_system();
 
 static void e820_print_type(unsigned long type)
 {
@@ -67,7 +68,6 @@ void e820_print_map()
     }
 }
 
-
 typedef struct bootmem_data {
     unsigned long min_pfn;
     unsigned long max_pfn;
@@ -79,9 +79,18 @@ typedef struct bootmem_data {
     unsigned long mapsize;
 } bootmem_data_t;
 
+
 bootmem_data_t bootmem_data;
 
+unsigned long bootmem_total_pages()
+{
+    return bootmem_data.max_pfn;
+}
 
+unsigned long bootmem_page_state(unsigned long pfn)
+{
+    return constant_test_bit(pfn, bootmem_data.bitmap);
+}
 
 void e820_init_bootmem_data()
 {
@@ -100,8 +109,8 @@ void e820_init_bootmem_data()
         if(p->type != E820_RAM)
             continue;
 
-        bgn_pfn = pa2pfn(p->addr);
-        end_pfn = pa2pfn(p->addr + p->size);
+        bgn_pfn = PFN_UP(p->addr);
+        end_pfn = PFN_DW(p->addr + p->size);
 
         if(bootmem_data.max_pfn < end_pfn)
             bootmem_data.max_pfn = end_pfn;
@@ -110,7 +119,7 @@ void e820_init_bootmem_data()
     bootmem_data.min_pfn = 0;
 
     // limit max_pfn
-    unsigned long max_support_pfn = pa2pfn(MAX_SUPT_PHYMM_SIZE);
+    unsigned long max_support_pfn = PFN_DW(MAX_SUPT_PHYMM_SIZE);
     if(bootmem_data.max_pfn > max_support_pfn)
     {
         bootmem_data.max_pfn = max_support_pfn;
@@ -137,7 +146,6 @@ void register_bootmem_pages()
             test_and_clear_bit(j, bootmem_data.bitmap);
         }
     } 
-
 }
 
 void reserve_bootmem(unsigned long bgn_pfn, unsigned long end_pfn)
@@ -240,7 +248,7 @@ find_block:
 
         for(i=bgn_pfn; i<search_end_pfn; ++i)
         {
-            if(constant_test_bit(i, pbd->bitmap) != 0) {    // space not enough
+            if(bootmem_page_state(i) != BOOTMEM_PAGE_FREE) {    // space not enough
                 bgn_pfn = ALIGN(i, step);
                 if(bgn_pfn == i)
                     bgn_pfn += step;
@@ -328,4 +336,5 @@ void init_mm()
     printk("init global paging...\n");
     init_paging();
     printk("init buddy system...\n");
+    init_buddy_system();
 }
index e81f06c5469149e7d07ae6d7a41ec8a0e0fa0583..e0c4d6511c70f2e8fbd8eac6a8e6921c59005f6b 100644 (file)
--- a/mm/page.c
+++ b/mm/page.c
 #include <mm.h>
 
 
+
 #define get_page_from_list(pList) list_entry(pList, Page, list)
 #define add_page2list(page, order) \
         list_add(&page->list, &freeArea[order].freeList)
 
-FreeArea freeArea[MAX_ORDER];
+FreeArea freeArea[MAX_OLD_ORDER];
 
 #if 1
 void    do_no_page(void *addr)
@@ -133,7 +134,7 @@ void do_wp_page(void *addr)
 
 inline pPage __alloc_pages(unsigned int order, unsigned int alloc_order)
 {
-    assert(0 <= order && order<MAX_ORDER);
+    assert(0 <= order && order<MAX_OLD_ORDER);
     assert(!list_is_empty(&freeArea[order].freeList));
     assert(alloc_order <= order);
 
@@ -178,11 +179,11 @@ inline pPage __alloc_pages(unsigned int order, unsigned int alloc_order)
 
 pPage    alloc_pages(unsigned int order)
 {
-    if(order<0 || order>=MAX_ORDER)
+    if(order<0 || order>=MAX_OLD_ORDER)
         return NULL;
 
     int i;
-    for(i=order; i<MAX_ORDER; i++)
+    for(i=order; i<MAX_OLD_ORDER; i++)
     {
         if(list_is_empty(&freeArea[i].freeList))
             continue;
@@ -195,7 +196,7 @@ pPage    alloc_pages(unsigned int order)
 
 pPage    get_buddy_page(pPage page, unsigned int order)
 {
-    assert(0<=order && order<MAX_ORDER);
+    assert(0<=order && order<MAX_OLD_ORDER);
     assert(page != NULL);
 
     //printk("mapnr: %d order:%d %d\n", page->mapNR, order, 1UL<<order);
@@ -229,7 +230,7 @@ void    free_pages(pPage page)
 {
     assert(page != NULL);
     unsigned int order = page->order;
-    assert(0<=order && order<MAX_ORDER);
+    assert(0<=order && order<MAX_OLD_ORDER);
 
 
     // buddy page
@@ -239,7 +240,7 @@ void    free_pages(pPage page)
     //printk("<%d %d>", bpage->mapNR, bpage->order);
     
 
-    if(bpage == NULL || order == MAX_ORDER-1)
+    if(bpage == NULL || order == MAX_OLD_ORDER-1)
     {
         add_page2list(page, order);
     }
@@ -264,7 +265,7 @@ void    free_pages(pPage page)
 
 inline pPage __alloc_pages(unsigned int order, unsigned int alloc_order)
 {
-    assert(0 <= order && order<MAX_ORDER);
+    assert(0 <= order && order<MAX_OLD_ORDER);
     assert(!list_is_empty(&freeArea[order].freeList));
     assert(alloc_order <= order);
 
@@ -289,11 +290,11 @@ inline pPage __alloc_pages(unsigned int order, unsigned int alloc_order)
 
 pPage alloc_pages(unsigned int order)
 {
-    if(order >= MAX_ORDER)
+    if(order >= MAX_OLD_ORDER)
         return NULL;
 
     int i;
-    for(i=order; i<MAX_ORDER; i++)
+    for(i=order; i<MAX_OLD_ORDER; i++)
     {
         if(list_is_empty(&freeArea[i].freeList))
             continue;
@@ -307,14 +308,14 @@ pPage alloc_pages(unsigned int order)
 
 void free_pages(pPage page, unsigned int order)
 {
-    assert(0<=order &&  order<MAX_ORDER);
+    assert(0<=order &&  order<MAX_OLD_ORDER);
     assert(page != NULL);
 
 
     
     int nr = page->mapNR>>(order+1);
     //printk("#########%d %d\n",page->mapNR, variable_test_bit( nr, (unsigned long *)freeArea[order].map));
-    if(order == MAX_ORDER -1
+    if(order == MAX_OLD_ORDER -1
     || !variable_test_bit( nr, (unsigned long *)freeArea[order].map))
     {
         change_bit( nr, (unsigned long *)freeArea[order].map);
@@ -353,7 +354,7 @@ void free_pages(pPage page, unsigned int order)
 void disp_free_area()
 {
     int i;
-    for(i=0; i<MAX_ORDER; i++)
+    for(i=0; i<MAX_OLD_ORDER; i++)
     {
         pListHead pos,tmp;
         int count = 0;
index 0f7f1e7d3f40b1ee27249fd4c7d48c183902d3af..0de77af3d6bb6be784d5b5923661011c38e7d525 100644 (file)
@@ -1,13 +1,13 @@
 /*
  *--------------------------------------------------------------------------
- *   File Name:        link.ld
+ *   File Name: link.ld
  * 
  * Description: Link All Object Files to KERNEL ...
  * 
  * 
- *      Author:        Zhao Yanbai [zhaoyanbai@126.com]
+ *      Author: Zhao Yanbai [zhaoyanbai@126.com]
  * 
- *     Version:        1.1
+ *     Version: 1.1
  * Create Date: Mon Mar  2 12:21:03 2009
  * Last Update: Mon Mar  2 12:21:03 2009
  * 
@@ -21,28 +21,28 @@ kernel_virtual_addr_start = 0xC0000000;
 kernel_begin = kernel_virtual_addr_start + kernel_loaded_physic_addr;
 SECTIONS
 {
-       . = kernel_begin;
-       .text : AT(phys_addr) ALIGN(0x1000)
-       {
-               code = .;
+    . = kernel_begin;
+    .text : AT(phys_addr) ALIGN(0x1000)
+    {
+        code = .;
         phys_addr = . - kernel_virtual_addr_start;
         *(.multiboot_header)
-               *(.text)
-       }
-       etext = .;
-       .data : AT(phys_addr) ALIGN(0x1000) 
-       {
-               data = .;
+        *(.text)
+    }
+    etext = .;
+    .data : AT(phys_addr) ALIGN(0x1000) 
+    {
+        data = .;
         phys_addr = . - kernel_virtual_addr_start;
-               *(.data)
-       }
-       edata = .;
-       .bss : AT(phys_addr)  ALIGN(0x1000)
-       {
-               bss = .;
+        *(.data)
+    }
+    edata = .;
+    .bss : AT(phys_addr)  ALIGN(0x1000)
+    {
+        bss = .;
         phys_addr = . - kernel_virtual_addr_start;
-               *(.bss);
-       }
+        *(.bss);
+    }
 
     ebss = .;
 
@@ -54,7 +54,7 @@ SECTIONS
     }
 
 
-       end = .;
-       _end = .;
-       kernel_end = (end + 0x1000 - 1) & ~ (0x1000 -1);
+    end = .;
+    _end = .;
+    kernel_end = (end + 0x1000 - 1) & ~ (0x1000 -1);
 }
index 35fe2fc9b4c02723296224cfb2032f777120f133..a1c058079234ff208c8a22732693e33b89aa0eb4 100644 (file)
@@ -40,9 +40,9 @@ extern void reboot();
 
 void setup_kernel()
 {
-    extern char _start, _end;
+    extern char kernel_begin, kernel_end;
 
-    printk("kernel: %08x - %08x\n", &_start, &_end);
+    printk("kernel: %08x - %08x\n", &kernel_begin, &kernel_end);
 
     init_mm();