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;
|
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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user