浏览代码

完成了malloc和free

fslongjin 2 年之前
父节点
当前提交
c120a0e992
共有 4 个文件被更改,包括 37 次插入17 次删除
  1. 2 4
      kernel/syscall/syscall.c
  2. 25 3
      user/init.c
  3. 9 9
      user/libs/libc/malloc.c
  4. 1 1
      user/libs/libc/unistd.c

+ 2 - 4
kernel/syscall/syscall.c

@@ -361,12 +361,12 @@ uint64_t sys_brk(struct pt_regs *regs)
 
     if ((int64_t)regs->r8 == -1)
     {
-        kdebug("get brk_start=%#018lx", current_pcb->mm->brk_start);
+        // kdebug("get brk_start=%#018lx", current_pcb->mm->brk_start);
         return current_pcb->mm->brk_start;
     }
     if ((int64_t)regs->r8 == -2)
     {
-        kdebug("get brk_end=%#018lx", current_pcb->mm->brk_end);
+        // kdebug("get brk_end=%#018lx", current_pcb->mm->brk_end);
         return current_pcb->mm->brk_end;
     }
     if (new_brk > current_pcb->addr_limit) // 堆地址空间超过限制
@@ -409,8 +409,6 @@ void do_syscall_int(struct pt_regs *regs, unsigned long error_code)
 {
     
     ul ret = system_call_table[regs->rax](regs);
-    if(regs->rax == SYS_BRK)
-        kdebug("brk ret=%#018lx", ret);
     regs->rax = ret; // 返回码
 }
 

+ 25 - 3
user/init.c

@@ -32,9 +32,31 @@ int main()
     put_string(buf, COLOR_YELLOW, COLOR_BLACK);
     close(fd);
     */
-    char *p = malloc(100);
-    *p = 'a';
-    printf("p=%lld\t*p=%c\n", (uint64_t)p, *p);
+
+    void *ptr[256] = {0};
+    for (int k = 0; k < 2; ++k)
+    {
+        printf("try to malloc 256*16K=4MB\n");
+        uint64_t js = 0;
+        for (int i = 0; i < 256; ++i)
+        {
+            ptr[i] = malloc(4096 * 4);
+            js += *(uint64_t *)((uint64_t)(ptr[i]) - sizeof(uint64_t));
+            if (*(uint64_t *)((uint64_t)(ptr[i]) - sizeof(uint64_t)) > 0x4008)
+                printf("[%d] start_addr = %#018lx, len = %#010lx\n", (uint64_t)(ptr[i]) - 8, *(uint64_t *)((uint64_t)(ptr[i]) - sizeof(uint64_t)));
+        }
+        printf("ptr[0]->len=%lld\n", *(uint64_t *)((uint64_t)ptr[0] - sizeof(uint64_t)));
+        printf("ptr[1]->len=%lld\n", *(uint64_t *)((uint64_t)ptr[1] - sizeof(uint64_t)));
+        // printf("ptr[24]->len=%lld\n", *(uint64_t*)((uint64_t)ptr[24] - sizeof(uint64_t)));
+        printf("alloc done. total used: %lld bytes\n", js);
+        printf("try to free...\n");
+        for (int i = 0; i < 256; ++i)
+        {
+            free(ptr[i]);
+        }
+        printf("free done!\n");
+    }
+
     // *p = 'a';
     /*
     pid_t p = fork();

+ 9 - 9
user/libs/libc/malloc.c

@@ -57,10 +57,10 @@ static malloc_mem_chunk_t *malloc_query_free_chunk_bf(uint64_t size)
     }
     malloc_mem_chunk_t *ptr = malloc_free_list;
     malloc_mem_chunk_t *best = NULL;
-    printf("query size=%d", size);
+    // printf("query size=%d", size);
     while (ptr != NULL)
     {
-        printf("ptr->length=%#010lx\n", ptr->length);
+        // printf("ptr->length=%#010lx\n", ptr->length);
         if (ptr->length == size)
         {
             best = ptr;
@@ -69,18 +69,14 @@ static malloc_mem_chunk_t *malloc_query_free_chunk_bf(uint64_t size)
 
         if (ptr->length > size)
         {
-            printf("676767\n");
             if (best == NULL)
                 best = ptr;
             else if (best->length > ptr->length)
                 best = ptr;
-            printf("6rdf\n");
         }
-        printf("ptr->next=%#018lx\n", ptr->next);
         ptr = ptr->next;
     }
 
-    printf("return best=%#018lx\n", (uint64_t)best);
     return best;
 }
 
@@ -275,7 +271,7 @@ void *malloc(ssize_t size)
     }
 found:;
 
-    printf("ck = %#018lx\n", (uint64_t)ck);
+    // printf("ck = %#018lx\n", (uint64_t)ck);
     if (ck == NULL)
         return (void *)-ENOMEM;
     // 分配空闲块
@@ -296,12 +292,12 @@ found:;
         malloc_mem_chunk_t *new_ck = (malloc_mem_chunk_t *)(((uint64_t)ck) + size);
         new_ck->length = ck->length - size;
         new_ck->prev = new_ck->next = NULL;
-        printf("new_ck=%#018lx, new_ck->length=%#010lx\n", (uint64_t)new_ck, new_ck->length);
+        // printf("new_ck=%#018lx, new_ck->length=%#010lx\n", (uint64_t)new_ck, new_ck->length);
         ck->length = size;
         malloc_insert_free_list(new_ck);
     }
 
-    printf("ck=%lld\n", (uint64_t)ck);
+    // printf("ck=%lld\n", (uint64_t)ck);
     // 此时链表结点的指针的空间被分配出去
     return (void *)((uint64_t)ck + sizeof(uint64_t));
 }
@@ -313,4 +309,8 @@ found:;
  */
 void free(void *ptr)
 {
+    // 找到结点(此时prev和next都处于未初始化的状态)
+    malloc_mem_chunk_t * ck = (malloc_mem_chunk_t *)((uint64_t)ptr-sizeof(uint64_t));
+    // printf("free(): addr = %#018lx\t len=%#018lx\n", (uint64_t)ck, ck->length);
+    malloc_insert_free_list(ck);
 }

+ 1 - 1
user/libs/libc/unistd.c

@@ -85,7 +85,7 @@ pid_t vfork(void)
 uint64_t brk(uint64_t end_brk)
 {
     uint64_t x = (uint64_t)syscall_invoke(SYS_BRK, (uint64_t)end_brk, 0, 0, 0, 0, 0, 0, 0);
-    printf("brk():  end_brk=%#018lx x=%#018lx", (uint64_t)end_brk, x);
+    // printf("brk():  end_brk=%#018lx x=%#018lx", (uint64_t)end_brk, x);
     return x;
 }