diff --git a/Asuro.iso b/Asuro.iso index 28eea370..8b06ece9 100644 Binary files a/Asuro.iso and b/Asuro.iso differ diff --git a/lib/kernel.ppu b/lib/kernel.ppu index 264300a6..33c4b565 100644 Binary files a/lib/kernel.ppu and b/lib/kernel.ppu differ diff --git a/lib/libpconsole.a b/lib/libpconsole.a index 5b65e72f..cb2b97d8 100644 Binary files a/lib/libpconsole.a and b/lib/libpconsole.a differ diff --git a/lib/libpmultiboot.a b/lib/libpmultiboot.a index 734bf694..98bbd1a4 100644 Binary files a/lib/libpmultiboot.a and b/lib/libpmultiboot.a differ diff --git a/lib/libpsystem.a b/lib/libpsystem.a index 27b82fc1..7559fd25 100644 Binary files a/lib/libpsystem.a and b/lib/libpsystem.a differ diff --git a/lib/vmemorymanager.ppu b/lib/vmemorymanager.ppu index 7b151585..b1b1bf40 100644 Binary files a/lib/vmemorymanager.ppu and b/lib/vmemorymanager.ppu differ diff --git a/src/kernel.pas b/src/kernel.pas index 8de64c79..a5a1413a 100644 --- a/src/kernel.pas +++ b/src/kernel.pas @@ -54,12 +54,16 @@ begin pmemorymanager.init(); vmemorymanager.init(); - // vmemorymanager.new_page(0); pint:= puint32(0); + console.writestringln('Writing 1234 to Logical Address $00000000'); pint^:= 1234; - if pint^ = 1234 then console.writestringln('Read 1234 back from Logical Address $00000000!!!'); + if pint^ = 1234 then begin + console.writestringln('Read 1234 back from Logical Address $00000000!!!'); + end; + + while true do begin end; //scheduler.init(); diff --git a/src/vmemorymanager.pas b/src/vmemorymanager.pas index 897abb59..1801aa9c 100644 --- a/src/vmemorymanager.pas +++ b/src/vmemorymanager.pas @@ -31,6 +31,7 @@ var procedure init; function new_page(page_number : uint16) : boolean; +function map_page(page_number : uint16; block : uint16) : boolean; function new_page_at_address(address : uint32) : boolean; procedure free_page(page_number : uint16); procedure free_page_at_address(address : uint32); @@ -57,59 +58,62 @@ var begin console.writestringln('VMM: INIT BEGIN.'); PageDirectory:= load_current_page_directory; - PageDirectory^[KERNEL_PAGE_NUMBER + 1].Present:= True; - PageDirectory^[KERNEL_PAGE_NUMBER + 1].PageSize:= True; - PageDirectory^[KERNEL_PAGE_NUMBER + 1].Writable:= True; - PageDirectory^[KERNEL_PAGE_NUMBER + 1].Address:= (1 SHL 22); - - PageDirectory^[KERNEL_PAGE_NUMBER + 2].Present:= True; - PageDirectory^[KERNEL_PAGE_NUMBER + 2].PageSize:= True; - PageDirectory^[KERNEL_PAGE_NUMBER + 2].Writable:= True; - PageDirectory^[KERNEL_PAGE_NUMBER + 2].Address:= (2 SHL 22); + map_page(KERNEL_PAGE_NUMBER + 1, 1); + map_page(KERNEL_PAGE_NUMBER + 2, 2); console.writestringln('VMM: INIT END.'); 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; + PageDirectory^[page_number].PageSize:= true; + PageDirectory^[page_number].Writable:= true; + rldpd:= uint32(PageDirectory) - KERNEL_VIRTUAL_BASE; + asm + mov eax, rldpd + mov CR3, eax + end; + console.writestringln('New Page Added:'); + + console.writestring('- P:'); + console.writehex(page_number); + console.writestring('-->B:'); + console.writehexln(block); + + console.writestring('- P:['); + console.writehex(page_number SHL 22); + console.writestring(' - '); + console.writehex(((page_number+1) SHL 22)); + console.writestring(']-->B:['); + console.writehex(block SHL 22); + console.writestring(' - '); + console.writehex(((block+1) SHL 22)); + console.writestringln(']'); + map_page:= true; +end; + function new_page(page_number : uint16) : boolean; var block : uint16; - page : uint16; - rldpd : uint32; begin new_page:= false; if PageDirectory^[page_number].Present then exit; - //if PageDirectory^[page_number].Reserved then exit; + if PageDirectory^[page_number].Reserved then exit; block:= pmemorymanager.new_block(uint32(PageDirectory)); if block < 2 then begin GPF; exit; end else begin - PageDirectory^[page_number].Present:= true; - PageDirectory^[page_number].Address:= block-1; - PageDirectory^[page_number].PageSize:= true; - PageDirectory^[page_number].Writable:= true; - rldpd:= uint32(PageDirectory) - KERNEL_VIRTUAL_BASE; - asm - mov eax, rldpd - mov CR3, eax - end; - new_page:= true; - console.writestringln('New Page Added:'); - - console.writestring('- P:'); - console.writehex(page_number); - console.writestring('-->B:'); - console.writehexln(block); - - console.writestring('- P:['); - console.writeword(page_number SHL 22); - console.writestring(' - '); - console.writehex(((page_number+1) SHL 22)); - console.writestring(']-->B:['); - console.writehex(block SHL 22); - console.writestring(' - '); - console.writehex(((block+1) SHL 22)); - console.writestringln(']'); + new_page:= map_page(page_number, block); end; end;