From 5b508f4a48029dceedc9207bb8a5ad5059229c87 Mon Sep 17 00:00:00 2001 From: SpookyDervish Date: Wed, 28 Jan 2026 18:06:16 +1100 Subject: [PATCH] free, lock, reserve and unreserve pages --- OVMFbin/OVMF_VARS-pure-efi.fd | Bin 131072 -> 131072 bytes kernel/bin/CustomOS.img | Bin 48000000 -> 48000000 bytes kernel/bin/kernel.elf | Bin 11816 -> 17000 bytes kernel/lib/PageFrameAllocator.o | Bin 2168 -> 5376 bytes kernel/lib/kernel.o | Bin 1656 -> 3056 bytes kernel/src/PageFrameAllocator.cpp | 87 +++++++++++++++++++++++++++++- kernel/src/PageFrameAllocator.h | 11 ++++ kernel/src/kernel.cpp | 17 ++++++ 8 files changed, 114 insertions(+), 1 deletion(-) diff --git a/OVMFbin/OVMF_VARS-pure-efi.fd b/OVMFbin/OVMF_VARS-pure-efi.fd index e326b2059e1ec050b0e9e0dda1b969f132f01176..2f064e19e9ddab2399f3e281e259139d0d0f72ce 100644 GIT binary patch delta 89 zcmZo@;Am*z*ifOxSTOmZmGn)Yypy%& kI5Cz2nP)jSTP-{0x!GXV1@lcG9GIIweA@ou6XO9M0Lx4%ApigX delta 111 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 BAn^bI delta 5522 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 diff --git a/kernel/bin/kernel.elf b/kernel/bin/kernel.elf index 24b35fdfed86f2ff0498a72ef04ffaf531ffd018..2d78f517d394380a1176b4ac256e8433e213e766 100755 GIT binary patch literal 17000 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 e%o1>%!=<&jQ)?i|5UYcNWfD*rz@@}^b* delta 2401 zcmZuzdrVtZ96q;D9<@LzuaQfRAm=4Vejw7UdC| zfb7VHW5sxj*wu0DI08=JO0kOrx&_-lH2c|@B4m_ zbMCn}UFns^y~BmN*NR7qTrZoF2pA)%t*>7%2380q^`u8 zh%%%%+u^UYw2DYqMm5jO+tGx8i?ywnYiVK3s^qqxj|R{WD5Ho>c3CD4GbcE^`&SCy^X7#kW!al1t+RE@Xn`_&S>A_?lNJ=ez8CL$-c(00NC!}eTv z8;ZR%DSctAdqsZ)XA+hj7k!)_!$!hNP+s7D1?3RKpghN5wILwS!MeTF7kbmqdQ}4M z1oSV6dy8^8Y{Yq}N1nstbE5bdt`)DkFxn=>R!rWxVPdv${e%;eaaqk%86L5+roK)g9j`}L1rt6lu zf$3hnI@T#Y7p0%o^e*JLQGYQ?Z`AZrLVV=F2Bn`y8O~^iY2?qNUd-O=NP{s25;NG5 zTEuJWCZ*RAHC?x;#ot4^^KVMSQTnf%ZkK$7JoOKye?%F6(+rhZ_#W!NN9jwN?nV9U zO-g-H4Zf{4*oFL_+m!B&(sMO^lm$AsD9zhl;3b})uW%ameAMH2>$N-jBI*XzkMGuX zuWAk6L%k98_oDPpO)t0W2)T#`0~)n0jL~ZyR-%4(o6^Rp1ofBzTnDd7`CxFBnt1nw zbTbc*&!O3s<@*`$%tRs^;!AyO}tX^+uiMC>`t~s^raFV88fQ< zNfn3_d6wU5PzlilDOGvca-}xc@L0^5uX@r&>>&|bf~#YLA3#K}@Q({WdlT3=Cj1qm z7JnSbcftE*S-wG`x0yAjK6Tmr-($|dCa+Us63GZ`A}3I1Y1Qv1S`PsN_%T-U2EGL?VT`DSpat{8=$Z{ z1qP~e;BM9H;IDoGifg`t<(fR*pb-r2eTK-X9J52MyUY~%+&XwQQUHE;sX_b4;e>D8 zE_0Lk7B`7SH|fCODTPjV3Mif@6C+RA2F(Z4VAQkMu#m523&p_q9+zSK5p{Yv1`M^X OL|UXyTe#m|Yy1zUWYD?* diff --git a/kernel/lib/PageFrameAllocator.o b/kernel/lib/PageFrameAllocator.o index 43229dfe5e3c08662ca93dc729e34926a0c63e36..e5571e5d21ba3d624b215e12325566f0dfb2d6b4 100644 GIT binary patch literal 5376 zcmeHLUu;uV7(aJ_n>yG)6Gm8K6A}VZnzlnS{%K*Jac5Sj9o1-9Mz>vHVO^K@4gnzy z3&f_;?7>7IAlZWtBu3#yLJWzW5QfoceIe5jvzU-9VGsCZjf?nw_kLe@de(LtV|?*T zPS1CK-~aRXZf9g?dyQcTCPTa+=0}VQky|;>2OTyjmWz53H8c0k^z1=1bNafO8M$g^ zqLVh~GhhXdL(og8cHRnySz%7h z)SK^yp~?^pOEf0sEvK&bth`mOu7{xi(5cIQ23a#3ZgP9GPIHx(x1bR8f`wdpV2pir z(^-Yg=^0o7NIi;GVXnY85<6vP!gZ5!&dFl63x?~mat{0$`P)LIhzG8f+j7wM#x#GI_u2SZ7fp$jsO?M|$NAR%jX=~f&*|2ACbfd@r zyf@(Wdjh_|7N6hOf>N;*ng<&0H&7Ba!pI@UcetUAp9UF{aWW!|maHK-KiapC~UO}-VKS1))68T$2`6-e|O5~xU{36NE zmdH;Po%uPni2Py|x$Al1 zFPbbBzdTwf5n@Sk7tBkWfL-bA8W)45b7&p>BFN|T5cxP`x|1;sfCBOhVa}IqS1Va70xXFPS4-kHj5*c-*;19;- z;#w8(H_6X|8rK2)zeM<_gr6n<6NJA_d2-wbgx6?!t_FL|e?Q^u=S9LdI1dNyA&6lS zzD>ikgm-GV2*(av?a5f&+BG+Dck|#vcN?FNcRzD3#Qbo37 zXuuwb4Gx^N`bEzhd;P5oo%y#!tXRKn?{KX{v0)hw_+i`=lA(Q(*Lz-)U2Tz$@cw;~ zcpRMgTlQGCtJ?*BtLl~y=)QzXQnfX4bm3jU;m*J6S|sJ|Q<>p!dDD-=9HICg42 zc;1n8yj{WZXtV#W3it-Cy~t8qQx6AArbV+s<(IKSHmHC%s( zS)bq4aZR7!)trX&`#-JW{ND1X2K(pt)xJGoa8iSjOP92`jMKF9P&@}5`qb^m$$m{y(`7h5!+v1Ur;h>Z z*}hrBIX?H>K+e3XdgCwV|1ucWLeu9pNA`MNdj7o>U$=iq_Sd!Kbo*|wFSmY8^wHc( z_PBm%%l5o}DAr>GBrao7KpRMiZz!&jZjW!VzIFhKJPLq5)0}JNICpe8`!M~#a?o{C I{MGIM1giJqx&QzG delta 428 zcmZqB`XMkugUNz*qL!t_0|o|$W2``efzhMeb;T|a%j0|L0*_AD2Oh^=FM#>SU2lNs z(}2XmI3Pd;nD5D0aShg%9ijr_<#qw}^N z9^Iip?E3(yY=cMVIgifcFF>XNRlWcUz3}J+y8_HS_=4Y~`2ZtO>H|<0&|qI6?YaX= z*K5WJCnq0e44=G!wS=FG5onGhpFkUvGcOx6>ttm%)yaniB_nvXfSaxPWBSK#+v{#0R|>JiU?135R%|hV1Wo#FicJoGGki6 zIQgKU*yIgDnv9H-Zwc80Nhx6v2@)+328qrRw&#Ev6*2jtko+VO39cDXQw$g;D~XtK kc>t{kfe%1KMa(!Ym?7LplNSofPd*?b!Fd9zJ_jTM0LGbn)c^nh diff --git a/kernel/lib/kernel.o b/kernel/lib/kernel.o index b335d422b6068255f0cd66434410444f5ec8557d..cd7fadc97c360bda3751fd4b485359daa73086d1 100644 GIT binary patch literal 3056 zcmds3Piz!b7=P0isL+y1#5AcSbJ0MAai;}hi80$~O;DMVaUOjju9!!x#@uD6yG2y}iBL@@UVC;bezi;M!yRVO(6F0u(oA=)D z`+a}rd+*KeXU_YDKEq%n278xvSA;Uw80^lo@ifa0vSBvww*K1u@HP(a#y_6h`t)Ym zZ4bPD6gY0n*|E3WwsX^MdxOb1=w5g3xvgK^*7gGolc3pAw>=N6_skz+@W034dnd8E zri=g_jMNx`5WjW&uOE&*AnK1#LAtoYx%FUw2XFm^6#$nhTs1})Z#(xlwhnDO_b@}t zx$nN9xi+D(J7xFHWY@%=cw>IPjc?5g5$C2qRXk%d^IVS2H+fkuect5Jwa$`F=ksUG zqtmnV$4vW_HE!AFcxL=`#?DM&oB>c1bPp(SSRXUC5TmnZXzN$NhGKl|Gh=PU7#rF* zxC!Lf07FIDhmWa)BVY98hxg`y086yJgE+|V7@X|=zZwZ6Ha+t|>HvHE^ce#H{hcaz zTl?d;*^Lds@{q!hYXs~F=*w{z5aOQUDfqW3_^lND?-cys z6nqRC)TuSfxgT1wm7UrPZLcyc#TqD-|YqQ{=8LF7k+>DH1HWG;2@f!sbfJ z=e07Ac$Bvt&$bIuSmg^b)tmIr7wn)gH+vzbzwL!fJho3&D)mw*>XCig=V93?%oKUG z9<3L{hU1Ofunvk&an8ROoORCU{Tc7VoL{Z>$a%_(R%*hz;+-p{rpQclfrlT?zH<#& zlcEmq0DenJ#9n2g58e>+nYDYdP6CTAPr`(r)0xFPfoI_fe#}5VfjJ7|c)khWKoF!4 zv>%l4uMh-5{!5^Qe*<$A#P@>|{vCoKh#vqYd<*6%dYtV9?&PI&`=`Wp{zHwAIby*J z2cq+b6ddmo)ibK#YMsXwTz%gOiBo^5&a)}}%NqaHxH`rvDf~4BA6Dx8T*1{kZz#B0 z=hqU~>-;{2|A&HO@2EeftQX^;l4RwCaOwlIn(I{&F2E?FWL&0M#4DjC_?lo=ITRtY z7Me|FMfGG+s#mML2DVyVa0|ZWC*oT#*GsjlRwJr6cqG=r2P5(2U=go3mGoSr3EtR( zy;_v4T;G-bA+xq*V_?9(Wr-liFY$*7BrBVTdxySw=TJtIfxQ7E;&|s&8B?3C81($d z!Gct1xcgM z^#R8-sMD7vpw~tHr(9QHf-!af8xr_{h;r2Z@f7yj|2y(xP=4Hhyr<+(``;@!rg|jv pd-8?x+l6^_e~hW`JwPmrWDrMdn6`xf5WW3(Wc?zJ(tYUu{{uL>EuR1Y delta 451 zcmX|*KS;ws6vpq8*xp@I2|`I!q+QfP#agE#4iPCFPIV}_v=k}0v|#-+ii04=AXMJs z2faG?wCRlSaJT5^AGlZSaj!%|CH$=T%H3z~KEBH}A$4r-m4$03eHXy5 zPm%4n#n7+wtk`A>yf+dgp1RTkTuH;0vOm_4x0O-zSXoWPlr1ApphYI2Ml~?hIVh

