diff --git a/kernel/GNUmakefile b/kernel/GNUmakefile index 97304f5..e5e9336 100644 --- a/kernel/GNUmakefile +++ b/kernel/GNUmakefile @@ -187,6 +187,7 @@ override CXXFLAGS += \ -std=gnu++20 \ -fno-rtti \ -fno-exceptions \ + -fmodules-ts \ $(SHARED_FLAGS) # Internal linker flags that should not be changed by the user. diff --git a/kernel/src/CppLib/Spinlock.cpp b/kernel/src/CppLib/Spinlock.cpp new file mode 100644 index 0000000..c1db6d6 --- /dev/null +++ b/kernel/src/CppLib/Spinlock.cpp @@ -0,0 +1,17 @@ +/* + * Spinlock.cpp + * C++ Spinlock + * Copyright (c) 2025 Daniel Hammer +*/ + +#include "Spinlock.hpp" + +namespace kcp { + void Spinlock::Aquire() { + while (atomic_flag.test_and_set(std::memory_order_acquire)); + } + + void Spinlock::Release() { + atomic_flag.clear(std::memory_order_release); + } +}; \ No newline at end of file diff --git a/kernel/src/CppLib/Spinlock.hpp b/kernel/src/CppLib/Spinlock.hpp new file mode 100644 index 0000000..d0711fd --- /dev/null +++ b/kernel/src/CppLib/Spinlock.hpp @@ -0,0 +1,17 @@ +/* + * Spinlock.cpp + * C++ Spinlock + * Copyright (c) 2025 Daniel Hammer +*/ + +#pragma once +#include + +namespace kcp { + class Spinlock { + std::atomic_flag atomic_flag{ATOMIC_FLAG_INIT}; + public: + void Aquire(); + void Release(); + }; +}; \ No newline at end of file diff --git a/kernel/src/CppLib/Vector.hpp b/kernel/src/CppLib/Vector.hpp index 8cb00cc..6adcf38 100644 --- a/kernel/src/CppLib/Vector.hpp +++ b/kernel/src/CppLib/Vector.hpp @@ -7,7 +7,9 @@ #pragma once #include #include + #include + #include #include @@ -65,13 +67,14 @@ namespace kcp size_t size() { return sz; } + }; template - class NoMallocVector : public vector { + class noHeapVector : public vector { size_t pages = 0; public: - NoMallocVector() { + noHeapVector() { kout << "NoMallocVector: constructor called" << Kt::newline; pages = 0; this->sz = 0; diff --git a/kernel/src/Main.cpp b/kernel/src/Main.cpp index cc51ab6..92909ce 100644 --- a/kernel/src/Main.cpp +++ b/kernel/src/Main.cpp @@ -96,12 +96,13 @@ extern "C" void kmain() { #if defined (__x86_64__) Hal::IDTInitialize(); #endif - kcp::NoMallocVector hello{}; + kcp::noHeapVector hello{}; + hello.push_back(10); hello.push_back(20); hello.push_back(30); kout << base::dec << hello.at(0) << hello.at(1) << hello.at(2) << newline; - + hcf(); } diff --git a/kernel/src/Memory/PageFrameAllocator.cpp b/kernel/src/Memory/PageFrameAllocator.cpp index 461c53c..05da1fd 100644 --- a/kernel/src/Memory/PageFrameAllocator.cpp +++ b/kernel/src/Memory/PageFrameAllocator.cpp @@ -10,6 +10,8 @@ #include #include +#include + namespace Memory { PageFrameAllocator::PageFrameAllocator(LargestSection section) { /* we need the virtual address rather than the physical address, so we call the helper */ @@ -24,6 +26,8 @@ namespace Memory { } void* PageFrameAllocator::Allocate() { + Lock.Aquire(); + Page* current = head.next; Page* prev = &head; @@ -35,11 +39,15 @@ namespace Memory { if (new_size == 0) { prev->next = current->next; + + Lock.Release(); return (void*)current; } else { current->size -= 0x1000; + + Lock.Release(); return (void*)current_end_addr - 0x1000; } } @@ -48,6 +56,7 @@ namespace Memory { current = current->next; } + Lock.Release(); return nullptr; } @@ -67,11 +76,13 @@ namespace Memory { } void PageFrameAllocator::Free(void* ptr) { + Lock.Aquire(); auto prev_next = head.next; head.next = (Page*)ptr; head.next->next = prev_next; head.next->size = 0x1000; + Lock.Release(); } void PageFrameAllocator::Free(void* ptr, int n) { diff --git a/kernel/src/Memory/PageFrameAllocator.hpp b/kernel/src/Memory/PageFrameAllocator.hpp index cab85ef..5a23e5c 100644 --- a/kernel/src/Memory/PageFrameAllocator.hpp +++ b/kernel/src/Memory/PageFrameAllocator.hpp @@ -7,6 +7,8 @@ #pragma once #include "Memmap.hpp" +#include + namespace Memory { class PageFrameAllocator { struct Page { @@ -15,7 +17,7 @@ namespace Memory { }; Page head{}; - + kcp::Spinlock Lock{}; LargestSection g_section; public: PageFrameAllocator(LargestSection section);