Merge branch 'feature/lmemorymanager-refactor' into 'develop'

Added klalloc for large allocations.

See merge request spexeah/asuro!14
This commit is contained in:
Aaron Hance 2021-06-23 23:02:45 +00:00
commit f835cd7f12
2 changed files with 57 additions and 1 deletions

View File

@ -57,6 +57,8 @@ var
procedure init; procedure init;
function kalloc(size : uint32) : void; function kalloc(size : uint32) : void;
function klalloc(size : uint32) : void;
function klfree(size : uint32); //Todo ??? Profit?
function kpalloc(address : uint32) : void; function kpalloc(address : uint32) : void;
procedure kfree(area : void); procedure kfree(area : void);
@ -129,6 +131,45 @@ begin
//pop_trace; //pop_trace;
end; 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; function kalloc(size : uint32) : void;
var var
Heap_Entries : uint32; Heap_Entries : uint32;

View File

@ -53,6 +53,7 @@ var
procedure init; procedure init;
function new_page(page_number : uint16) : boolean; 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(page_number : uint16; block : uint16) : boolean;
function map_page_ex(page_number : uint16; block : uint16; PD : PPageDirectory) : boolean; function map_page_ex(page_number : uint16; block : uint16; PD : PPageDirectory) : boolean;
function new_page_at_address(address : uint32) : boolean; function new_page_at_address(address : uint32) : boolean;
@ -202,7 +203,7 @@ begin
push_trace('vmemorymanager.new_page'); push_trace('vmemorymanager.new_page');
new_page:= false; new_page:= false;
if not PageDirectory^[page_number].Present then begin 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)); block:= pmemorymanager.new_block(uint32(PageDirectory));
if block < 2 then begin if block < 2 then begin
GPF; GPF;
@ -214,6 +215,20 @@ begin
pop_trace; pop_trace;
end; 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; function new_page_at_address(address : uint32) : boolean;
var var
page_number : uint16; page_number : uint16;