Jelajahi Sumber

split block

greatbridf 4 tahun lalu
induk
melakukan
edd0a3e83a
2 mengubah file dengan 43 tambahan dan 1 penghapusan
  1. 27 1
      src/kernel/mem.c
  2. 16 0
      src/kernel_main.c

+ 27 - 1
src/kernel/mem.c

@@ -100,6 +100,32 @@ allocate_new_block(
     return blk;
 }
 
+static void split_block(
+    struct mem_blk* blk,
+    size_t this_size)
+{
+    // block is too small to get split
+    if (blk->size < sizeof(struct mem_blk) + this_size) {
+        return;
+    }
+
+    struct mem_blk* blk_next = blk
+        + sizeof(struct mem_blk)
+        + this_size
+        - 4 * sizeof(uint8_t);
+
+    blk_next->size = blk->size
+        - this_size
+        - sizeof(struct mem_blk)
+        + 4 * sizeof(uint8_t);
+
+    blk_next->flags.has_next = blk->flags.has_next;
+    blk_next->flags.is_free = 1;
+
+    blk->flags.has_next = 1;
+    blk->size = this_size;
+}
+
 void* k_malloc(size_t size)
 {
     struct mem_blk* block_allocated;
@@ -112,7 +138,7 @@ void* k_malloc(size_t size)
         // no need to check errno and return value
         // preserve these for the caller
     } else {
-        // TODO: split block
+        split_block(block_allocated, size);
     }
 
     block_allocated->flags.is_free = 0;

+ 16 - 0
src/kernel_main.c

@@ -36,6 +36,22 @@ void kernel_main(void)
 
     vga_printk("Interrupt descriptor table initialized!\n", 0x0fu);
 
+    vga_printk("Initializing heap space\n", 0x0fu);
+
+    init_heap();
+
+    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);
+
     vga_printk("No work to do, halting...\n", 0x0fU);
 
     while (1) {