git-svn-id: https://spexeah.com:8443/svn/Asuro@170 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
kieron
2017-05-21 17:19:27 +00:00
parent 08aee483c5
commit d1e6d28f90
15 changed files with 90 additions and 22 deletions

View File

@ -0,0 +1,16 @@
{ ************************************************
* Asuro
* Unit: ContextSwitcher
* Description: Switches context between processes
* when preempted by the scheduler.
************************************************
* Author: K Morris
* Contributors:
************************************************ }
unit contextswitcher;
interface
implementation;
end.

View File

@ -35,6 +35,7 @@ var
gdt_pointer : TGDT_Pointer;
procedure init();
procedure set_gate(Gate_Number : uint32; Base : uint32; Limit : uint32; Access : uint8; Granularity : uint8);
implementation
@ -71,11 +72,11 @@ begin
console.writestringln('GDT: INIT START.');
gdt_pointer.limit := (sizeof(TGDT_Entry) * 5) - 1;
gdt_pointer.base := uint32(@gdt_entries);
set_gate($00, $00, $00, $00, $00);
set_gate($01, $00, $FFFFFFFF, $9A, $CF);
set_gate($02, $00, $FFFFFFFF, $92, $CF);
set_gate($03, $00, $FFFFFFFF, $FA, $CF);
set_gate($04, $00, $FFFFFFFF, $F2, $CF);
set_gate($00, $00, $00, $00, $00); //OFFSET: 0
set_gate($01, $00, $FFFFFFFF, $9A, $CF); //OFFSET: 8
set_gate($02, $00, $FFFFFFFF, $92, $CF); //OFFSET: 16
set_gate($03, $00, $FFFFFFFF, $FA, $CF); //OFFSET: 24
set_gate($04, $00, $FFFFFFFF, $F2, $CF); //OFFSET: 32
console.writestringln('GDT: FLUSH.');
flush_gdt(uint32(@gdt_pointer));
console.writestringln('GDT: INIT END.');

View File

@ -25,6 +25,7 @@ uses
vmemorymanager,
pmemorymanager,
lmemorymanager,
tss,
scheduler,
PCI;
@ -64,9 +65,11 @@ begin
pmemorymanager.init();
vmemorymanager.init();
lmemorymanager.init();
tss.init();
scheduler.init();
while true do begin end;
STI;
isr32.hook(uint32(@bios_data_area.tick_update));

View File

@ -32,6 +32,9 @@ type
end;
PScheduler_Entry = ^TScheduler_Entry;
var
Active : Boolean;
procedure init;
procedure add_task(priority : uint8);
@ -70,9 +73,11 @@ end;
procedure delta(data : void);
begin
Tick:= Tick + 1;
If Tick = 0 then context_switch();
If (Current_Task^.Delta + (Current_Task^.Priority * Quantum)) <= Tick then context_switch();
If Active then begin
Tick:= Tick + 1;
If Tick = 0 then context_switch();
If (Current_Task^.Delta + (Current_Task^.Priority * Quantum)) <= Tick then context_switch();
end;
end;
procedure init;
@ -85,6 +90,7 @@ begin
Root_Task^.Next:= void(Root_Task);
Current_Task:= Root_Task;
Tick:= 0;
Active:= False;
isr32.hook(uint32(@delta));
console.writestringln('SCHEDULER: INIT END.');
end;

View File

@ -36,17 +36,42 @@ type
PPageDirectory = ^TPageDirectory;
var
KERNEL_PAGE_DIRECTORY : PPageDirectory;
PageDirectory : PPageDirectory;
procedure init;
function new_page(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;
procedure free_page(page_number : uint16);
procedure free_page_at_address(address : uint32);
function new_page_directory : uint32;
function new_kernel_mapped_page_directory : uint32;
implementation
uses
lmemorymanager;
function new_page_directory : uint32;
begin
new_page_directory:= uint32(kalloc(sizeof(TPageDirectory)));
end;
function new_kernel_mapped_page_directory : uint32;
var
PD : PPageDirectory;
i : uint32;
begin
PD:= PPageDirectory(new_page_directory);
for i:=KERNEL_PAGE_NUMBER to 1023 do begin
PD^[i]:= KERNEL_PAGE_DIRECTORY^[i];
end;
new_kernel_mapped_page_directory:= uint32(PD);
end;
function load_current_page_directory : PPageDirectory;
var
Directory : uint32;
@ -67,30 +92,26 @@ var
begin
console.writestringln('VMM: INIT BEGIN.');
PageDirectory:= load_current_page_directory;
KERNEL_PAGE_DIRECTORY:= PageDirectory;
map_page(KERNEL_PAGE_NUMBER + 1, 1);
map_page(KERNEL_PAGE_NUMBER + 2, 2);
map_page(KERNEL_PAGE_NUMBER + 3, 3);
console.writestringln('VMM: INIT END.');
end;
function map_page(page_number : uint16; block : uint16) : boolean;
function map_page_ex(page_number : uint16; block : uint16; PD : PPageDirectory) : boolean;
var
addr : ubit20;
page : uint16;
rldpd : uint32;
begin
map_page:= false;
PageDirectory^[page_number].Present:= true;
map_page_ex:= false;
PD^[page_number].Present:= true;
addr:= block;
PageDirectory^[page_number].Address:= addr SHL 10;
PageDirectory^[page_number].PageSize:= true;
PageDirectory^[page_number].Writable:= true;
rldpd:= uint32(PageDirectory) - KERNEL_VIRTUAL_BASE;
asm
mov eax, rldpd
mov CR3, eax
end;
PD^[page_number].Address:= addr SHL 10;
PD^[page_number].PageSize:= true;
PD^[page_number].Writable:= true;
console.writestringln('VMM: New Page Added:');
console.writestring('VMM: - P:');
@ -107,7 +128,28 @@ begin
console.writestring(' - ');
console.writehex(((block+1) SHL 22));
console.writestringln(']');
map_page:= true;
map_page_ex:= true;
end;
function map_page(page_number : uint16; block : uint16) : boolean;
var
addr : ubit20;
page : uint16;
rldpd : uint32;
begin
map_page:= false;
PageDirectory^[page_number].Present:= true;
addr:= block;
PageDirectory^[page_number].Address:= addr SHL 10;
PageDirectory^[page_number].PageSize:= true;
PageDirectory^[page_number].Writable:= true;
map_page:= map_page_ex(page_number, block, PageDirectory);
rldpd:= uint32(PageDirectory) - KERNEL_VIRTUAL_BASE;
asm
mov eax, rldpd
mov CR3, eax
end;
end;
function new_page(page_number : uint16) : boolean;