dd
git-svn-id: https://spexeah.com:8443/svn/Asuro@170 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
1 parent
08aee483c5
commit
d1e6d28f90
15 files changed
+87
-19
No files matched your search
Binary file not shown.
Binary file not shown.
BIN
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.
@@ -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.
|
||||||
+6
-5
@@ -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.');
|
||||||
|
|||||||
+4
-1
@@ -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));
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
If Active then begin
|
||||||
Tick:= Tick + 1;
|
Tick:= Tick + 1;
|
||||||
If Tick = 0 then context_switch();
|
If Tick = 0 then context_switch();
|
||||||
If (Current_Task^.Delta + (Current_Task^.Priority * Quantum)) <= Tick 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;
|
||||||
|
|||||||
+55
-13
@@ -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;
|
||||||
|
|||||||
Reference in new issue
Block a user