aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src')
-rw-r--r--arch/x86_64/src/kernel/main.cpp13
-rw-r--r--arch/x86_64/src/memory/allocator/area_frame_allocator.cpp24
-rw-r--r--arch/x86_64/src/memory/multiboot/memory_map.cpp15
3 files changed, 38 insertions, 14 deletions
diff --git a/arch/x86_64/src/kernel/main.cpp b/arch/x86_64/src/kernel/main.cpp
index ad1eb39..3f768ee 100644
--- a/arch/x86_64/src/kernel/main.cpp
+++ b/arch/x86_64/src/kernel/main.cpp
@@ -19,14 +19,19 @@ namespace teachos::arch::kernel
auto memory_information = memory::multiboot::read_multiboot2();
memory::allocator::area_frame_allocator allocator(memory_information);
+ auto test2 = allocator.allocate_frame();
+ auto test1 = test2.value().start_address();
+ auto test3 = test2.value().frame_number;
+
+ if (test1 > test3)
+ {
+ }
+
size_t address = 42 * memory::paging::PAGE_TABLE_ENTRY_COUNT * memory::paging::PAGE_TABLE_ENTRY_COUNT *
memory::allocator::PAGE_FRAME_SIZE; // 42th P3 entry
auto page = memory::paging::virtual_page::containing_address(address);
- auto frame = allocator.allocate_frame();
- exception_handling::assert(frame.has_value(), "[Main] Out of memory exception");
+ memory::paging::map_next_free_page_to_frame(allocator, page, 0U);
auto optional_frame = memory::paging::translate_page(page);
- memory::paging::map_page_to_frame(allocator, page, frame.value(), 0U);
- optional_frame = memory::paging::translate_page(page);
video::vga::text::newline();
video::vga::text::write("Mapped physical frame: ", video::vga::text::common_attributes::green_on_black);
video::vga::text::write_number(optional_frame.value().frame_number,
diff --git a/arch/x86_64/src/memory/allocator/area_frame_allocator.cpp b/arch/x86_64/src/memory/allocator/area_frame_allocator.cpp
index c2cafce..c3f77e1 100644
--- a/arch/x86_64/src/memory/allocator/area_frame_allocator.cpp
+++ b/arch/x86_64/src/memory/allocator/area_frame_allocator.cpp
@@ -2,13 +2,16 @@
#include "arch/exception_handling/assert.hpp"
+#include <algorithm>
+#include <array>
+#include <ranges>
+
namespace teachos::arch::memory::allocator
{
area_frame_allocator::area_frame_allocator(multiboot::memory_information mem_info)
: next_free_frame(0)
, current_area(std::nullopt)
- , area_begin(mem_info.memory_areas)
- , area_end(mem_info.memory_areas + mem_info.area_count)
+ , memory_areas(mem_info.memory_areas, mem_info.area_count)
, kernel_start(physical_frame::containing_address(mem_info.kernel_start))
, kernel_end(physical_frame::containing_address(mem_info.kernel_end))
, multiboot_start(physical_frame::containing_address(mem_info.multiboot_start))
@@ -21,10 +24,17 @@ namespace teachos::arch::memory::allocator
{
current_area = std::nullopt;
- for (multiboot::memory_area_iterator it = begin(); it != end(); ++it)
- {
- multiboot::memory_area & area = *it;
+ /**auto filtered_areas = memory_areas | std::views::filter([this](multiboot::memory_area area) {
+ auto address = area.base_address + area.area_length - 1;
+ return physical_frame::containing_address(address) >= next_free_frame;
+ });**/
+
+ std::ranges::min_element(memory_areas, [](multiboot::memory_area a, multiboot::memory_area b) {
+ return a.base_address < b.base_address;
+ });
+ for (auto area : memory_areas)
+ {
std::size_t address = area.base_address + area.area_length - 1;
if (physical_frame::containing_address(address) >= next_free_frame)
{
@@ -90,8 +100,4 @@ namespace teachos::arch::memory::allocator
exception_handling::assert(false && physical_frame.frame_number == 0,
"[deallocate_frame] Not implemented Exception");
}
-
- auto area_frame_allocator::begin() -> multiboot::memory_area_iterator { return area_begin; }
-
- auto area_frame_allocator::end() -> multiboot::memory_area_iterator { return area_end; }
} // namespace teachos::arch::memory::allocator
diff --git a/arch/x86_64/src/memory/multiboot/memory_map.cpp b/arch/x86_64/src/memory/multiboot/memory_map.cpp
index 6b1d1d4..da7f05d 100644
--- a/arch/x86_64/src/memory/multiboot/memory_map.cpp
+++ b/arch/x86_64/src/memory/multiboot/memory_map.cpp
@@ -1,11 +1,13 @@
#include "arch/memory/multiboot/memory_map.hpp"
+#include "arch/exception_handling/assert.hpp"
+
namespace teachos::arch::memory::multiboot
{
memory_area_iterator::memory_area_iterator(multiboot::memory_area * p)
: ptr(p)
{
- // Nothing to do
+ exception_handling::assert(ptr, "[Memory Area] Attempted to pass nullptr as iterator");
}
multiboot::memory_area & memory_area_iterator::operator*() const { return *ptr; }
@@ -21,4 +23,15 @@ namespace teachos::arch::memory::multiboot
++ptr;
return *this;
}
+
+ memory_area_container::memory_area_container(memory_area * begin, std::size_t size)
+ : area_begin(begin)
+ , area_end(begin + size)
+ {
+ // Nothing to do
+ }
+
+ auto memory_area_container::begin() const -> multiboot::memory_area_iterator { return area_begin; }
+
+ auto memory_area_container::end() const -> multiboot::memory_area_iterator { return area_end; }
} // namespace teachos::arch::memory::multiboot