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.
This commit is contained in:
parent
b18c9384b3
commit
e9fcb66d22
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user