diff options
| author | Amlal El Mahrouss <amlalelmahrouss@icloud.com> | 2024-02-01 17:24:09 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlalelmahrouss@icloud.com> | 2024-02-01 17:24:09 +0100 |
| commit | 6ce7dffe92775f262384a028af233999a7d18048 (patch) | |
| tree | 985e7e39fd9657ceb45ab292f6a934e0e6d4571b /Private/Source | |
| parent | 26ceef5cccbb40b00a302979ed297243b356feff (diff) | |
Kernel: Really big improvements on Paged Memory Model.
Bootloader: Design shift in BFileReader class.
Signed-off-by: Amlal El Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Private/Source')
| -rw-r--r-- | Private/Source/KernelHeap.cxx | 29 | ||||
| -rw-r--r-- | Private/Source/PageManager.cxx | 21 | ||||
| -rw-r--r-- | Private/Source/Pmm.cxx | 9 |
3 files changed, 46 insertions, 13 deletions
diff --git a/Private/Source/KernelHeap.cxx b/Private/Source/KernelHeap.cxx index 42ea0187..603b91b3 100644 --- a/Private/Source/KernelHeap.cxx +++ b/Private/Source/KernelHeap.cxx @@ -9,6 +9,8 @@ #include <NewKit/KernelHeap.hpp> +#include "NewKit/PageManager.hpp" + //! @file KernelHeap.cpp //! @brief Kernel allocator. @@ -48,6 +50,8 @@ VoidPtr ke_new_ke_heap(const SizeT &sz, const bool rw, const bool user) { Ref<PTEWrapper *> wrapper = kPmm.RequestPage(user, rw); if (wrapper) { + wrapper->NoExecute(true); + kLastWrapper = wrapper; kWrapperList[kWrapperCount] = wrapper; @@ -67,15 +71,27 @@ Int32 ke_delete_ke_heap(voidPtr ptr) { const UIntPtr virtualAddress = reinterpret_cast<UIntPtr>(ptr); if (kLastWrapper && virtualAddress == kLastWrapper->VirtualAddress()) { - return kPmm.FreePage(kLastWrapper); + if (kPmm.FreePage(kLastWrapper)) { + kLastWrapper->NoExecute(false); + return true; + } + + return false; } - Ref<PTEWrapper *> wrapper; + Ref<PTEWrapper *> wrapper{nullptr}; for (SizeT indexWrapper = 0; indexWrapper < kWrapperCount; ++indexWrapper) { if (kWrapperList[indexWrapper]->VirtualAddress() == virtualAddress) { wrapper = kWrapperList[indexWrapper]; - return kPmm.FreePage(wrapper); + + // if page is no more, then mark it also as non executable. + if (kPmm.FreePage(wrapper)) { + wrapper->NoExecute(false); + return true; + } + + return false; } } } @@ -108,11 +124,10 @@ Boolean kernel_valid_ptr(voidPtr ptr) { } /// @brief The Kernel heap initializer function. -/// @return -Void ke_init_ke_heap() noexcept -{ +/// @return +Void ke_init_ke_heap() noexcept { kWrapperCount = 0UL; - Ref<PTEWrapper *> kLastWrapper = Ref<PTEWrapper*>(nullptr); + Ref<PTEWrapper *> kLastWrapper = Ref<PTEWrapper *>(nullptr); Pmm kPmm = Pmm(); } } // namespace HCore diff --git a/Private/Source/PageManager.cxx b/Private/Source/PageManager.cxx index 95097f99..d6455a18 100644 --- a/Private/Source/PageManager.cxx +++ b/Private/Source/PageManager.cxx @@ -85,8 +85,20 @@ bool PageManager::Free(Ref<PTEWrapper *> &wrapper) { return false; } +//////////////////////////// + +// VIRTUAL ADDRESS + +//////////////////////////// + const UIntPtr &PTEWrapper::VirtualAddress() { return m_VirtAddr; } +//////////////////////////// + +// PAGE GETTERS + +//////////////////////////// + bool PTEWrapper::Shareable() { auto raw = reinterpret_cast<PTE *>(m_VirtAddr); @@ -120,4 +132,13 @@ bool PTEWrapper::Access() { return m_Accessed; } + +//////////////////////////// + +// NO EXECUTE PROTECTION + +//////////////////////////// + +void PTEWrapper::NoExecute(const bool enable) { this->m_ExecDisable = enable; } +const bool &PTEWrapper::NoExecute() { return this->m_ExecDisable; } } // namespace HCore diff --git a/Private/Source/Pmm.cxx b/Private/Source/Pmm.cxx index aa5a3c89..76191fdd 100644 --- a/Private/Source/Pmm.cxx +++ b/Private/Source/Pmm.cxx @@ -11,11 +11,8 @@ #include <NewKit/Pmm.hpp> namespace HCore { -Pmm::Pmm() = default; - -Pmm::Pmm(Ref<PageManager *> &pm) : m_PageManager(pm) { - MUST_PASS(pm.Leak()); - kcout << "[PMM] New PhysicalMemoryManager\r\n"; +Pmm::Pmm() : m_PageManager() { + kcout << "[PMM] Allocate PageMemoryManager\r\n"; } Pmm::~Pmm() = default; @@ -23,7 +20,7 @@ Pmm::~Pmm() = default; /* If this returns Null pointer, enter emergency mode */ Ref<PTEWrapper *> Pmm::RequestPage(Boolean user, Boolean readWrite) { if (m_PageManager) { - PTEWrapper *pt = m_PageManager.Leak()->Request(user, readWrite, true); + PTEWrapper *pt = m_PageManager.Leak().Request(user, readWrite, true); if (pt) return Ref<PTEWrapper *>(pt); |
