Przeglądaj źródła

feat(mm): add constructor for class mm

greatbridf 2 lat temu
rodzic
commit
b93a90442c
3 zmienionych plików z 35 dodań i 27 usunięć
  1. 7 2
      include/kernel/mm.hpp
  2. 27 14
      src/kernel/mem.cpp
  3. 1 11
      src/kernel/process.cpp

+ 7 - 2
include/kernel/mm.hpp

@@ -26,11 +26,16 @@ struct mm_attr {
     uint32_t system : 1;
     uint32_t system : 1;
 };
 };
 
 
-struct mm {
+class mm {
+public:
     linr_ptr_t start;
     linr_ptr_t start;
     struct mm_attr attr;
     struct mm_attr attr;
-    page_arr* pgs;
     page_directory_entry* pd;
     page_directory_entry* pd;
+    page_arr* pgs;
+
+public:
+    mm(const mm& val);
+    mm(linr_ptr_t start, page_directory_entry* pd, bool write, bool system);
 };
 };
 
 
 using mm_list = types::list<mm, types::kernel_ident_allocator>;
 using mm_list = types::list<mm, types::kernel_ident_allocator>;

+ 27 - 14
src/kernel/mem.cpp

@@ -484,16 +484,7 @@ void init_mem(void)
     init_paging_map_low_mem_identically();
     init_paging_map_low_mem_identically();
 
 
     kernel_mms = types::kernel_ident_allocator_new<mm_list>();
     kernel_mms = types::kernel_ident_allocator_new<mm_list>();
-    kernel_mms->push_back(mm {
-        .start = (linr_ptr_t)KERNEL_HEAP_START,
-        .attr = {
-            .read = 1,
-            .write = 1,
-            .system = 1,
-        },
-        .pgs = types::kernel_ident_allocator_new<page_arr>(),
-        .pd = KERNEL_PAGE_DIRECTORY_ADDR,
-    });
+    auto heap_mm = kernel_mms->emplace_back((linr_ptr_t)KERNEL_HEAP_START, KERNEL_PAGE_DIRECTORY_ADDR, 1, 1);
 
 
     page heap_first_page {
     page heap_first_page {
         .phys_page_id = alloc_raw_page(),
         .phys_page_id = alloc_raw_page(),
@@ -503,9 +494,7 @@ void init_mem(void)
         },
         },
     };
     };
 
 
-    mm* heap_mm = kernel_mms->begin().ptr();
-
-    k_map(heap_mm, &heap_first_page, 1, 1, 1, 0);
+    k_map(heap_mm.ptr(), &heap_first_page, 1, 1, 1, 0);
     memset(KERNEL_HEAP_START, 0x00, PAGE_SIZE);
     memset(KERNEL_HEAP_START, 0x00, PAGE_SIZE);
     kernel_heap_allocator = types::kernel_ident_allocator_new<brk_memory_allocator>(KERNEL_HEAP_START,
     kernel_heap_allocator = types::kernel_ident_allocator_new<brk_memory_allocator>(KERNEL_HEAP_START,
         (uint32_t)KERNEL_HEAP_LIMIT - (uint32_t)KERNEL_HEAP_START);
         (uint32_t)KERNEL_HEAP_LIMIT - (uint32_t)KERNEL_HEAP_START);
@@ -519,7 +508,7 @@ void init_mem(void)
     // while (kernel_mm_head->len < 256 * 1024 * 1024 / PAGE_SIZE) {
     // while (kernel_mm_head->len < 256 * 1024 * 1024 / PAGE_SIZE) {
     while (heap_mm->pgs->size() < 256 * 1024 * 1024 / PAGE_SIZE) {
     while (heap_mm->pgs->size() < 256 * 1024 * 1024 / PAGE_SIZE) {
         k_map(
         k_map(
-            heap_mm, &empty_page,
+            heap_mm.ptr(), &empty_page,
             1, 1, 1, 1);
             1, 1, 1, 1);
     }
     }
 }
 }
@@ -539,3 +528,27 @@ void create_segment_descriptor(
     sd->access = access;
     sd->access = access;
     sd->flags = flags;
     sd->flags = flags;
 }
 }
+
+mm::mm(linr_ptr_t start, page_directory_entry* pd, bool write, bool system)
+    : start(start)
+    , attr({
+          .read { 1 },
+          .write { write },
+          .system { system },
+      })
+    , pd(pd)
+    , pgs(types::kernel_ident_allocator_new<page_arr>())
+{
+}
+
+mm::mm(const mm& val)
+    : start(val.start)
+    , attr({
+          .read { val.attr.read },
+          .write { val.attr.write },
+          .system { val.attr.system },
+      })
+    , pd(val.pd)
+    , pgs(val.pgs)
+{
+}

+ 1 - 11
src/kernel/process.cpp

@@ -51,17 +51,7 @@ process::process(void* start_eip, uint8_t* image, size_t image_size, bool system
     for (auto& item : mms)
     for (auto& item : mms)
         item.pd = pd;
         item.pd = pd;
 
 
-    auto user_mm = mms.emplace_back(mm {
-        // TODO: change this
-        .start = 0x40000000U,
-        .attr = {
-            .read = 1,
-            .write = 1,
-            .system = system,
-        },
-        .pgs = types::kernel_allocator_new<page_arr>(),
-        .pd = pd,
-    });
+    auto user_mm = mms.emplace_back(0x40000000U, pd, 1, system);
 
 
     auto thd = thds.emplace_back(thread {
     auto thd = thds.emplace_back(thread {
         .eip = start_eip,
         .eip = start_eip,