From e9fcb66d22bc72d4a3926e8bbd18505c079e88d5 Mon Sep 17 00:00:00 2001 From: Kieron Morris Date: Wed, 23 Jun 2021 23:57:06 +0100 Subject: [PATCH] Added klalloc for large allocations. Added a klalloc and a klfree (not yet implemented) to lmemorymanager. Added a page_mappable method to vmemorymanager to check if a page is mappable before trying to map, this supports klalloc. --- src/lmemorymanager.pas | 41 +++++++++++++++++++++++++++++++++++++++++ src/vmemorymanager.pas | 17 ++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/lmemorymanager.pas b/src/lmemorymanager.pas index 2cc62539..cc108638 100644 --- a/src/lmemorymanager.pas +++ b/src/lmemorymanager.pas @@ -57,6 +57,8 @@ var procedure init; function kalloc(size : uint32) : void; +function klalloc(size : uint32) : void; +function klfree(size : uint32); //Todo ??? Profit? function kpalloc(address : uint32) : void; procedure kfree(area : void); @@ -129,6 +131,45 @@ begin //pop_trace; end; +function klfree(size : uint32); +begin + //Todo Implement + //Nahhhhhhhhhhhh +end; + +function klalloc(size : uint32) : void; +var + Pages : uint16; + Address : void; + Found : boolean; + CurrPage : uint16; + i : uint16; + Miss : boolean; + +begin + Pages:= (size div 4000000); + Found:= false; + CurrPage:= 4; + Address:= Void(nil); + while not Found do begin + inc(CurrPage); + if CurrPage > 1024 then break; + Miss:= false; + for i:=0 to Pages do begin + if not page_mappable(CurrPage + i) then Miss:= true; + if miss then break; + end; + if not Miss then begin + for i:=0 to Pages do begin + new_page(CurrPage + i); + end; + Address:= Void(CurrPage SHL 22); + break; + end; + end; + klalloc:= Address; +end; + function kalloc(size : uint32) : void; var Heap_Entries : uint32; diff --git a/src/vmemorymanager.pas b/src/vmemorymanager.pas index fbae7ed5..3a1bd7de 100644 --- a/src/vmemorymanager.pas +++ b/src/vmemorymanager.pas @@ -53,6 +53,7 @@ var procedure init; function new_page(page_number : uint16) : boolean; +function page_mappable(page_number : uint16) : boolean; function map_page(page_number : uint16; block : uint16) : boolean; function map_page_ex(page_number : uint16; block : uint16; PD : PPageDirectory) : boolean; function new_page_at_address(address : uint32) : boolean; @@ -202,7 +203,7 @@ begin push_trace('vmemorymanager.new_page'); new_page:= false; if not PageDirectory^[page_number].Present then begin - if not PageDirectory^[page_number].Reserved then begin; + if not PageDirectory^[page_number].Reserved then begin block:= pmemorymanager.new_block(uint32(PageDirectory)); if block < 2 then begin GPF; @@ -214,6 +215,20 @@ begin pop_trace; end; +function page_mappable(page_number : uint16) : boolean; +var + block : uint16; + +begin + push_trace('vmemorymanager.page_mappable'); + page_mappable:= false; + if not PageDirectory^[page_number].Present then begin + if not PageDirectory^[page_number].Reserved then begin + page_mappable:= true; + end; + end; +end; + function new_page_at_address(address : uint32) : boolean; var page_number : uint16;