LFW?}~8G>30s zs7ykE8L&-lWG$i>2>ho?B diff --git a/kernel/src/PageFrameAllocator.cpp b/kernel/src/PageFrameAllocator.cpp index 83adc6c..b30ee5f 100644 --- a/kernel/src/PageFrameAllocator.cpp +++ b/kernel/src/PageFrameAllocator.cpp @@ -31,8 +31,16 @@ void PageFrameAllocator::ReadEFIMemoryMap(EFI_MEMORY_DESCRIPTOR* mMap, size_t mM InitBitmap(bitmapSize, largestFreeMemSeg); - //lock pages of bitmap + // lock pages of bitmap + LockPages(&PageBitmap, PageBitmap.Size / 4096 + 1); + //reserve pages of unsable/reserverd memory + for (int i = 0; i < mMapEntries; i++) { + EFI_MEMORY_DESCRIPTOR* desc = (EFI_MEMORY_DESCRIPTOR*)((uint64_t)mMap + (i * mMapDescSize)); + if (desc->type != 7) { // not efiConventionalMemory + ReservePages(desc->physAddr, desc->numPages); + } + } } void PageFrameAllocator::InitBitmap(size_t bitmapSize, void* bufferAddress){ @@ -41,4 +49,81 @@ void PageFrameAllocator::InitBitmap(size_t bitmapSize, void* bufferAddress){ for (int i = 0; i < bitmapSize; i++){ *(uint8_t*)(PageBitmap.Buffer + i) = 0; } +} + +void PageFrameAllocator::FreePage(void* address) { + uint64_t index = (uint64_t)address / 4096; + if (PageBitmap[index] == false) return; // page is already free + + // free page in bitmap + PageBitmap.Set(index, false); + freeMemory += 4096; + usedMemory -= 4096; +} + +void PageFrameAllocator::FreePages(void* address, uint64_t pageCount) { + for (int t = 0; t < pageCount; t++) { + FreePage((void*)((uint64_t)address + (t * 4096))); + } +} + +void PageFrameAllocator::LockPage(void* address) { + uint64_t index = (uint64_t)address / 4096; + if (PageBitmap[index] == true) return; // page is already locked + + // lock page in bitmap + PageBitmap.Set(index, true); + freeMemory -= 4096; + usedMemory += 4096; +} + +void PageFrameAllocator::LockPages(void* address, uint64_t pageCount) { + for (int t = 0; t < pageCount; t++) { + LockPage((void*)((uint64_t)address + (t * 4096))); + } +} + +void PageFrameAllocator::UnreservePage(void* address) { + uint64_t index = (uint64_t)address / 4096; + if (PageBitmap[index] == false) return; // page is already free + + // free page in bitmap + PageBitmap.Set(index, false); + freeMemory += 4096; + reservedMemory -= 4096; +} + +void PageFrameAllocator::UnreservePages(void* address, uint64_t pageCount) { + for (int t = 0; t < pageCount; t++) { + UnreservePage((void*)((uint64_t)address + (t * 4096))); + } +} + +void PageFrameAllocator::ReservePage(void* address) { + uint64_t index = (uint64_t)address / 4096; + if (PageBitmap[index] == true) return; // page is already locked + + // lock page in bitmap + PageBitmap.Set(index, true); + freeMemory -= 4096; + reservedMemory += 4096; +} + +void PageFrameAllocator::ReservePages(void* address, uint64_t pageCount) { + for (int t = 0; t < pageCount; t++) { + ReservePage((void*)((uint64_t)address + (t * 4096))); + } +} + + +uint64_t PageFrameAllocator::GetFreeRAM() { + return freeMemory; +} + +uint64_t PageFrameAllocator::GetUsedRAM() { + return usedMemory; +} + +uint64_t PageFrameAllocator::GetReservedRAM() { + return reservedMemory; } \ No newline at end of file diff --git a/kernel/src/PageFrameAllocator.h b/kernel/src/PageFrameAllocator.h index 634fe33..67f3da2 100644 --- a/kernel/src/PageFrameAllocator.h +++ b/kernel/src/PageFrameAllocator.h @@ -9,7 +9,18 @@ class PageFrameAllocator { public: void ReadEFIMemoryMap(EFI_MEMORY_DESCRIPTOR* mMap, size_t mMapSize, size_t mMapDescSize); Bitmap PageBitmap; + void FreePage(void* address); + void FreePages(void* address, uint64_t pageCount); + void LockPage(void* address); + void LockPages(void* address, uint64_t pageCount); + uint64_t GetFreeRAM(); + uint64_t GetUsedRAM(); + uint64_t GetReservedRAM(); private: void InitBitmap(size_t bitmapSize, void* bufferAddress); + void ReservePage(void* address); + void ReservePages(void* address, uint64_t pageCount); + void UnreservePage(void* address); + void UnreservePages(void* address, uint64_t pageCount); }; \ No newline at end of file diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp index a1e0c32..6d417de 100644 --- a/kernel/src/kernel.cpp +++ b/kernel/src/kernel.cpp @@ -5,6 +5,7 @@ #include "efiMemory.h" #include "memory.h" #include "Bitmap.h" +#include "PageFrameAllocator.h" struct BootInfo { Framebuffer* framebuffer; @@ -27,6 +28,22 @@ extern "C" void _start(BootInfo* bootInfo) { uint64_t mMapEntries = bootInfo->mMapSize / bootInfo->mMapDescriptorSize; + PageFrameAllocator newAllocator; + newAllocator.ReadEFIMemoryMap(bootInfo->mMap, bootInfo->mMapSize, bootInfo->mMapDescriptorSize); + + newRenderer.Print(0xFFFFFFFF, "Free RAM: "); + newRenderer.Print(0xFF00FFFF, to_string(newAllocator.GetFreeRAM() / 1024)); + newRenderer.Print(0xFF00FFFF, " KB"); + newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; + newRenderer.Print(0xFFFFFFFF, "Used RAM: "); + newRenderer.Print(0xFF00FFFF, to_string(newAllocator.GetUsedRAM() / 1024)); + newRenderer.Print(0xFF00FFFF, " KB"); + newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; + newRenderer.Print(0xFFFFFFFF, "Reserved RAM: "); + newRenderer.Print(0xFF00FFFF, to_string(newAllocator.GetReservedRAM() / 1024)); + newRenderer.Print(0xFF00FFFF, " KB"); + newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; + //newRenderer.Print(0xFFFFFFFF, to_string(GetMemorySize(bootInfo->mMap, mMapEntries, bootInfo ->mMapDescriptorSize)));