[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Lost] [Patch] kernel2: Syscall mem_free



+ kernel2: Syscall mem_free

Bei der Gelegenheit ist mir uebrigens aufgefallen, dass mem_allocate
komische Dinge macht... Warum widersprechen sich Kommentar und Code
derart?

  // Der Speicher muss nicht physisch zusamenhaengend sein.
  paddr_t physical_address = pmm_alloc(page_count);
Index: trunk/src/kernel2/src/syscall.c
===================================================================
--- trunk.orig/src/kernel2/src/syscall.c
+++ trunk/src/kernel2/src/syscall.c
@@ -48,9 +48,9 @@ syscall_t syscalls[SYSCALL_MAX];
  */
 void syscall_init()
 {
-    syscall_register(SYSCALL_MEM_ALLOCATE, (void*) &syscall_mem_allocate, 3);
-    //syscall_register(SYSCALL_MEM_FREE, (void*) &syscall_mem_free, 2);
-    
+    syscall_register(SYSCALL_MEM_ALLOCATE, &syscall_mem_allocate, 3);
+    syscall_register(SYSCALL_MEM_FREE, &syscall_mem_free, 2);
+
     syscall_register(SYSCALL_PM_GET_PID, (void*) &syscall_pm_get_pid, 0);
     syscall_register(SYSCALL_PM_GET_PARENT_PID, (void*)
         &syscall_pm_get_parent_pid, 1);
Index: trunk/src/kernel2/src/syscalls/mem.c
===================================================================
--- trunk.orig/src/kernel2/src/syscalls/mem.c
+++ trunk/src/kernel2/src/syscalls/mem.c
@@ -45,7 +45,7 @@
  * @param bytes Groesse des Speicherblocks
  * @param flags Flags
  * @param phys Je nach Flags wird diese Adresse benutzt, um dort die
- *              physikalische Adresse des Blocks zu speichern.
+ *              physische Adresse des Blocks zu speichern.
  *
  * @return Virtuelle Adresse des Blocks
  */
@@ -53,8 +53,8 @@ vaddr_t syscall_mem_allocate(size_t byte
 {
     vaddr_t address = NULL;
     size_t page_count = NUM_PAGES(PAGE_ALIGN_ROUND_UP(bytes));
-    
-    // Der Speicher muss nicht physiskalisch zusamenhaengend sein.
+
+    // Der Speicher muss nicht physisch zusamenhaengend sein.
     paddr_t physical_address = pmm_alloc(page_count);
     address = mmc_automap(&mmc_current_context(), physical_address, page_count,
         USER_MEM_START, USER_MEM_END, MM_FLAGS_USER_DATA);
@@ -62,7 +62,28 @@ vaddr_t syscall_mem_allocate(size_t byte
     return address;
 }
 
+/**
+ * Einen Speicherbereich freigeben
+ *
+ * @param start Startadresse des Bereichs
+ * @param bytes Groesse des Speicherblocks
+ */
 void syscall_mem_free(vaddr_t start, size_t bytes)
 {
-}
+    // Adresse auf PAGE_SIZE abrunden
+    start = (vaddr_t) PAGE_ALIGN_ROUND_DOWN((uintptr_t) start);
+    size_t num_pages = NUM_PAGES(bytes);
+
+    // Jetzt werden die Seiten freigegeben
+    while (num_pages-- != 0) {
+        // Physische Adresse ausfindig machen und Page in der
+        // physischen Speicherverwaltung freigeben
+        paddr_t phys = mmc_resolve(&mmc_current_context(), start);
+        pmm_free(phys, 1);
 
+        // Page unmappen
+        mmc_unmap(&mmc_current_context(), start, 1);
+
+        start = (vaddr_t) ((uintptr_t) start + PAGE_SIZE);
+    }
+}