瀏覽代碼

k_free and split large memory blocks

greatbridf 4 年之前
父節點
當前提交
2de79572aa
共有 3 個文件被更改,包括 15 次插入9 次删除
  1. 2 0
      include/kernel/mem.h
  2. 9 1
      src/kernel/mem.c
  3. 4 8
      src/kernel_main.c

+ 2 - 0
include/kernel/mem.h

@@ -32,3 +32,5 @@ struct mem_blk {
 void init_heap(void);
 
 void* k_malloc(size_t size);
+
+void k_free(void* ptr);

+ 9 - 1
src/kernel/mem.c

@@ -109,7 +109,7 @@ static void split_block(
         return;
     }
 
-    struct mem_blk* blk_next = blk
+    struct mem_blk* blk_next = ((void*)blk)
         + sizeof(struct mem_blk)
         + this_size
         - 4 * sizeof(uint8_t);
@@ -144,3 +144,11 @@ void* k_malloc(size_t size)
     block_allocated->flags.is_free = 0;
     return block_allocated->data;
 }
+
+void k_free(void* ptr)
+{
+    ptr -= (sizeof(struct mem_blk_flags) + sizeof(size_t));
+    struct mem_blk* blk = (struct mem_blk*)ptr;
+    blk->flags.is_free = 1;
+    // TODO: fusion free blocks nearby
+}

+ 4 - 8
src/kernel_main.c

@@ -43,14 +43,10 @@ void kernel_main(void)
     vga_printk("Heap space initialized!\n", 0x0fu);
 
     vga_printk("Testing k_malloc...\n", 0x0fu);
-
-    MAKE_BREAK_POINT();
-    char* p_buf_base = (char*)k_malloc(sizeof(char) * 1024);
-    char* p_buf_head = p_buf_base;
-    for (int i = 0; i < 100; ++i) {
-        p_buf_head += snprintf(p_buf_head, 1024, "%d", i);
-    }
-    vga_printk(p_buf_base, 0x0fu);
+    char* k_malloc_buf = (char*)k_malloc(sizeof(char) * 128);
+    snprintf(k_malloc_buf, 128, "This text is printed on the heap!\n");
+    vga_printk(k_malloc_buf, 0x0fu);
+    k_free(k_malloc_buf);
 
     vga_printk("No work to do, halting...\n", 0x0fU);