Browse Source

fix(syscall): not releasing pg_lists on unmapping

greatbridf 2 năm trước cách đây
mục cha
commit
f27f7ddade
2 tập tin đã thay đổi với 13 bổ sung11 xóa
  1. 10 0
      include/kernel/mm.hpp
  2. 3 11
      src/kernel/syscall.cpp

+ 10 - 0
include/kernel/mm.hpp

@@ -101,6 +101,16 @@ public:
     }
 };
 
+inline constexpr void unmap_user_space_memory(mm_list& mms)
+{
+    // skip kernel heap
+    for (auto iter = ++mms.begin(); iter != mms.end();) {
+        k_unmap(iter.ptr());
+        types::kernel_ident_allocator_delete(iter->pgs);
+        iter = mms.erase(iter);
+    }
+}
+
 // in mem.cpp
 extern mm_list* kernel_mms;
 extern page empty_page;

+ 3 - 11
src/kernel/syscall.cpp

@@ -72,11 +72,7 @@ void _syscall_exec(interrupt_stack* data)
     const char** argv = reinterpret_cast<const char**>(data->s_regs.esi);
     (void)argv;
 
-    // skip kernel heap
-    for (auto iter = ++current_process->mms.begin(); iter != current_process->mms.end();) {
-        k_unmap(iter.ptr());
-        iter = current_process->mms.erase(iter);
-    }
+    unmap_user_space_memory(current_process->mms);
 
     types::elf::elf32_load(exec, data, current_process->attr.system);
 }
@@ -101,13 +97,9 @@ void _syscall_exit(interrupt_stack* data)
 
     // unmap all memory areas
     auto& mms = current_process->mms;
-    // skip kernel heap area
-    for (auto iter = ++mms.begin(); iter != mms.end();) {
-        k_unmap(iter.ptr());
-        types::kernel_ident_allocator_delete(iter->pgs);
 
-        iter = mms.erase(iter);
-    }
+    unmap_user_space_memory(mms);
+
     pd_t old_pd = mms.begin()->pd;
     current_process->mms.clear();