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

BIN
Asuro.iso

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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

View File

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

View File

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

View File

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